0

Ich stehe vor einem Problem, dass (in meinem Fall) nicht alle Bäckereien in dem Beispielcode gezeigt werden, obwohl Google definitiv über sie weiß, da ich sie in anderen Suchen finde.Wie finde und zeige ich alle POIs mit Google Maps API v3 innerhalb eines bestimmten Radius?

Zum Beispiel werden die zwei Bäckereien bei 52.543770, 13.441250 nicht angezeigt, obwohl sie innerhalb des angegebenen Radius sind. Warum ist das und wie kann ich es reparieren? Ich möchte alle Bäckereien finden, die Google kennt und nicht nur einen Teil davon.

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Place searches</title> 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
    <meta charset="utf-8"> 
    <style> 
     html, body { 
     height: 100%; 
     margin: 0; 
     padding: 0; 
     } 
     #map { 
     height: 100%; 
     } 
    </style> 
    <script> 
var map; 
var infowindow; 

function initMap() { 
    var berlin = {lat: 52.540, lng: 13.430}; 

    map = new google.maps.Map(document.getElementById('map'), { 
    center: berlin, 
    zoom: 15 
    }); 

    infowindow = new google.maps.InfoWindow(); 

    var service = new google.maps.places.PlacesService(map); 
    service.nearbySearch({ 
    location: berlin, 
    radius: 2000, 
    types: ['bakery'] 
    }, callback); 
} 

function callback(results, status) { 
    if (status === google.maps.places.PlacesServiceStatus.OK) { 
    for (var i = 0; i < results.length; i++) { 
     createMarker(results[i]); 
    } 
    } 
} 

function createMarker(place) { 
    var placeLoc = place.geometry.location; 
    var marker = new google.maps.Marker({ 
    map: map, 
    position: place.geometry.location 
    }); 

    google.maps.event.addListener(marker, 'click', function() { 
    infowindow.setContent(place.name); 
    infowindow.open(map, this); 
    }); 
} 

    </script> 
    </head> 
    <body> 
    <div id="map"></div> 
    <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&signed_in=true&libraries=places&callback=initMap" async defer></script> 
    </body> 
</html> 

Antwort

2

Standardmäßig zeigt Google 20 Ergebnisse pro Kategorie an. Wenn Sie mehr als 20 Ergebnisse benötigen, auf die Sie alle Ergebnisse zugreifen müssen, können Sie den pagination-Parameter der Callback-Funktion placesService verwenden.

Ihre callback wird so modifiziert werden:

function callback(results, status, pagination) { 
    if (status === google.maps.places.PlacesServiceStatus.OK) { 
    for (var i = 0; i < results.length; i++) { 
     createMarker(results[i]); 
    } 
    if (pagination.hasNextPage) 
     pagination.nextPage(); 
    } 
} 

Diese alle Ergebnisse auf einmal zeigen.

pagination.nextPage(); wird die callback Funktion erneut mit neuen Ergebnissätzen aufrufen.

Sie zum Google Maps Pagination example

Hinweis verweisen: dies tun kann dazu führen, dass Karte mit Markierungen gedrängt werden und damit die Benutzerfreundlichkeit zu verletzen. Anstatt alle Markierungen auf einmal anzuzeigen, implementieren Sie eine Schaltfläche Weitere wie im Google Maps Paginierungsbeispiel gezeigt.

Bearbeiten: Sie können auch die rankBy: google.maps.places.RankBy.DISTANCE -Eigenschaft in Ihrem Anfrageobjekt verwenden, um zuerst die nächsten Ergebnisse zu erhalten.

Edit2: auch durch Entfernen der radius Eigenschaft Ihre Anfrage Objekt ändern und das Hinzufügen von rankBy Eigenschaft:

service.nearbySearch({ 
    location: berlin, 
    types: ['bakery'], 
    rankBy: google.maps.places.RankBy.DISTANCE 
}, callback); 

dies Ihre Lila Backer Bäckerei Ergebnis zeigen wird. Die Orte sind korrekt unter bakery

aufgeführt. Beachten Sie, dass Sie möglicherweise mehr als die beabsichtigten Ergebnisse erhalten, da der Radius entfernt wurde. Sie können den Radius weiterhin manuell verarbeiten, indem Sie mithilfe von Haversine formula die Entfernung zum gesuchten Standort berechnen und Orte, die außerhalb des Radius liegen, manuell verwerfen. :)

+0

Dies ist eine gute Antwort, es scheint zu funktionieren, obwohl ich Bäckereien wie [diese] (https://www.google.com/maps/place/Lila+B%C3%A4cker/@52.543802,13.441251 , 21z/Daten =! 4m5! 3m4! 1s0x0: 0x89c2448a69a1423f! 8m2! 3d52.5438009! 4d13.4412414? Hl = de-DE) die immer noch nicht angezeigt werden. Danke trotzdem! – JohnnyFromBF

+0

Ich habe mich manuell überprüft und das Ergebnis wird nicht angezeigt. Der einzige mögliche Grund dafür könnte sein, dass _Lila Backer_ nicht in der Kategorie 'bakery' registriert ist, aber es könnte unter einer anderen Kategorie wie 'restaurant' registriert werden. – ihimv

+0

Hmm könnte sein, aber es wird angezeigt, wenn ich manuell nach Bäckerei suche. Jedenfalls hast du die richtige Antwort gegeben, sehr geschätzt! – JohnnyFromBF