J'ai créé la table MySQL suivante pour stocker les coordonnées de latitude / longitude avec un nom pour chaque point: J'essaie d'interroger: p> Tous les exemples que j'ai trouvés se réfèrent à l'utilisation d'un rectangle de liaison minimum (MBR) plutôt qu'un rayon. Le tableau contient environ 1 million de points, de sorte que ce besoin doit être aussi efficace que possible. P> p>
4 Réponses :
Le rayon n'est pas indexable efficacement. Vous devez utiliser le rectangle de liaison pour obtenir rapidement les points que vous recherchez probablement, puis filtrez des points à l'extérieur du rayon. P>
Merci pour votre réponse. La limitation de l'index de rayon est-elle juste un problème dans MySQL? Je me demande si PostgreSQL pourrait être plus pratique? Comment puis-je éliminer les points du rectangle de liaison qui ne se trouvent pas dans le rayon?
Non, c'est un problème général. PostgreSQL vous facilite la tâche, car vous pouvez explicitement demander si le point est contenu dans un cercle et cela utiliserait l'index aussi bien que possible, mais je pense que cela n'utiliserait également qu'une recherche rectangulaire en premier. Je ne vois aucune fonction MySQL pour le faire, mais vous pouvez simplifier de calculer la distance entre le centre et le point.
Merci à vous deux pour vos réponses. P>
J'ai finalement trouvé la solution à http: //www.movable -type.co.uk/scripts/latlong-db.html . P>
Qu'avez-vous fini par faire pour résoudre ce problème? J'ai du mal à décider d'utiliser des fonctions spaciales MySQL 5.7 ou d'utiliser la formule Haversine.
Je l'ai fait pour un point à l'intérieur du cercle avec le rayon détails et une autre requête d'exemple ici http://dexxtr.com/post/83498801191/how-a-determinez-point-inside-circle-utilisateur-mysql a>, espérons que cela aide p> p>
donné, nous avons la table simple suivante, p> avec les données simples suivantes, P> 1 -2.990435 53.409246 188.7421181457556
2 -2.990037 53.409471 166.49406509160158
3 -2.989736 53.409676 149.64084252776277
4 -2.989554 53.409797 141.93232714661812
5 -2.98935 53.409906 138.11516275402533
6 -2.989178 53.410085 129.40289289527473
7 -2.988739 53.410309 136.1875540498202
8 -2.985874 53.412656 360.78532732013963
9 -2.758019 53.635928 29360.27797292756
Peut-être que je suis mal compris, mais en utilisant st_contains code> n'est-ce pas que cela va toujours faire des calculs dans un avion cartésien? Pas la terre sphérique comme souhaité?
Bonjour, j'utilise votre code ci-dessus, j'ai une question, qu'est-ce que @Rangekm / 111 signifie? Quel est le 111 pour?
@Benosborne Il y a ~ 111km par 1 degré de latitude. Mais ce n'est pas précis et je ne le ferais pas de cette façon. La valeur change d'équateur en pôles. Donc, si vous recherchez dans un très grand rayon comme 2000 km, les résultats seraient très inexacts.