Google Maps: Wie erhält man Land, Bundesland / Provinz / Region, Stadt mit einem Lat / Long-Wert?

107

Ich benötige eine Liste von Ländern, Bundesstaaten und Städten, die auf einer Sammlung von Lat / Long-Werten basiert, die ich habe. Ich muss diese Informationen so speichern, dass die Hierarchie erhalten bleibt und keine Duplikate vorhanden sind (z. B. "USA" und "USA" und "Vereinigte Staaten von Amerika" sind dasselbe Land; ich möchte nur eine Instanz dieses Landes in meiner Datenbank haben). .

Ist dies mit der Google Map API möglich?

StackOverflowNewbie
quelle
Hast du Provinz bekommen?
Deepak Dholiyan

Antworten:

135

Was Sie suchen, wird als umgekehrte Geokodierung bezeichnet . Google bietet über die Google Geocoding-API einen serverseitigen Reverse- Geocodierungsdienst an , den Sie für Ihr Projekt verwenden sollten.

So würde eine Antwort auf die folgende Anfrage aussehen:

http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=false

Antwort:

{
  "status": "OK",
  "results": [ {
    "types": [ "street_address" ],
    "formatted_address": "275-291 Bedford Ave, Brooklyn, NY 11211, USA",
    "address_components": [ {
      "long_name": "275-291",
      "short_name": "275-291",
      "types": [ "street_number" ]
    }, {
      "long_name": "Bedford Ave",
      "short_name": "Bedford Ave",
      "types": [ "route" ]
    }, {
      "long_name": "New York",
      "short_name": "New York",
      "types": [ "locality", "political" ]
    }, {
      "long_name": "Brooklyn",
      "short_name": "Brooklyn",
      "types": [ "administrative_area_level_3", "political" ]
    }, {
      "long_name": "Kings",
      "short_name": "Kings",
      "types": [ "administrative_area_level_2", "political" ]
    }, {
      "long_name": "New York",
      "short_name": "NY",
      "types": [ "administrative_area_level_1", "political" ]
    }, {
      "long_name": "United States",
      "short_name": "US",
      "types": [ "country", "political" ]
    }, {
      "long_name": "11211",
      "short_name": "11211",
      "types": [ "postal_code" ]
    } ],
    "geometry": {
      "location": {
        "lat": 40.7142298,
        "lng": -73.9614669
      },
      "location_type": "RANGE_INTERPOLATED",
      "viewport": {
        "southwest": {
          "lat": 40.7110822,
          "lng": -73.9646145
        },
        "northeast": {
          "lat": 40.7173774,
          "lng": -73.9583193
        }
      }
    }
  },

  ... Additional results[] ...

Sie können sich auch dafür entscheiden, die Antwort in XML anstelle von JSON zu erhalten, indem Sie einfach XML in der Anforderungs-URI durch JSON ersetzen:

http://maps.googleapis.com/maps/api/geocode/xml?latlng=40.714224,-73.961452&sensor=false

Soweit ich weiß, wird Google denselben Namen auch für Adresskomponenten zurückgeben, insbesondere für übergeordnete Namen wie Ländernamen und Städtenamen. Beachten Sie jedoch, dass die Ergebnisse für die meisten Anwendungen zwar sehr genau sind, Sie jedoch gelegentlich Rechtschreibfehler oder mehrdeutige Ergebnisse feststellen können.

Daniel Vassallo
quelle
Vielen Dank! Diese Sammlung von Lat / Long, die ich habe, ist tatsächlich mit Benutzerprofilen in meiner Datenbank verknüpft. Wissen Sie, wie ich eine Suchfunktion implementieren kann, mit der Benutzer andere Benutzer an einem bestimmten Ort finden können (z. B. alle Benutzer in Brooklyn, NY)? Denken Sie daran, alles was ich habe sind Lat / Long.
StackOverflowNewbie
1
@StackOverflowNewbie: Möglicherweise möchten Sie alle Ihre Lat / Longs geocodieren und die Felder "Stadt", "Bundesland", "Land" in Ihrer Datenbank ausfüllen. Führen Sie dann einfach einen Filter für diese Felder in Ihrer Datenbank durch.
Daniel Vassallo
1
Oder Sie können einen räumlichen Datentyp wie Geografie verwenden, wenn Sie gegen MS Sql 2008 klagen und einen Standort in der Nähe eines Punktes
suchen müssen
1
Wie können Sie sich über die Indexnummer von Stadt und Land in der Antwort sicher sein? Es ändert sich ständig, z. B. wenn ein Bereich einen Unterbereich hat, ändern sich die Indexschlüssel
Khan Shahrukh
4
was macht sensor=falsedas
CENT1PEDE
21

Hier haben Sie eine grundlegende Antwort: Ermitteln Sie den Namen der Stadt mithilfe der Geolokalisierung

Aber für das, was Sie suchen, würde ich diesen Weg empfehlen.

Nur wenn Sie auch administrative_area_level_1 benötigen, um verschiedene Dinge für Paris, Texas, USA und Paris, Ile-de-France, Frankreich zu speichern und einen manuellen Fallback bereitzustellen:

- -

Es gibt ein Problem in Michals Art, dass es das erste Ergebnis gibt, kein bestimmtes. Er verwendet Ergebnisse [0]. Ich halte es für richtig (ich habe gerade seinen Code geändert), NUR das Ergebnis zu nehmen, dessen Typ "Lokalität" ist, das immer vorhanden ist, selbst in einem eventuellen manuellen Fallback, falls der Browser die Geolokalisierung nicht unterstützt.

Sein Weg: Abgerufene Ergebnisse unterscheiden sich von der Verwendung von http://maps.googleapis.com/maps/api/geocode/json?address=bucharest&sensor=false von der Verwendung von http://maps.googleapis.com/maps/api/geocode /json?latlng=44.42514,26.10540&sensor=false (Suche nach Namen / Suche nach lat & lng)

Auf diese Weise: gleiche abgerufene Ergebnisse.

<!DOCTYPE html> 
<html> 
<head> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"/> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
<title>Reverse Geocoding</title> 

<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script> 
<script type="text/javascript"> 
  var geocoder;

  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(successFunction, errorFunction);
} 
//Get the latitude and the longitude;
function successFunction(position) {
    var lat = position.coords.latitude;
    var lng = position.coords.longitude;
    codeLatLng(lat, lng)
}

function errorFunction(){
    alert("Geocoder failed");
}

  function initialize() {
    geocoder = new google.maps.Geocoder();



  }

  function codeLatLng(lat, lng) {

    var latlng = new google.maps.LatLng(lat, lng);
    geocoder.geocode({'latLng': latlng}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
      //console.log(results);
        if (results[1]) {
        var indice=0;
        for (var j=0; j<results.length; j++)
        {
            if (results[j].types[0]=='locality')
                {
                    indice=j;
                    break;
                }
            }
        alert('The good number is: '+j);
        console.log(results[j]);
        for (var i=0; i<results[j].address_components.length; i++)
            {
                if (results[j].address_components[i].types[0] == "locality") {
                        //this is the object you are looking for City
                        city = results[j].address_components[i];
                    }
                if (results[j].address_components[i].types[0] == "administrative_area_level_1") {
                        //this is the object you are looking for State
                        region = results[j].address_components[i];
                    }
                if (results[j].address_components[i].types[0] == "country") {
                        //this is the object you are looking for
                        country = results[j].address_components[i];
                    }
            }

            //city data
            alert(city.long_name + " || " + region.long_name + " || " + country.short_name)


            } else {
              alert("No results found");
            }
        //}
      } else {
        alert("Geocoder failed due to: " + status);
      }
    });
  }
