it-swarm.com.de

Der Geocoder von Google gibt ein falsches Land zurück und ignoriert den Regionshinweis

Ich benutze den Geocoder von Google, um für eine gegebene Adresse die Längenkoordinaten zu finden.

    var geocoder = new google.maps.Geocoder();
    geocoder.geocode(
    {
        'address':  address,
        'region':   'uk'
    }, function(results, status) {
        if(status == google.maps.GeocoderStatus.OK) {
            lat: results[0].geometry.location.lat(),
            lng: results[0].geometry.location.lng()
    });

Die Variable address wird aus einem Eingabefeld übernommen.

Ich möchte Standorte suchen nur in Großbritannien . Ich dachte, dass die Angabe von 'region': 'uk' genug sein sollte, aber es ist nicht so. Wenn ich "Boston" eingebe, habe ich Boston in den USA gefunden und ich wollte das in Großbritannien.

Wie kann man Geocoder so einschränken, dass Standorte nur aus einem Land oder möglicherweise aus einem bestimmten Bereich zurückgegeben werden?

Vielen Dank

30
6bytes

UPDATE: Diese Antwort ist möglicherweise nicht mehr die beste Lösung. Weitere Informationen finden Sie in den Kommentaren unter der Antwort.


Zusätzlich zu dem, was Pekka bereits vorgeschlagen hat , möchten Sie vielleicht ', UK' mit Ihrer address verketten, wie im folgenden Beispiel:

<!DOCTYPE html>
<html> 
<head> 
   <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
   <title>Google Maps Geocoding only in UK Demo</title> 
   <script src="http://maps.google.com/maps/api/js?sensor=false" 
           type="text/javascript"></script> 
</head> 
<body> 
   <div id="map" style="width: 400px; height: 300px"></div> 

   <script type="text/javascript"> 

   var mapOptions = { 
      mapTypeId: google.maps.MapTypeId.TERRAIN,
      center: new google.maps.LatLng(54.00, -3.00),
      zoom: 5
   };

   var map = new google.maps.Map(document.getElementById("map"), mapOptions);
   var geocoder = new google.maps.Geocoder();

   var address = 'Boston';

   geocoder.geocode({
      'address': address + ', UK'
   }, 
   function(results, status) {
      if(status == google.maps.GeocoderStatus.OK) {
         new google.maps.Marker({
            position:results[0].geometry.location,
            map: map
         });
      }
   });

   </script> 
</body> 
</html>

Bildschirmfoto:

Geocoding only in UK

Ich finde das sehr zuverlässig. Das folgende Beispiel zeigt hingegen, dass weder der Parameter region noch der Parameter bounds in diesem Fall eine Wirkung haben:

<!DOCTYPE html>
<html> 
<head> 
   <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
   <title>Google Maps Geocoding only in UK Demo with Bounds</title> 
   <script src="http://maps.google.com/maps/api/js?sensor=false" 
           type="text/javascript"></script> 
</head> 
<body> 
   <div id="map" style="width: 500px; height: 300px"></div> 

   <script type="text/javascript"> 

   var mapOptions = { 
      mapTypeId: google.maps.MapTypeId.TERRAIN,
      center: new google.maps.LatLng(50.00, -33.00),
      zoom: 3
   };

   var map = new google.maps.Map(document.getElementById("map"), mapOptions);   
   var geocoder = new google.maps.Geocoder();

   // Define north-east and south-west points of UK
   var ne = new google.maps.LatLng(60.00, 3.00);
   var sw = new google.maps.LatLng(49.00, -13.00);

   // Define bounding box for drawing
   var boundingBoxPoints = [
      ne, new google.maps.LatLng(ne.lat(), sw.lng()),
      sw, new google.maps.LatLng(sw.lat(), ne.lng()), ne
   ];

   // Draw bounding box on map    
   new google.maps.Polyline({
      path: boundingBoxPoints,
      strokeColor: '#FF0000',
      strokeOpacity: 1.0,
      strokeWeight: 2,
      map: map
   });

   // Geocode and place marker on map
   geocoder.geocode({
      'address': 'Boston',
      'region':  'uk',
      'bounds':  new google.maps.LatLngBounds(sw, ne)
   }, 
   function(results, status) {
      if(status == google.maps.GeocoderStatus.OK) {
         new google.maps.Marker({
            position:results[0].geometry.location,
            map: map
         });
      }
   });

   </script> 
</body> 
</html>
22
Daniel Vassallo

Mit dem folgenden Code wird die erste übereinstimmende Adresse in Großbritannien abgerufen, ohne dass die Adresse geändert werden muss.

  var geocoder = new google.maps.Geocoder();
  geocoder.geocode(
  {
    'address':  address,
    'region':   'uk'
  }, function(results, status) {
    if(status == google.maps.GeocoderStatus.OK) {
        for (var i=0; i<results.length; i++) {
            for (var j=0; j<results[i].address_components.length; j++) {
               if ($.inArray("country", results[i].address_components[j].types) >= 0) {
                    if (results[i].address_components[j].short_name == "GB") {
                        return_address = results[i].formatted_address;
                        return_lat = results[i].geometry.location.lat();
                        return_lng = results[i].geometry.location.lng();
                        ...
                        return;
                    }
                }
            }
        }
    });
27
Ivo Bosticky

Verwenden Sie componentRestrictions attribute:

geocoder.geocode({'address': request.term, componentRestrictions: {country: 'GB'}}
26
Yenya

Der richtige Weg, dies zu tun, ist die Bereitstellung von componentRestrictions

Zum Beispiel:

var request = {
    address: address,
    componentRestrictions: {
        country: 'UK'
    }
}
geocoder.geocode(request, function(results, status){
    //...
});
16
Deminetix

Laut docs ) scheint der region-Parameter nur bias zu setzen (anstelle eines realen Grenzwerts für diese Region). Ich denke, wenn die API die genaue Adresse in Großbritannien nicht findet Dort wird die Suche unabhängig von der eingegebenen Region erweitert. 

Ich habe in der Vergangenheit ziemlich gut mit der Angabe des Ländercodes in der Adresse (zusätzlich zur Region) gerechnet. Ich habe jedoch noch nicht viel Erfahrung mit identischen Ortsnamen in verschiedenen Ländern. Trotzdem ist es einen Versuch wert. Versuchen

'address': '78 Austin Street, Boston, UK'

es sollte keine Adresse (anstelle der US-Boston) und

'address': '78 Main Street, Boston, UK'

Sollte das Boston in Großbritannien zurückgeben, weil das tatsächlich eine Main Street hat.

Update:

Wie kann man Geocoder so einschränken, dass Standorte nur aus einem Land oder möglicherweise aus einem bestimmten Bereich zurückgegeben werden?

Sie können einen bounds-Parameter festlegen. Siehe hier

Natürlich müsste man dafür ein Rechteck in UK-Größe berechnen.

8
Pekka 웃

Ich habe Probleme gefunden, ", UK" zu setzen, die Region auf UK zu setzen und Grenzen zu setzen. ALL THREE zu tun, scheint es jedoch für mich zu beheben. Hier ist ein Ausschnitt: -

var sw = new google.maps.LatLng(50.064192, -9.711914)
var ne = new google.maps.LatLng(61.015725, 3.691406)
var viewport = new google.maps.LatLngBounds(sw, ne);

geocoder.geocode({ 'address': postcode + ', UK', 'region': 'UK', "bounds": viewport }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
.....etc.....
5
nickthompson

Ich habe folgendes versucht:

geocoder.geocode( {'address':request.term + ', USA'}

Und es arbeitet für mich in einer bestimmten Region (US-Land).

2
Ankit Adlakha

Ich fand es immer ziemlich einfach zu filtern, da die Ergebnisse variieren können und die Region nicht zu funktionieren scheint.

response( $.map( results, function( item ) {
 if (item.formatted_address.indexOf("GB") != -1) {
    return {
      latitude: item.geometry.location.lat(),
      longitude: item.geometry.location.lng()
    }
  }
}
1
bokor

Ich bevorzuge a hybrider Ansatz.

  1. Verwenden Sie componentRestrictions, um das Land zuerst stark einzuschränken.
  2. Wenn dies nicht zu genügend Ergebnissen führt, suchen Sie breiter (und führen Sie bei Bedarf die Verzerrung wieder ein).

    
    function MyGeocoder(address,region)
    {
        geocoder = new google.maps.Geocoder();
        geocoder.geocode({ 'address': address, 'componentRestrictions': { 'country': region } }, function (r, s) {
            if (r.length < 10) geocoder.geocode({ 'address': address /* could also bias here */ }, function (r2, s2) {
                for (var j = 0; j < r2.length; j++) r.Push(r2[j]);
                DoSomethingWithResults(r);
            });
            else DoSomethingWithResults(r);
        });
    }
    function DoSomethingWithResults(r) { // Remove Duplicates var d = {}; r = r.filter(function (e) { var h = e.formatted_address.valueOf(); var isDup = d[h]; d[h] = true; return !isDup; });

    // Do something with results } </ code>
0
Grant

Ich habe Border All Around Uk erstellt und überprüfe, ob mein Lat und Lng im Bereich liegen. Für 3k-Adressen habe ich in den USA ungefähr 10 bis 20 Adressen. Ich ignoriere sie einfach (das kann ich in meinem Fall tun) ) Ich benutze lat und lng, um mehrere Marker auf einer statischen Karte mit automatischem Zoom zu erstellen. Ich werde meine Lösung teilen. Vielleicht hilft dies jemandem. Auch ich bin froh, verschiedene Lösungen für meinen Fall zu hören.

    private static string ReturnLatandLng(string GeocodeApiKey, string address)
    {
        string latlng = "";

        Geocoder geocoder = new Geocoder(GeocodeApiKey);

        var locations = geocoder.Geocode(address);

        foreach (var item in locations)
        {

            double longitude = item.LatLng.Longitude;
            double latitude = item.LatLng.Latitude;
            double borderSouthLatitude = 49.895878;
            double borderNorthLatitude = 62.000000;
            double borderWestLongitude = -8.207676;
            double borderEastLongitude = 2.000000;

            //Check If Geocoded Address is inside of the UK
            if (( (borderWestLongitude < longitude) && (longitude < borderEastLongitude) ) && ( (borderSouthLatitude < latitude) && (latitude < borderNorthLatitude) ) )
            {
                latlng = item.LatLng.ToString();
            }
            else
            {
                latlng = "";
                Console.WriteLine("GEOCODED ADDRESS IS NOT LOCATED IN UK ADDRESSES LIST. DELETING MARKER FROM MAP.....");
            }
        }
        return latlng;
    }
0
mateusz stacel

Ich finde, dass die USA bei vielen mehrdeutigen Fragen immer Vorrang bei Google haben, selbst wenn Sie versuchen, ihr zu sagen, wo sie suchen müssen. Sie können die Antwort betrachten und vielleicht ignorieren, wenn das Ausgabeland = US ist.

Das ist der Hauptgrund, warum ich Google Geocoder vor einiger Zeit nicht mehr verwendet habe und vor zwei Jahren mit dem Aufbau meines eigenen begonnen habe.

https://geocode.xyz/Boston,%20UK gibt immer den Standort in Großbritannien zurück. Sie können besonders sicher sein, indem Sie region = UK hinzufügen: https://geocode.xyz/Boston,%20UK?region=UK

0
Ervin Ruci