Details adresse à partir de Coordonnée = intégration script avec "geocode"

Bonjour, Bonjour !

est-ce possible ( toujours via un script afin de limiter la base de donnée existante sur mon Sheets ) je peux décortiquer une adresse et avoir plus de renseignement sur celle-ci ?

Par exemple mon script génère cette adresse : 19311 Keystone St, Detroit, MI 48234

je suis capable de sortir ceci sans problème car c'est un travail de séparation :

image

mais l'idée c'est d'aller plus loin et d'obtenir ceci :

image

( si besoins j'ai la possibilité d'avoir les coordonnées aux lieu de l'adresse )

merci et bonne journée !

Bonjour !

j'avais un peu mis de coté ce sujet pour le moment, mais j'y reviens et j'avance !

voici ce que j'ai pu trouver dans un premier temps pour travailler à partir des coordonnées ( que je peux obtenir dans mes data )

function Adresse() {

var response = Maps.newGeocoder().reverseGeocode(42.436141, -83.051769);
for (var i = 0; i < response.results.length; i++) {
  var result = response.results[i];

  Logger.log(result.formatted_address);
}
}
image

Ce qui m'intéresse la dedans :

Farwell ( le quartier )
Wayne ( le comté )

Detroit (ville )
Michigan ( état )

et United States

Je peux l'obtenir comme ceci mais 1 par 1...

var result = response.results[i];

par

var result = response.results[5] pour pouvoir cibler " Farwell "
var result = response.results[7] pour pouvoir cibler " Detroit "
var result = response.results[8] pour pouvoir cibler " Wayne County "
var result = response.results[9] pour pouvoir cibler " Michigan "
var result = response.results[10] pour pouvoir cibler " United States "

( je n'obtiens pas tout de suite ces données, mais c'est un debut, il faudra que je tronque le resultat je pense....)

le but étant de l'intégrer dans ce script :

function api() {

  var urlAPI = "https://api.realt.community/v1/token";
  var classeurAPI = SpreadsheetApp.getActiveSpreadsheet();
  var feuilleAPI = classeurAPI.getSheetByName('Data');
  var cellAPI = feuilleAPI.getRange('A2:N');
  var cellFormatAPI =feuilleAPI.getRange('M2:N');

  var response = UrlFetchApp.fetch(urlAPI, {
    "method": "GET",
    "headers": {
      "accept":"<*/*>",
      "X-AUTH-REALT-TOKEN": "Ma clé API",
      "Content-Type": "application/json"
    }
  });

  cellAPI.clearContent();

  var output = [];
  var json = response.getContentText();
  var Data = JSON.parse(json);
  for (let i in Data) {

    var shortName = Data[i].shortName
    var fullname = Data[i].fullName

    var marketplaceLink = Data[i].marketplaceLink

    var lat = Data[i].coordinate.lat
    var lng = Data[i].coordinate.lng

    var propertyType = Data[i].propertyType
    var property = propertyType.toString().replace(/1/ig,'Single-Family').replace(/2/ig,'Multi-Family').replace(/3/ig,'Duplex').replace(/4/ig,'Triplex').replace(/5/ig,'Apartment').replace(/6/ig,'Mixed-Use')
    var squareFeet = Data[i].squareFeet
    var lotSize = Data[i].lotSize
    var bedroomBath = Data[i].bedroomBath
    var hasTenants = Data[i].hasTenants
    var rentedUnits = Data[i].rentedUnits
    var totalUnits = Data[i].totalUnits

    var lastUpdate = Data[i].lastUpdate.date

    var FreeUnits  = totalUnits - rentedUnits

    try{var rentStartDate = Data[i].rentStartDate.date}catch(e){var rentStartDate = ''} 

  output.push(['=hyperlink("' + marketplaceLink + '","'+ shortName + '")', fullname, squareFeet, lotSize, bedroomBath, hasTenants, rentedUnits, totalUnits, FreeUnits, property, lat, lng, rentStartDate, lastUpdate]);  

  }
  if (output.length > 0) {
    feuilleAPI.getRange(2, 1, output.length, output[0].length).setValues(output).sort({column: 4, ascending: false});
  }
  cellFormatAPI.setNumberFormat("dd.mm.yyyy");
}

et créer cette intégration :

image

J'ai d'abord tenter une intégration comme ceci ( on sait jamais ! )

[...]

    var lat = Data[i].coordinate.lat
    var lng = Data[i].coordinate.lng

    var response = Maps.newGeocoder().reverseGeocode(lat,lng);
    var result = response.results[6].formatted_address;

  output.push(['=hyperlink("' + marketplaceLink + '","'+ shortName + '")', fullname, squareFeet, lotSize, bedroomBath, hasTenants, rentedUnits, totalUnits, FreeUnits, property, lat, lng, rentStartDate, lastUpdate, result]);  

[...]

Puis comme ceci :

[...]

    var lat = Data[i].coordinate.lat
    var lng = Data[i].coordinate.lng

    var result = reverse_geocode(lat,lng)

  output.push(['=hyperlink("' + marketplaceLink + '","'+ shortName + '")', fullname, squareFeet, lotSize, bedroomBath, hasTenants, rentedUnits, totalUnits, FreeUnits, property, lat, lng, rentStartDate, lastUpdate, result]);  

  }
  if (output.length > 0) {
    feuilleAPI.getRange(2, 1, output.length, output[0].length).setValues(output).sort({column: 4, ascending: false});
  }
  cellFormatAPI.setNumberFormat("dd.mm.yyyy");
}

