7
votes

Obtenez des polygones proches d'une lat, longue dans MySQL

Est-ce que quelqu'un connaît-il un moyen d'aller chercher tous les polygones dans un DB mysql dans une distance donnée d'un point? La distance réelle n'est pas si importante car elle est calculée pour chaque polygone trouvé plus tard, mais ce serait une énorme optimisation de faire ce calcul pour les polygones "proches".

J'ai regardé le MBR et contient des fonctions, mais le problème est que certains des polygones ne sont pas contenus dans une boîte à bornes dessinée autour du point car ils sont très gros, mais certains de leurs sommets sont encore proches.

Toute suggestion?


0 commentaires

3 Réponses :


1
votes

Je ne pense pas qu'il y ait une seule réponse à cela. Il s'agit généralement de savoir comment organiser vos données afin qu'il utilise la localité spaciale inhérente à votre problème.

La première idée qui apparaît dans ma tête serait d'utiliser une grille, d'affecter chaque point sur un carré et de cocher sélectionner le carré que le point est dans et ceux qui l'entourent. Si nous parlons de grilles infinies, utilisez une valeur de hachage de la place, cela vous donnerait plus de points que nécessaire (où vous avez des collisions), mais vous réduirez toujours le montant par un groupe. Bien sûr, cela n'est pas immédiatement applicable aux polygones, c'est juste un brainstorming. Une approche éventuelle qui pourrait générer trop de collisions serait ou toutes les valeurs hachées ensemble et sélectionner toutes les entrées où les hachages andé avec cette valeur sont non nuls (pas sûr si cela est possible dans MySQL), vous voudrez peut-être utiliser un grand quantité de bits cependant.

Le problème avec cette approche est, en supposant que nous parlons des coordonnées sphériques (LAT, généralement généralement) sont les singularités, car la grille 'carrés' se développe plus étroite lorsque vous approchez des pôles. L'approche facile de cela est ... Ne mettez aucun point proche des pôles ... :)


0 commentaires

0
votes

Créer une zone de liaison pour tous les polygones et (éventuellement stocker ces résultats dans la base de données en fera beaucoup plus rapidement pour les polygones complexes). Vous pouvez ensuite comparer la boîte à bornes pour chaque polygone avec celui autour du point à la taille souhaitée. Sélectionnez tous les polygones qui ont une intersection des zones de liaison.


0 commentaires

4
votes

une version lente (sans index spatiaux): xxx

Pour utiliser les index spatiaux, vous devez dénormaliser votre table afin que chaque Vertex polygone soit stocké dans son propre enregistrement. < / p>

Créez ensuite l'index spatial sur le champ contenant les coordonnées des sommets et émettez simplement cette requête: xxx

le Les choses seront beaucoup plus faciles si vous stockez utm coordonnées de votre base de données plutôt que la latitude et la longitude.


3 commentaires

Merci un tas! Pour ceux qui ont des problèmes similaires: j'ai fini par utiliser le MBR d'un cercle tiré autour du point d'intérêt et récupérez tous les polygones dont les MBR ont intersecté les cercles MBR.


Pouvez-vous me dire quelle est la la distance moyenne? Est-ce au mile, km ou mètre?


@Shaishavjogani: @DISTANCE est une variable qui contient la distance dans laquelle vous recherchez. Il peut être en kilomètres ou en kilomètres ou mètres, ou toute autre unité de distance, à condition que vous stockiez des coordonnées dans les mêmes unités.