J'ai besoin de pouvoir calculer une boîte ou un cercle de délimitation pour une latitude et une longitude WGS84 et une distance WGS84 données, mais je ne sais pas par où commencer!
La distance du départ Lat / Lon serait de 10 km ou moins.
Serait-il possible pour quelqu'un de me donner quelques conseils / exemple sur la façon de procéder
Réponses:
WGS-quoi? WGS-84? Selon la précision dont vous avez besoin, vous devrez peut-être en savoir beaucoup plus d'informations - je suppose que c'est la raison pour laquelle vous avez été rejeté, bien que personne n'ait pris la peine de laisser un commentaire expliquant pourquoi.
Voici deux façons:
Imprécis, mais probablement «assez bon»
Un degré de latitude est d'environ 10001,965729 / 90 kilomètres (distance de l'équateur au pôle, divisée par quatre-vingt-dix degrés) ou 111,113 kilomètres, en utilisant la donnée WGS-84. C'est une approximation à cause de la forme de la terre et parce que les distances changent à mesure que vous vous approchez des pôles (une raison d'utiliser la latitude, pas la longitude - finalement la distance d'un degré de longitude est nulle!) La terre n'est pas non plus parfaite sphère. Ce sont deux raisons d'utiliser une approche plus complexe basée sur la projection et les données, dans ma deuxième réponse.
Cela utilise des degrés décimaux, pas des degrés / minutes / secondes.
Ainsi, votre boîte englobante sera votre point, plus et moins 0,08999 degrés. Vous pouvez également utiliser ce nombre comme un rayon, vous donnant un cercle de délimitation .
Toute personne SIG lisant ceci frémira. Ce sera surtout précis, selon l'endroit où vous vous trouvez dans le monde. Pour un rayon de 10 km, ça devrait aller.
Beaucoup plus précis, mais plus de code
Utilisez une bibliothèque de projection et spécifiez votre datum, etc. Je recommande Proj4; il est largement utilisé, donc Google renvoie des tas de résultats pour les questions à ce sujet, et il existe des wrappers Delphi . Si vous avez du mal à l'utiliser, postez une autre question ici sur SO - c'est hors de portée pour celle-ci. Le site Web de Proj4 contient des exemples d'utilisation des API de base, et bien que ceux-ci soient en C, il devrait être assez facilement traduisible. Leur référence API est le meilleur endroit pour commencer, suivie de la FAQ .
J'utiliserais WGS-84 comme référence de base (représentation de la terre) à moins que vous ne connaissiez une donnée spécifique que vous souhaitez utiliser, ou qui a été utilisée pour créer vos coordonnées. Il est couramment utilisé et assez précis.
Si votre position provient de Google Maps (par exemple), spécifiez une projection Mercator. Vous pouvez utiliser une autre projection ou utiliser, par exemple, les coordonnées UTMau lieu de la latitude et de la longitude, selon la source de vos données et si vous souhaitez une grande précision pour une petite zone locale. (L'UTM a plusieurs zones, qui modifient toutes la distorsion de sorte que dans cette zone, elle est très précise; si vous utilisez une zone pour des coordonnées à l'extérieur, la distorsion augmentera considérablement à mesure que vous vous éloignez. Si vous regardez la terre entière projetée à partir d'une seule peut être méconnaissable. Mais dans une zone, les traductions UTM seront à peu près aussi bonnes que possible. Les coordonnées sont généralement spécifiées en mètres, pas en degrés, donc cela peut être plus utile pour vous, étant donné que vous avez besoin de 10 km 10 km est facilement dans une seule zone, il vous suffit de choisir la zone appropriée en fonction de votre coordonnée centrale. Le seul point délicat est lorsque vous approchez d'une frontière: c'est une situation courante, et c'est bien, soyez justecohérent dans la façon dont vous choisissez celui que vous utilisez . Proj4 vous permettra également de traduire des projections, afin que vous puissiez passer de votre Mercator WGS-84 lat / long à une zone UTM n , par exemple, ou vers et depuis deux zones UTM.)
la source
En supposant que vous souhaitiez effectuer une requête dans une base de données, vous souhaiterez probablement effectuer une recherche rapide (inexacte), puis calculer exactement la distance pour les endroits résultants. Est-ce votre scénario?
La fonction suivante (en PHP, désolé) calculera grossièrement les différences de latitude et de longitude. Ces différences dépendent de la latitude de votre point de recherche. Utilisez-les (avec une petite tolérance) pour effectuer une recherche rapide dans la base de données. La boîte peut être calculée simplement avec latitude + -deltaLatitude et longitude + -deltaLongitude.
Avec la formule haversine , vous pouvez calculer les distances sur la sphère. Utilisez-le pour chacun des endroits trouvés, pour obtenir la distance "exacte". De cette façon, vous pouvez tester si les deux endroits sont dans un certain rayon (un cercle au lieu de la boîte).
la source
Pour tester si un lat / lon se trouve à l'intérieur ou à l'extérieur d'un cercle de délimitation, vous devez calculer la distance entre votre lat / lon de référence et le point lat / lon que vous souhaitez tester. Étant donné que votre distance est de 10 km ou moins, j'essayerais d'utiliser l'approximation équirectangulaire pour obtenir la distance plutôt que Haversine en raison de la simplicité. Pour obtenir la distance en km:
Remarque importante: les lat / lon dans ces formules sont en radians et non en degrés. La valeur typique d'EarthRadius est de 6371 km, ce qui renvoie la distance en unités de km. Maintenant, c'est un test simple si votre distance est à l'intérieur ou à l'extérieur du cercle. Si un cercle de délimitation fonctionne, j'irais avec ça.
Pour un rectangle englobant, je suppose que vous voulez que le rectangle soit défini en étant parallèle à l'équateur. Je calculerais ensuite les coins de la boîte englobante en utilisant des calculs de distance / relèvement (les relèvements étant de 45 degrés, 135 degrés, 225 degrés et 315 degrés). À partir de là, je suppose que vous n'êtes pas autour des pôles et utilisez un point dans le test de polygone.
la source
Ci-dessous se trouve le code T-SQL que j'utilise pour construire la boîte englobante dans SQL-Server 2012. Dans mon cas, j'obtiens des valeurs décimales pour Lat, Long. J'utilise cela pour limiter rapidement le nombre de lignes avant d'utiliser la
STDistance
fonction SQL pour vérifier que les résultats sont réellement à une distance particulière. Les fonctions de géographie sont très coûteuses dans SQL Server, donc en construisant un cadre de délimitation, je suis en mesure de réduire considérablement le nombre de fois où il doit être exécuté.la source