J'ai donné un emplacement défini par la latitude et la longitude. Maintenant, je veux calculer une boîte englobante à moins de 10 kilomètres par exemple de ce point.
La boîte englobante doit être définie comme latmin, lngmin et latmax, lngmax.
J'ai besoin de ce matériel pour utiliser l' API panoramio .
Est-ce que quelqu'un connaît la formule pour obtenir ces points?
Edit: Les gars, je cherche une formule / fonction qui prend lat & lng comme entrée et renvoie une boîte englobante comme latmin & lngmin et latmax & latmin. Mysql, php, c #, javascript est très bien mais aussi le pseudocode devrait être correct.
Edit: je ne cherche pas une solution qui me montre la distance de 2 points
Réponses:
Je suggère d'approcher localement la surface de la Terre comme une sphère de rayon donné par l'ellipsoïde WGS84 à la latitude donnée. Je soupçonne que le calcul exact de latMin et latMax exigerait des fonctions elliptiques et ne donnerait pas une augmentation appréciable de la précision (WGS84 est lui-même une approximation).
Ma mise en œuvre suit (elle est écrite en Python; je ne l'ai pas testée):
EDIT: Le code suivant convertit (degrés, nombres premiers, secondes) en degrés + fractions de degré, et vice versa (non testé):
la source
J'ai écrit un article sur la recherche des coordonnées de délimitation:
http://JanMatuschek.de/LatitudeLongitudeBoundingCoordinates
L'article explique les formules et fournit également une implémentation Java. (Cela montre également pourquoi la formule de Federico pour la longitude min / max est inexacte.)
la source
public override string ToString()
il est très mauvais de remplacer une telle méthode globale uniquement dans un seul but, mieux vaut simplement ajouter une autre méthode, puis remplacer la méthode standard, qui peut être utilisée dans d'autres parties de l'application, pas pour le gis exact ...Ici, j'ai converti la réponse de Federico A. Ramponi en C # pour toute personne intéressée:
la source
J'ai écrit une fonction JavaScript qui renvoie les quatre coordonnées d'une boîte englobante carrée, étant donné une distance et une paire de coordonnées:
la source
minLon = void 0;
etmaxLon = MAX_LON;
cela ne fonctionne toujours pas.centerPoint
argument est un tableau composé de deux coordonnées. Par exemple,getBoundingBox([42.2, 34.5], 50)
-void 0
est la sortie CoffeeScript pour "non défini" et n'affectera pas la capacité des codes à s'exécuter.degLat.degToRad
n'est pas une fonctiondegToRad
erreurs " n'est pas une fonction". JeNumber.prototype.
n'ai jamais découvert pourquoi mais ce n'est pas une bonne idée pour une fonction utilitaire comme celle-ci, alors je les ai converties en fonctions locales normales. Il est également important de noter que la boîte retournée est [LNG, LAT, LNG, LAT] au lieu de [LAT, LNG, LAT, LNG]. J'ai modifié la fonction de retour lorsque j'ai utilisé cela pour éviter toute confusion.Comme j'avais besoin d'une estimation très approximative, donc pour filtrer certains documents inutiles dans une requête elasticsearch, j'ai utilisé la formule ci-dessous:
N = kms requis pour l'emplacement donné. Pour votre cas N = 10
Pas précis mais pratique.
la source
Vous recherchez une formule ellipsoïde.
Le meilleur endroit que j'ai trouvé pour commencer à coder est basé sur la bibliothèque Geo :: Ellipsoid du CPAN. Il vous donne une base de référence pour créer vos tests et comparer vos résultats avec ses résultats. Je l'ai utilisé comme base pour une bibliothèque similaire pour PHP chez mon ancien employeur.
Géo :: Ellipsoïde
Jetez un œil à la
location
méthode. Appelez-le deux fois et vous avez votre bbox.Vous n'avez pas publié la langue que vous utilisiez. Une bibliothèque de géocodage est peut-être déjà disponible pour vous.
Oh, et si vous ne l'avez pas encore compris, Google Maps utilise l'ellipsoïde WGS84.
la source
Illustration de @Jan Philip Matuschek excellente explication. (Veuillez voter pour sa réponse, pas celle-ci; j'ajoute ceci car j'ai pris un peu de temps pour comprendre la réponse originale)
La technique de la boîte englobante consistant à optimiser la recherche des voisins les plus proches aurait besoin de dériver les paires de latitude et de longitude minimale et maximale pour un point P à la distance d. Tous les points qui se trouvent en dehors de ceux-ci sont définitivement à une distance supérieure à d du point. Une chose à noter ici est le calcul de la latitude d'intersection comme le souligne l'explication de Jan Philip Matuschek. La latitude d'intersection n'est pas à la latitude du point P mais légèrement décalée de celui-ci. Il s'agit d'une partie souvent manquée mais importante pour déterminer la longitude de délimitation minimale et maximale correcte du point P pour la distance d. Ceci est également utile pour la vérification.
La distance sinusoïdale entre (latitude d'intersection, longitude haute) et (latitude, longitude) de P est égale à la distance d.
Python gist ici https://gist.github.com/alexcpn/f95ae83a7ee0293a5225
la source
Voici une implémentation simple utilisant javascript qui est basée sur la conversion du degré de latitude en kms où
1 degree latitude ~ 111.2 km
.Je calcule les limites de la carte à partir d'une latitude et d'une longitude données d'une largeur de 10 km.
la source
J'ai adapté un script PHP que j'ai trouvé pour faire exactement cela. Vous pouvez l'utiliser pour trouver les coins d'une boîte autour d'un point (par exemple, à 20 km). Mon exemple spécifique concerne l'API Google Maps:
http://www.richardpeacock.com/blog/2011/11/draw-box-around-coordinate-google-maps-based-miles-or-kilometer
la source
Je travaillais sur le problème de la boîte englobante en tant que problème secondaire pour trouver tous les points dans le rayon SrcRad d'un point statique LAT, LONG. Il y a eu pas mal de calculs qui utilisent
pour calculer les limites de longitude, mais j'ai trouvé que cela ne donnait pas toutes les réponses nécessaires. Parce que ce que tu veux vraiment faire c'est
Je sais, je sais que la réponse devrait être la même, mais j'ai trouvé que ce n'était pas le cas. Il est apparu qu'en ne m'assurant pas de faire le (SRCrad / RadEarth) d'abord, puis en divisant par la partie Cos, j'omettais certains points de localisation.
Une fois que vous avez obtenu tous les points de votre boîte englobante, si vous avez une fonction qui calcule la distance point à point donnée lat, il est facile d'obtenir uniquement les points qui sont à un certain rayon de distance du point fixe. Voici ce que j'ai fait. Je sais que cela a pris quelques étapes supplémentaires mais cela m'a aidé
la source
C'est très simple, il suffit d'aller sur le site Web de panoramio, puis d'ouvrir la carte du monde à partir du site Web de panoramio.Ensuite, allez à l'emplacement spécifié dont la latitude et la longitude sont requises.
Ensuite, vous avez trouvé la latitude et la longitude dans la barre d'adresse par exemple dans cette adresse.
http://www.panoramio.com/map#lt=32.739485&ln=70.491211&z=9&k=1&a=1&tab=1&pl=all
lt = 32,739485 => latitude ln = 70,491211 => longitude
ce widget API JavaScript Panoramio crée un cadre de délimitation autour d'une paire lat / longue, puis renvoie toutes les photos avec dans ces limites.
Un autre type de widget API JavaScript Panoramio dans lequel vous pouvez également changer la couleur d'arrière-plan avec l' exemple et le code est ici .
Cela n'apparaît pas dans l'ambiance de composition, mais après la publication.
la source
Ici, j'ai converti la réponse de Federico A. Ramponi en PHP si quelqu'un est intéressé:
la source
Merci @Fedrico A. pour l'implémentation de Phyton, je l'ai porté dans une classe de catégorie Objective C. Voici:
Je l'ai testé et semble fonctionner correctement. Struct BoundsLocation devrait être remplacé par une classe, je l'ai utilisé juste pour le partager ici.
la source
Toutes les réponses ci-dessus ne sont que partiellement correctes . Surtout dans une région comme l'Australie, ils incluent toujours le pôle et calculent un très grand rectangle même pour 10 km.
En particulier, l'algorithme de Jan Philip Matuschek à http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates#UsingIndex incluait un très grand rectangle de (-37, -90, -180, 180) pour presque tous les points en Australie. Cela touche un grand nombre d'utilisateurs dans la base de données et la distance doit être calculée pour tous les utilisateurs dans près de la moitié du pays.
J'ai trouvé que l' algorithme Drupal API Earth de Rochester Institute of Technology fonctionne mieux autour du pôle ainsi qu'ailleurs et est beaucoup plus facile à mettre en œuvre.
https://www.rit.edu/drupal/api/drupal/sites%21all%21modules%21location%21earth.inc/7.54
Utilisez
earth_latitude_range
et àearth_longitude_range
partir de l'algorithme ci-dessus pour calculer le rectangle englobantEt utilisez la formule de calcul de distance documentée par google maps pour calculer la distance
https://developers.google.com/maps/solutions/store-locator/clothing-store-locator#outputting-data-as-xml-using-php
Pour effectuer une recherche par kilomètres au lieu de miles, remplacez 3959 par 6371. Pour (Lat, Lng) = (37, -122) et une table de marqueurs avec les colonnes lat et lng , la formule est:
Lisez ma réponse détaillée sur https://stackoverflow.com/a/45950426/5076414
la source
Voici la réponse de Federico Ramponi dans Go. Remarque: pas de vérification des erreurs :(
la source