function reverse_geocode(lat,lng) {
  var response = Maps.newGeocoder().reverseGeocode(lat,lng);
  for (var i = 0; i < response.results.length; i++) {
    var result = response.results[6];
    return result.formatted_address;
  }
}

mais sans succès

pour alimenter ce sujet qui ne trouve pas beaucoup de réponse ( et me faire un pense bête ) j'ai trouvé ce script que je vais essayer de décortiquer plus tard.

j'ai juste testé sans encore regarder son contenu dans le détails !

bon week-end !

function getGeocodingRegion() {
  return PropertiesService.getDocumentProperties().getProperty('GEOCODING_REGION') || 'us';
}

/*
function setGeocodingRegion(region) {
  PropertiesService.getDocumentProperties().setProperty('GEOCODING_REGION', region);
  updateMenu();
}
function promptForGeocodingRegion() {
  var ui = SpreadsheetApp.getUi();
  var result = ui.prompt(
    'Set the Geocoding Country Code (currently: ' + getGeocodingRegion() + ')',
    'Enter the 2-letter country code (ccTLD) that you would like ' +
    'the Google geocoder to search first for results. ' +
    'For example: Use \'uk\' for the United Kingdom, \'us\' for the United States, etc. ' +
    'For more country codes, see: https://en.wikipedia.org/wiki/Country_code_top-level_domain',
    ui.ButtonSet.OK_CANCEL
  );
  // Process the user's response.
  if (result.getSelectedButton() == ui.Button.OK) {
    setGeocodingRegion(result.getResponseText());
  }
}
*/

function addressToPosition() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var cells = sheet.getActiveRange();

  // Must have selected 3 columns (Address, Lat, Lng).
  // Must have selected at least 1 row.

  if (cells.getNumColumns() != 3) {
    Logger.log("Must select at least 3 columns: Address, Lat, Lng columns.");
    return;
  }

  var addressColumn = 1;
  var addressRow;

  var latColumn = addressColumn + 1;
  var lngColumn = addressColumn + 2;

  var geocoder = Maps.newGeocoder().setRegion(getGeocodingRegion());
  var location;

  for (addressRow = 1; addressRow <= cells.getNumRows(); ++addressRow) {
    var address = cells.getCell(addressRow, addressColumn).getValue();

    // Geocode the address and plug the lat, lng pair into the 
    // 2nd and 3rd elements of the current range row.
    location = geocoder.geocode(address);

    // Only change cells if geocoder seems to have gotten a 
    // valid response.
    if (location.status == 'OK') {
      lat = location["results"][0]["geometry"]["location"]["lat"];
      lng = location["results"][0]["geometry"]["location"]["lng"];

      cells.getCell(addressRow, latColumn).setValue(lat);
      cells.getCell(addressRow, lngColumn).setValue(lng);
    }
  }
};

function positionToAddress() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var cells = sheet.getActiveRange();

  // Must have selected 3 columns (Address, Lat, Lng).
  // Must have selected at least 1 row.

  if (cells.getNumColumns() != 3) {
    Logger.log("Must select at least 3 columns: Address, Lat, Lng columns.");
    return;
  }

  var addressColumn = 1;
  var addressRow;

  var latColumn = addressColumn + 1;
  var lngColumn = addressColumn + 2;

  var geocoder = Maps.newGeocoder().setRegion(getGeocodingRegion());
  var location;

  for (addressRow = 1; addressRow <= cells.getNumRows(); ++addressRow) {
    var lat = cells.getCell(addressRow, latColumn).getValue();
    var lng = cells.getCell(addressRow, lngColumn).getValue();

    // Geocode the lat, lng pair to an address.
    location = geocoder.reverseGeocode(lat, lng);

    // Only change cells if geocoder seems to have gotten a 
    // valid response.
    Logger.log(location.status);
    if (location.status == 'OK') {
      var address = location["results"][0]["formatted_address"];

      cells.getCell(addressRow, addressColumn).setValue(address);
    }
  }  
};