</script> 
</head> 
<body onload="initialize()"> 

</body> 
</html> 
Tabacitu
quelle
Das rettet meinen Tag
Andi AR
4

Ich habe diese Frage als Ausgangspunkt für meine eigene Lösung verwendet. Ich fand es angemessen, meinen Code zurückzugeben, da er kleiner als der von Tabacitu ist

Abhängigkeiten:

Code:

if(geoPosition.init()){  

    var foundLocation = function(city, state, country, lat, lon){
        //do stuff with your location! any of the first 3 args may be null
        console.log(arguments);
    }

    var geocoder = new google.maps.Geocoder(); 
    geoPosition.getCurrentPosition(function(r){
        var findResult = function(results, name){
            var result =  _.find(results, function(obj){
                return obj.types[0] == name && obj.types[1] == "political";
            });
            return result ? result.short_name : null;
        };
        geocoder.geocode({'latLng': new google.maps.LatLng(r.coords.latitude, r.coords.longitude)}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK && results.length) {
                results = results[0].address_components;
                var city = findResult(results, "locality");
                var state = findResult(results, "administrative_area_level_1");
                var country = findResult(results, "country");
                foundLocation(city, state, country, r.coords.latitude, r.coords.longitude);
            } else {
                foundLocation(null, null, null, r.coords.latitude, r.coords.longitude);
            }
        });
    }, { enableHighAccuracy:false, maximumAge: 1000 * 60 * 1 });
}
mkoryak
quelle
3

