Convertir Lat / Longs en coordonnées X / Y
J'ai de la latitude/longitude de la valeur d'une petite zone à Melbourne, -37.803134,145.132377 et aussi une image plate,que j'ai exporté à partir d'openstreetmap carte( Osmarender de l'Image ).
La largeur de l'Image : 1018 et Hauteur:916
Je voudrais être en mesure de convertir, à l'aide de C++, le Lat/Long d'une coordonnée X,Y du point de refléter l'emplacement.
J'ai utilisé différentes de la formule que j'ai trouvé dans le web comme une donnée ci-dessous, mais rien n'y fait.
var y = ((-1 * lat) + 90) * (MAP_HEIGHT / 180);
var x = (lon + 180) * (MAP_WIDTH / 360);
Il serait d'une grande aide si quelqu'un me donner une explication claire de la façon de le faire . Le code serait très apprécié.
source d'informationauteur Verve Innovation
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de plus d'informations que seulement un seul d'entre lat/lon paire pour être en mesure de le faire.
À ce stade, les informations que vous avez fournies manque deux choses:
Je vais aussi supposer que votre image est alignée nord/sud par exemple, il n'a pas nord pointant vers le coin supérieur gauche. Qui aurait tendance à compliquer les choses.
L'approche la plus facile est de comprendre exactement ce que lat/lon coordonnées correspondent au (0, 0) pixel et l' (1017, 915) pixel. Ensuite, vous pouvez trouver le pixel correspondant à une latitude/longitude coordonnées par interpolation.
Pour donner un bref aperçu de ce processus, imaginez que votre (-37.803134, 145.132377) lat/lon correspond à votre (0, 0) pixel, et que vous avez découvert que votre (1017, 915) pixel correspond à la lat/lon (-37.798917, 145.138535). En supposant que la convention habituelle avec pixel (0, 0) dans le coin inférieur gauche, cela signifie que le nord est en haut dans l'image.
Alors, si vous êtes intéressé dans la cible de coordonnées (-37.801465, 145.134984), vous pouvez déterminer le nombre de pixels de l'image, il est comme suit:
Qui est, le pixel correspondant est de 362 pixels à partir du bas de l'image. Ensuite, vous pouvez faire exactement la même chose pour le pixel horizontal de placement, mais à l'aide de longitudes et de X pixels à la place.
La partie
((targetLat - minLat) /(maxLat - minLat))
fonctionne la distance entre deux coordonnées de référence, et donne 0 pour indiquer que vous êtes sur le premier, 1 pour indiquer que le second, et les nombres entre pour indiquer les endroits entre les deux. Ainsi, par exemple, il serait de produire de 0,25 pour indiquer que vous êtes 25% de la route vers le nord entre les deux coordonnées de référence. Le dernier bit convertit en l'équivalent de pixels.HTH!
MODIFIER Ok, en fonction de votre commentaire que j'ai peut être un peu plus précis. Étant donné que vous semblez être en utilisant le coin en haut à gauche comme principal point de référence, je vais utiliser les définitions suivantes:
Alors, si nous utilisons un exemple de coordonnées (-37.804465, 145.134984), la coordonnée Y du pixel correspondant, par rapport au coin en haut à gauche, est:
Par conséquent, le pixel correspondant est de 393 pixels de haut en bas. Je vais vous permettent de travailler à l'horizontale équivalent pour vous - même- c'est fondamentalement la même. NOTE La
-1
avec leMAP_HEIGHT
est parce que si vous commencez à partir de zéro, le maximum de nombre de pixel est de 915, pas 916.EDIT: Une chose que je voudrais profiter de l'occasion pour souligner, c'est que c'est une approximation. En réalité, il n'y a pas de relation linéaire simple entre la latitude et de la longitude et d'autres formes de coordonnées Cartésiennes pour un certain nombre de raisons, y compris les projections qui sont utilisés en faire des cartes, et le fait que la Terre n'est pas une sphère parfaite. Dans de petites zones, ce rapprochement est assez proche aussi de ne pas faire de différence significative, mais sur de plus grandes échelles des divergences peuvent se manifester. En fonction de vos besoins, YMMV. (Mes remerciements à uray, dont la réponse ci-dessous m'a rappelé que c'est le cas).
si vous êtes à la recherche de la précision de la conversion des géodésiques (lot,lan) dans votre défini de coordonnées cartésiennes (x,y) mètres à partir du point de référence), vous pouvez le faire avec mon extrait de code ici, cette fonction peut accepter de coordonnées géodésiques en radian et de sortie de l'x,y
d'entrée:
que vous avez défini comme 0,0 en coordonnées cartésiennes
coordonner (l'unité est en radian)
coordonner qui vous voulez
calculer ses coordonnées cartésiennes (l'unité est en radian)
coordonnées cartésiennes x,y (l'unité est le mètre)
code:
Je ne serais pas trop s'inquiéter de la courbure de la terre.
Je n'ai pas utilisé openstreetmap avant, mais j'ai juste eu un coup d'oeil rapide, et il semble qu'ils utilisent une projection de Mercator.
Qui signifie simplement qu'ils ont aplati la planète pour vous sur un rectangle, X proportionnelle à la Longitude, et Y presque exactement proportionnelle à la Latitude.
De sorte que vous pouvez aller de l'avant et à l'utilisation du Mac formules simples et vous sera très précis. Votre Latitude être par beaucoup moins d'un pixel vaut la peine pour la petite carte qui vous avez affaire. Même sur une carte de la taille de Victoria, vous obtenez seulement une erreur de 2 à 3%.
diverscuba23 remarquer que vous avez à choisir un ellipsoïde... openstreetmap utilise le système WGS84, et n'a donc plus la cartographie moderne. Toutefois, méfiez-vous que beaucoup de cartes en Australie utiliser l'ancienne AGD66 qui peuvent différer de 100 à 200 mètres.