function generateMenu() {
  // var setGeocodingRegionMenuItem = 'Set Geocoding Region (Currently: ' + getGeocodingRegion() + ')';

  // {
  //   name: setGeocodingRegionMenuItem,
  //   functionName: "promptForGeocodingRegion"
  // },

  var entries = [{
    name: "Geocode Selected Cells (Address to   Lat, Long)",
    functionName: "addressToPosition"
  },
  {
    name: "Geocode Selected Cells (Address from Lat, Long)",
    functionName: "positionToAddress"
  }];

  return entries;
}

function updateMenu() {
  SpreadsheetApp.getActiveSpreadsheet().updateMenu('Geocode', generateMenu())
}

/**
 * Adds a custom menu to the active spreadsheet, containing a single menu item
 * for invoking the readRows() function specified above.
 * The onOpen() function, when defined, is automatically invoked whenever the
 * spreadsheet is opened.
 *
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function onOpen() {
  SpreadsheetApp.getActiveSpreadsheet().addMenu('Geocode', generateMenu());
  // SpreadsheetApp.getActiveSpreadsheet().addMenu('Region',  generateRegionMenu());
  // SpreadsheetApp.getUi()
  //   .createMenu();
};

... et cela me fait de la lecture.

J'étais très actif sur le sujet (en php/javascript/html) il y a quelques années, j'ai abandonné quand google a fait payer ses services.

bonjour

je vais me concentrer sur cette partie pour mon adaptation, le reste ne m'intéresse pas mais je sens que la sélection exact va être compliqué pour toutes les adresses…

pour le moment j'ai juste adapter pour ne plus avoir à sélectionner manuellement les plages.

il va falloir que je fasse plusieurs colonnes pour obtenir les différents critères ensuite.

image
function positionToAddress() {
  var classeur = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = classeur.getSheetByName('test');
  var cells = feuille.getRange('A:C');

  var addressColumn = 1;
  var addressRow;

  var latColumn = addressColumn + 1;
  var lngColumn = addressColumn + 2;

  var geocoder = Maps.newGeocoder().setRegion(getGeocodingRegion());
  var location;

  for (addressRow = 1; addressRow <= cells.getNumRows(); ++addressRow) {
    var lat = cells.getCell(addressRow, latColumn).getValue();
    var lng = cells.getCell(addressRow, lngColumn).getValue();

    // Geocode the lat, lng pair to an address.
    location = geocoder.reverseGeocode(lat, lng);

    // Only change cells if geocoder seems to have gotten a 
    // valid response.
    Logger.log(location.status);
    if (location.status == 'OK') {
      var address = location["results"][9]["formatted_address"];

      cells.getCell(addressRow, addressColumn).setValue(address);
    }
  }  
};

Petite experience ( comme d'habitude, ça m'aide à comprendre ) et petite interrogation !

je ne comprend pas pourquoi les premières coordonnées sont traitées plusieurs fois et les dernières non traitées carrement

comme dis au dessus aussi, je constate des divergences dans les résultats pour Patton, Apolline, et Schaefer

image
function getGeocodingRegion() {
  return PropertiesService.getDocumentProperties().getProperty('GEOCODING_REGION') || 'us';
}

function positionToAddress() {
  var classeur = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = classeur.getSheetByName('test');
  var cells = feuille.getRange('A1:G');

  var latColumn = 1
  var lngColumn = latColumn + 1;
  var addressColumn = latColumn + 2;
  var addressRow;
  var geocoder = Maps.newGeocoder().setRegion(getGeocodingRegion());
  var location;
  var output = [];

  for (addressRow = 1; addressRow <= cells.getNumRows(); ++addressRow) {
    var lat = cells.getCell(addressRow, latColumn).getValue();
    var lng = cells.getCell(addressRow, lngColumn).getValue();

    // Geocode the lat, lng pair to an address.
    location = geocoder.reverseGeocode(lat, lng);

    // Only change cells if geocoder seems to have gotten a 
    // valid response.
    Logger.log(location.status);
    if (location.status == 'OK') {

      var Quartier = location["results"][4]["formatted_address"];
      var Ville = location["results"][6]["formatted_address"];
      var Comté = location["results"][7]["formatted_address"];
      var Etat = location["results"][8]["formatted_address"];
      var Pays = location["results"][9]["formatted_address"];

      output.push([Pays, Etat, Comté, Ville, Quartier])
    }
    if (output.length > 0) {

      feuille.getRange(addressRow, addressColumn, output.length, output[0].length).setValues(output)
    }
  }  
};
Rechercher des sujets similaires à "details adresse partir coordonnee integration script geocode"