Algorithme pour trouver tous Latitude Longitude endroits à l'intérieur d'une certaine distance à partir d'un Lat de Gnl emplacement
Donné une base de données de lieux avec la Latitude + Longitude endroits, tels que 40.8120390, -73.4889650, comment pourrais-je trouver tous les emplacements à l'intérieur d'une certaine distance d'un lieu spécifique?
Il ne semble pas très efficace pour sélectionner tous les emplacements à partir de la DB et ensuite passer par un par un, en obtenir la distance de l'emplacement de départ pour voir si elles sont à l'intérieur de la distance spécifiée. Est-il un bon moyen pour limiter le départ des endroits choisis à partir de la DB? Une fois que j'ai (ou pas?) une rétréci vers le bas emplacements, dois-je quand même passer par un par un pour vérifier la distance, ou est-il un meilleur moyen?
La langue-je faire dans n'importe pas vraiment. Merci!
- C'est peut être ce dont vous avez besoin: en.wikipedia.org/wiki/K-d_tree
- Ne pourrait-on pas de requête SQL pour le résoudre? SÉLECTIONNEZ * à PARTIR de Lieux OÙ (Lat :Lat)^2 + (Long :Long)^2 <= :Distance^2 (bce, certains autres mathématiques est impliqué avec la Terre étant sphérique et à tous, ceci est juste un exemple)
- Avez-vous trouver aucune réponse pour l'instant @ valera?
- u ne finalisé toute approche. Je suis à la recherche de quelque chose de similaire? Toute aide sera appréciée.
- nOiAd, Malheureusement, j'ai dû abandonner ce projet, donc je n'ai pas de fin jusqu'à la cueillette d'une solution. Les gars si vous utilisez l'une des solutions dans vos projets, avec d'autres, je voudrais vraiment l'apprécier vos commentaires à ce sujet ici.
Vous devez vous connecter pour publier un commentaire.
Commençons par Comparer la distance entre les latitudes. Chaque degré de latitude est d'environ 69 km (111 kilomètres) de distance. La gamme varie (en raison de la terre légèrement la forme ellipsoïde) à partir de 68.703 miles (110.567 km) au niveau de l'équateur à 69.407 (111.699 km) dans les pôles. La distance entre les deux endroits sera égale ou plus grande que la distance entre leurs latitudes.
Noter que ce n'est pas vrai pour les longitudes - la longueur de chaque degré de longitude est, dépend de la latitude. Toutefois, si vos données est limité à une certaine zone (un seul pays, par exemple) - vous pouvez calculer une valeur minimale et maximale des valeurs limites pour les longitudes ainsi.
Continuer une faible précision, rapide calcul de la distance que suppose sphérique de la terre:
Le grand cercle de la distance d entre deux points de coordonnées {lat1,lon1} et {lat2,lon2} est donnée par:
Une mathématiquement équivalent de la formule, ce qui est moins sujet à erreur d'arrondi pour les courtes distances est:
d est la distance (en radians
(6371 km à l'est de la rayon moyen de la terre)
Cette méthode de calcul des exigences sont mimimal. Cependant, le résultat est très précis pour les petites distances.
Puis, si elle est à une distance donnée, plus ou moins, utiliser une méthode plus précise.
GeographicLib est la mise en œuvre plus précise, je sais, mais Vincenty formule d'inversion peut être utilisé en tant que bien.
Si vous utilisez un SGBDR, définir la latitude de la clé primaire et la longitude comme une clé secondaire. Requête pour un intervalle de latitude, ou pour une latitude/longitude), comme il est décrit ci-dessus, puis calculer les distances exactes de l'ensemble des résultats.
Noter que les versions modernes de tous les principaux Sgbdr support géographique, les types de données et des requêtes en mode natif.
Basées sur l'utilisateur actuel latitude, la longitude et la distance vous souhaite de trouver,la requête sql est donnée ci-dessous.
@latitude et à la longitude sont la latitude et la longitude du point.
La Latitude et la longitude sont les colonnes de la distance de la table. La valeur de pi est 22/7
PostgreSQL SIG extensions pourraient être utiles - comme dans, il peut déjà mettre en œuvre la plupart des fonctionnalités que vous pensez de la mise en œuvre.
Essayez ceci pour la bonne solution:Géolocalisation De Recherche
Réservoirs Yogihosting
J'ai dans ma base de données, un ensembles de tables à partir d'Ouvrir Streep Cartes et j'ai testé succès.
Travail à Distance fine en mètres.
Vous pouvez trouver ces questions utiles:
Comme biziclop mentionné, une sorte d'espace métrique arbre serait probablement votre meilleure option. J'ai de l'expérience à l'aide de kd-tree et quad arbres pour faire ces sortes de requêtes de plage et ils sont étonnamment rapide; ils ne sont pas non plus difficile à écrire. Je vous suggère de regarder dans l'un de ces structures, comme ils vous permettent également de répondre à d'autres questions intéressantes comme "quel est le point le plus proche de mon jeu de données à ce point?"
Ce que vous avez besoin est de la recherche spatiale. Vous pouvez utiliser Solr de la recherche Spatiale. Il a également obtenu de lat/type de données long construit dans, vérifiez ici.
Vous pouvez convertir latitude-longitude au format UTM qui est format métrique qui peuvent vous aider à calculer les distances. Ensuite, vous pouvez facilement décider si le point tombe dans l'emplacement spécifique.
Puisque vous dites que toute langue est acceptable, le choix naturel est PostGIS:
Si vous souhaitez utiliser le système de référence géodésique WGS, vous devez définir
$spheroid
à'SPHEROID["WGS 84",6378137,298.257223563]'
En supposant que vous avez indexé
places
par legeom
colonne, cela devrait être raisonnablement efficace.vous pouvez vérifier cette équation
je pense que ça va aider