-1

J'ai déjà implémenté la carte Google javascript api où je stocke une liste d'emplacements spécifiés par les utilisateurs en stockant leur lat, lng, placeId dans la base de données. Ainsi, les utilisateurs peuvent trouver des endroits dans un rayon d'une place en km/mile.Existe-t-il un moyen de filtrer les coordonnées dans un état/une province/une ville/un district uniquement en utilisant la formule de Haversine?

J'utilise la formule Haversine basée sur cette carte Google tutoriel https://developers.google.com/maps/solutions/store-locator/clothing-store-locator

Mon problème est que je veux limiter les coordonnées de retour de requête SQL qui est limitée à l'intérieur d'un État (ou de la ville ou du district) aussi, parce que Si un utilisateur met le point près d'une bordure d'état, la formule de Haversine peut potentiellement renvoyer des coordonnées d'un autre état, ce qui n'est pas ce que je veux. Je fais des recherches à ce sujet depuis un certain temps, il semble que la façon d'y parvenir est de stocker les informations d'état dans la base de données aussi, ai-je raison?

Ou une meilleure façon d'y parvenir via l'API Google map javascript?

Merci

Répondre

1

Même chose que vous stockez votre emplacement d'utilisateurs dans votre base de données, vous devez également avoir une table avec vos subdivisions administratives. (Par exemple, états, que vous pouvez obtenir librement à ESRI OpenData). Donc, si vous avez suivi le tutoriel que vous avez mentionné, je devrais deviner que vous utilisez MySQL, et vous avez vos points stockés sous forme d'enregistrements avec des champs lat et lng. Assez bon pour les afficher sur la carte, mais pas assez bon pour utiliser les intersections spatiales.

La géométrie de vos magasins devrait être construite en utilisant ST_GeomFromText(). par exemple

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

Ensuite, si vous aviez une table des États-Unis, nommés « us_states » et ce tableau avait un champ geom de type geometry, vous pouvez utiliser la fonction ST_Contains pour obtenir tous les marqueurs contenus dans un étant donné la géométrie de l'État (dans l'exemple suivant, contenu en Californie):

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'; 

maintenant, je dirais que c'est la bonne façon. Mais si c'est trop loin pour ce que vous voulez réaliser, vous pouvez aussi le faire à l'avant. Si vous aviez un google.maps.Polygon représentant la géométrie d'un état, vous pouvez utiliser la méthode google.maps.geometry.poly.containsLocation pour filtrer les marqueurs à afficher ou les marqueurs à masquer s'ils se trouvent à l'extérieur dudit polygone. Quelque chose comme

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

Salut, merci beaucoup pour la bonne réponse. Auparavant, je me demandais s'il y a une fonction Google Map Api que je ne connais pas qui me permette de jeter dans un tas de coordonnées et aussi un état/pays puis me redonner les coordonnées qui sont dans ces état/pays, alors maintenant Je sais que je dois suivre ces états/pays par moi-même. Par conséquent, j'ai demandé avant de mettre en œuvre cela. Merci. – William

+0

Ouais, vous devez fournir vous-même la subdivision administrative, soit à l'arrière ou dans le frontend – amenadiel

+0

Salut est-ce que je vais obtenir une liste de la géométrie des Etats-Unis? –