10
votes

Points de requête dans un rayon donné dans MySQL

J'ai créé la table MySQL suivante pour stocker les coordonnées de latitude / longitude avec un nom pour chaque point: xxx

J'essaie d'interroger:

  • Tous les points dans un rayon N mile d'un point donné;
  • la distance de chaque point retourné du point donné

    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.


0 commentaires

4 Réponses :


2
votes

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.


2 commentaires

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.



3
votes

Merci à vous deux pour vos réponses.

J'ai finalement trouvé la solution à http: //www.movable -type.co.uk/scripts/latlong-db.html .


1 commentaires

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.



0
votes

Je l'ai fait pour un point à l'intérieur du cercle avec le rayon xxx

détails et une autre requête d'exemple ici http://dexxtr.com/post/83498801191/how-a-determinez-point-inside-circle-utilisateur-mysql , espérons que cela aide


0 commentaires

6
votes

pour mySQL 5.7 + strong>

donné, nous avons la table simple suivante, p> xxx pré>

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


3 commentaires

Peut-être que je suis mal compris, mais en utilisant st_contains 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.