-1

Ich habe bereits die Google map javascript api implementiert, wo ich eine Liste von Orten speichern, die von Benutzern angegeben wurden, indem ich ihre lat, lng, placeId in der Datenbank ablege. So können Benutzer Orte finden, die sich in einem Radius von einem Ort in km/Meile befinden.Gibt es eine Möglichkeit, die Koordinaten in einem Staat/Provinz/Stadt/Bezirk nur mit der Haversine-Formel zu filtern?

Ich bin mit dem Haversine Formel basierend auf dieser Google-Karte Tutorial https://developers.google.com/maps/solutions/store-locator/clothing-store-locator

Mein Problem ist, ich möchte, dass die Koordinaten von SQL-Abfrage zurückgeben begrenzen, die innerhalb eines Staates (oder Stadt oder Kreis) zu stark eingeschränkt wird, weil Wenn ein Benutzer den Punkt in der Nähe einer Staatsgrenze platziert, kann die Haversine-Formel möglicherweise auch Koordinaten aus einem anderen Zustand zurückgeben, was ich nicht möchte. Ich habe seit einiger Zeit darüber geforscht, es scheint, dass der Weg, dies zu erreichen, darin besteht, die Zustandsinformationen in der Datenbank zu speichern, bin ich richtig?

Oder eine bessere Möglichkeit, dies über Google Map JavaScript API zu erreichen?

Dank

Antwort

1

Gleiche wie Sie Ihre Benutzer Standort in Ihrer Datenbank speichern, sollten Sie auch eine Tabelle mit Ihren administrativen Unterteilungen haben. (Zum Beispiel, Staaten, die Sie frei unter ESRI OpenData erhalten können).

Also, wenn Sie das Tutorial, das Sie erwähnten, würde ich vermuten, dass Sie MySQL verwenden, und Sie haben Ihre Punkte als Datensätze mit einem lat und lng Felder gespeichert. Gut genug, um sie auf der Karte anzuzeigen, aber nicht gut genug, um räumliche Schnittpunkte zu verwenden.

Die Geometrie Ihrer Filialen müsste mit ST_GeomFromText() erstellt werden. zum Beispiel

SELECT 
    ST_GeomFromText(CONCAT('POINT(', lng, ' ', lat, ')')) as markerposition 
FROM markers; 

Dann, wenn Sie eine Tabelle der US-Staaten, mit dem Namen „us_states“ haben und diese Tabelle hatte ein geom Feld vom Typ geometry, könnten Sie die ST_Contains Funktion verwenden, um alle Markierungen innerhalb eines enthaltenen zu erhalten gegebenen Zustand Geometrie (in dem folgenden Beispiel enthalten in Kalifornien):

SELECT * FROM markers 
JOIN us_states ON ST_Contains(us_states.geom, ST_GeomFromText(CONCAT('POINT(', markers.lng, ' ', markers.lat, ')'))) 
WHERE us_states.name='California'; 

Nun, ich würde sagen, dass der richtige Weg ist. Aber wenn es zu weit hergeholt ist für das, was Sie erreichen wollen, können Sie dies auch vorne tun. Wenn Sie einen google.maps.Polygon für die Geometrie eines Zustands hätten, könnten Sie die Methode google.maps.geometry.poly.containsLocation verwenden, um zu filtern, welche Marker angezeigt werden sollen oder welche Marker ausgeblendet werden sollen, wenn sie außerhalb des Polygons liegen. Etwas wie

if (!google.maps.geometry.poly.containsLocation(marker.getPosition(), statePolygon)) { 
    marker.setMap(null); 
} 
+0

Hallo, vielen Dank für die tolle Antwort. Zuvor habe ich mich gefragt, ob es eine Google Map Api-Funktion gibt, die ich nicht kenne, die mir erlaubt, eine Reihe von Koordinaten und auch einen Staat/Land zu werfen, dann gib mir die Koordinaten zurück, die in diesem Staat/Land sind, also jetzt Ich weiß, dass ich diesen Staat/Land selbst verfolgen muss. Daher habe ich gefragt, bevor ich dies umsetze. Vielen Dank. – William

+0

Ja, Sie müssen die administrative Unterteilung selbst entweder hinten oder im Frontend bereitstellen. – amenadiel

+0

Hallo, gehe ich eine Liste von US States Geometrie zu bekommen? –

Verwandte Themen