Ich fand das GeoCoder-Javascript ein wenig fehlerhaft, als ich es in meine JSP-Dateien aufnahm.

Sie können dies auch versuchen:



    var lat = "43.7667855" ;
    var long = "-79.2157321" ;
    var url = "https://maps.googleapis.com/maps/api/geocode/json?latlng="
       +lat+","+long+"&sensor=false";
    $.get(url).success(function(data) {
       var loc1 = data.results[0];
       var county, city;
         $.each(loc1, function(k1,v1) {
            if (k1 == "address_components") {
               for (var i = 0; i < v1.length; i++) {
                  for (k2 in v1[i]) {
                     if (k2 == "types") {
                        var types = v1[i][k2];
                        if (types[0] =="sublocality_level_1") {
                            county = v1[i].long_name;
                            //alert ("county: " + county);
                        } 
                        if (types[0] =="locality") {
                           city = v1[i].long_name;
                           //alert ("city: " + city);
                       } 
                     }

                  }          

               }

            }

         });
         $('#city').html(city); 
    }); 

YP Leung
quelle
Ein kleines Update, ändern Sie $.get(url).success(function(data)zu $.get(url, function(data)und es funktioniert gut
Precious Tom
3

Ich habe diese Funktion geschrieben, die basierend auf der address_componentsvon der gmaps-API zurückgegebenen Funktion extrahiert, wonach Sie suchen . Dies ist die Stadt (zum Beispiel).

export const getAddressCity = (address, length) => {
  const findType = type => type.types[0] === "locality"
  const location = address.map(obj => obj)
  const rr = location.filter(findType)[0]

  return (
    length === 'short'
      ? rr.short_name
      : rr.long_name
  )
}

Wechsel localityzu administrative_area_level_1für den Staat etc.

In meinem js-Code verwende ich wie folgt:

const location =`${getAddressCity(address_components, 'short')}, ${getAddressState(address_components, 'short')}`

Wird zurückkehren: Waltham, MA

sburke0708
quelle
0

Probieren Sie einfach diesen Code aus. Dieser Code funktioniert mit mir

var posOptions = {timeout: 10000, enableHighAccuracy: false};
$cordovaGeolocation.getCurrentPosition(posOptions).then(function (position) {
var lat = position.coords.latitude;
var long = position.coords.longitude;
 //console.log(lat +"          "+long);
$http.get('https://maps.googleapis.com/maps/api/geocode/json?latlng=' + lat + ',' + long + '&key=your key here').success(function (output) {
//console.log( JSON.stringify(output.results[0]));
//console.log( JSON.stringify(output.results[0].address_components[4].short_name));
var results = output.results;
if (results[0]) {
//console.log("results.length= "+results.length);
//console.log("hi "+JSON.stringify(results[0],null,4));
for (var j = 0; j < results.length; j++){
 //console.log("j= "+j);
//console.log(JSON.stringify(results[j],null,4));
for (var i = 0; i < results[j].address_components.length; i++){
 if(results[j].address_components[i].types[0] == "country") {
 //this is the object you are looking for
  country = results[j].address_components[i];
 }
 }
 }
 console.log(country.long_name);
 console.log(country.short_name);
 } else {
 alert("No results found");
 console.log("No results found");
 }
 });
 }, function (err) {
 });
HMahmoud
quelle
0

Ich habe eine kleine Mapper-Funktion erstellt:

private getAddressParts(object): Object {
    let address = {};
    const address_components = object.address_components;
    address_components.forEach(element => {
        address[element.types[0]] = element.short_name;
    });
    return address;
}

Es ist eine Lösung für Angular 4, aber ich denke, Sie werden auf die Idee kommen.

Verwendung:

geocoder.geocode({ 'location' : latlng }, (results, status) => {
    if (status === google.maps.GeocoderStatus.OK) {
        const address = {
            formatted_address: results[0].formatted_address,
            address_parts: this.getAddressParts(results[0])
        };
        (....)
    }

Auf diese Weise wird das addressObjekt ungefähr so ​​aussehen:

address: {
    address_parts: {
        administrative_area_level_1: "NY",
        administrative_area_level_2: "New York County",
        country: "US",
        locality: "New York",
        neighborhood: "Lower Manhattan",
        political: "Manhattan",
        postal_code: "10038",
        route: "Beekman St",
        street_number: "90",
    },
    formatted_address: "90 Beekman St, New York, NY 10038, USA"
}

Ich hoffe es hilft!

Szkíta
quelle
0
 <div id="location"></div>
        <script>
            window.onload = function () {
                var startPos;
                var geoOptions = {
                    maximumAge: 5 * 60 * 1000,
                    timeout: 10 * 1000,
                    enableHighAccuracy: true
                }


                var geoSuccess = function (position) {
                    startPos = position;
                    geocodeLatLng(startPos.coords.latitude, startPos.coords.longitude);

                };
                var geoError = function (error) {
                    console.log('Error occurred. Error code: ' + error.code);
                    // error.code can be:
                    //   0: unknown error
                    //   1: permission denied
                    //   2: position unavailable (error response from location provider)
                    //   3: timed out
                };

                navigator.geolocation.getCurrentPosition(geoSuccess, geoError, geoOptions);
            };
            function geocodeLatLng(lat, lng) {
                var geocoder = new google.maps.Geocoder;
                var latlng = {lat: parseFloat(lat), lng: parseFloat(lng)};
                geocoder.geocode({'location': latlng}, function (results, status) {
                    if (status === 'OK') {
                        console.log(results)
                        if (results[0]) {
                            document.getElementById('location').innerHTML = results[0].formatted_address;
                            var street = "";
                            var city = "";
                            var state = "";
                            var country = "";
                            var zipcode = "";
                            for (var i = 0; i < results.length; i++) {
                                if (results[i].types[0] === "locality") {
                                    city = results[i].address_components[0].long_name;
                                    state = results[i].address_components[2].long_name;

                                }
                                if (results[i].types[0] === "postal_code" && zipcode == "") {
                                    zipcode = results[i].address_components[0].long_name;

                                }
                                if (results[i].types[0] === "country") {
                                    country = results[i].address_components[0].long_name;

                                }
                                if (results[i].types[0] === "route" && street == "") {

                                    for (var j = 0; j < 4; j++) {
                                        if (j == 0) {
                                            street = results[i].address_components[j].long_name;
                                        } else {
                                            street += ", " + results[i].address_components[j].long_name;
                                        }
                                    }

                                }
                                if (results[i].types[0] === "street_address") {
                                    for (var j = 0; j < 4; j++) {
                                        if (j == 0) {
                                            street = results[i].address_components[j].long_name;
                                        } else {
                                            street += ", " + results[i].address_components[j].long_name;
                                        }
                                    }

                                }
                            }
                            if (zipcode == "") {
                                if (typeof results[0].address_components[8] !== 'undefined') {
                                    zipcode = results[0].address_components[8].long_name;
                                }
                            }
                            if (country == "") {
                                if (typeof results[0].address_components[7] !== 'undefined') {
                                    country = results[0].address_components[7].long_name;
                                }
                            }
                            if (state == "") {
                                if (typeof results[0].address_components[6] !== 'undefined') {
                                    state = results[0].address_components[6].long_name;
                                }
                            }
                            if (city == "") {
                                if (typeof results[0].address_components[5] !== 'undefined') {
                                    city = results[0].address_components[5].long_name;
                                }
                            }

                            var address = {
                                "street": street,
                                "city": city,
                                "state": state,
                                "country": country,
                                "zipcode": zipcode,
                            };

                            document.getElementById('location').innerHTML = document.getElementById('location').innerHTML + "<br/>Street : " + address.street + "<br/>City : " + address.city + "<br/>State : " + address.state + "<br/>Country : " + address.country + "<br/>zipcode : " + address.zipcode;
                            console.log(address);
                        } else {
                            window.alert('No results found');
                        }
                    } else {
                        window.alert('Geocoder failed due to: ' + status);
                    }
                });
            }
        </script>

        <script async defer
                src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY">
        </script>
Deepak Kr
quelle
0

@ Szkíta Hatte eine großartige Lösung, indem eine Funktion erstellt wurde, die die Adressenteile in einem benannten Array abruft. Hier ist eine kompilierte Lösung für diejenigen, die einfaches JavaScript verwenden möchten.

Funktion zum Konvertieren von Ergebnissen in das benannte Array:

function getAddressParts(obj) {

    var address = [];

    obj.address_components.forEach( function(el) {
        address[el.types[0]] = el.short_name;
    });

    return address;

} //getAddressParts()

Geocodieren Sie die LAT / LNG-Werte:

geocoder.geocode( { 'location' : latlng }, function(results, status) {

    if (status == google.maps.GeocoderStatus.OK) {
        var addressParts =  getAddressParts(results[0]);

        // the city
        var city = addressParts.locality;

        // the state
        var state = addressParts.administrative_area_level_1;
    }

});
Marc
quelle