Conversion de la Longitude et de la Latitude en X Y sur une carte avec des points D'étalonnage
si j'ai une carte jpeg avec taille sizeX, sizeY
et quelques points de calibration sur la carte (X, Y, Lon, Lat)
quel serait l'algorithme pour calculer le point XY correspondant dans la carte avec une paire Longitude / Latitude donnée?
7 réponses
voici ce qui a fonctionné pour moi, sans trop de conneries.
int x = (int) ((MAP_WIDTH/360.0) * (180 + lon));
int y = (int) ((MAP_HEIGHT/180.0) * (90 - lat));
Les coordonnées lat,lon m'ont été données par des appareils Android. Ils doivent donc être dans le même standard utilisé par tous les produits Google Earth/Map.
Si vous utilisez le Projection cylindrique équidistante de type carte, voici ce que vous devez faire:
- trouvez la Latitude et la longitude de votre tutoriel de localisation ici:
http://lifehacker.com/267361/how-to-find-latitude-and-longitude - entrer cette information dans les formules suivantes:
x = (Largeur totale de l'image en px) * (180 + latitude) / 360
y = (hauteur totale de image en px) * (90 - longitude) / 180
note: lors de l'utilisation de la longitude négative de latitude assurez-vous d'ajouter ou de soustraire le nombre négatif i.e. +(-92) ou -(-35) qui serait en fait -92 et +35 - vous avez maintenant votre X et votre Y à tracer sur votre image
vous trouverez plus d'informations sur cette formule et le type de carte ici:
http://www.progonos.com/furuti/MapProj/Dither/CartHow/HowER_W12/howER_W12.html#DeductionEquirectangular
il y a beaucoup d'informations sur Internet sur le calcul de la distance entre deux couples de latitude et de longitude. Nous utilisons ces calculs sur notre site web public et ils ne sont pas triviaux à comprendre/discuter (donc je ne vais pas essayer de les couvrir ici). Cela dit, ils sont faciles à mettre en œuvre.
une fois que vous avez une fonction qui renvoie la distance, vous devriez être en mesure de caculer la largeur et la hauteur de la carte en termes de distance entre les coin.
vous pouvez alors calculer la distance horizontale et verticale de votre point à partir du coin supérieur gauche.
maintenant vous découvrez quel rapport de la largeur de la carte est représenté par la distance entre le côté gauche et votre point, appliquez ce rapport à la largeur du pixel et vous avez le nombre de pixels entre le côté gauche et votre point. Répétez l'opération pour l'axe des ordonnées.
(Pixels à partir de la gauche) = (largeur totale en pixels) * (distance géocodée entre la gauche et votre point de vue) / (géocodage distance entre le côté gauche et côté droit))
(Pixels from top) = (hauteur totale en pixels) * ((distance de géocode entre le haut et votre point) / (distance de géocode entre le haut et le bas))
EDIT: en cherchant plus loin, vous noterez que certaines solutions présenteront des résultats plus précis que d'autres en raison du fait que vous vous rapprochez de la distance entre deux points sur une surface sphérique et la cartographie que sur une surface plane. Le la précision diminue à mesure que la distance augmente. Le meilleur conseil pour vous est d'essayer d'abord et voir si elle répond à vos besoins.
C'est assez simple et simple.. laissez-moi vous expliquer comment son possible.
la Latitude et la Longitude sont des lignes imaginaires tracées sur la terre afin que vous puissiez localiser avec précision n'importe quel endroit du monde . simplement mis, ils sont X et Y coordonnées d'un avion. La Latitude est une ligne verticale allant du nord au sud, avec 90 ° au pôle nord et -90deg au pôle sud.
par contre, la Longitude est une ligne horizontale allant de l'est au sud avec-180deg dans l'ouest et 180deg dans l'est.
vous pouvez convertir le latLng en pixel coords comme en supposant que la largeur du conteneur html est la largeur du monde et la même chose s'applique à la hauteur.
formule-Longitude-pixel
(givenLng*widthOfContainerElement)/360
où 360 est la longitude totale en degrés
formule-Latitude-pixel
(givenLat*heightOfContainerElement)/180
où 180 est la latitude totale dans le degré
//Height is calculated from the bottom
vous pouvez trouver un travail de mise en œuvre de cette formule ici sur mon site web (il utilise JavaScript)
http://www.learntby.me/javascript/latLngconversion.php
laissez-moi savoir si vous avez encore besoin de précisions.
il existe de nombreux schémas différents de projection cartographique. Vous devez savoir quel(s) sont utilisés par vos cartes.
pour plus d'informations sur les algorithmes de projection de carte et de cartographie avant/arrière consultez ce lien. Il fournit les formules pour un certain nombre de projections.
Juste faire ce(pour la projection de Mercator de la carte):
extension UIView
{
func addLocation(coordinate: CLLocationCoordinate2D)
{
// max MKMapPoint values
let maxY = Double(267995781)
let maxX = Double(268435456)
let mapPoint = MKMapPointForCoordinate(coordinate)
let normalizatePointX = CGFloat(mapPoint.x / maxX)
let normalizatePointY = CGFloat(mapPoint.y / maxY)
let pointView = UIView(frame: CGRectMake(0, 0, 5, 5))
pointView.center = CGPointMake(normalizatePointX * frame.width, normalizatePointY * frame.height)
pointView.backgroundColor = UIColor.blueColor()
addSubview(pointView)
}
}
mon projet simple pour ajouter des coordonnées sur UIView: https://github.com/Glechik/MapCoordinateDrawer
<!DOCTYPE html>
<html>
<head>
<style>
#point{font-face:Arial; font-size:18px; color:#FFFF00; width:12px; height:12px;text-shadow: 2px 2px #000000}
#canvas {position: absolute; top: 0px; left: 0px; z-index: -2}
html,
body,
#canvas {
width: 100%;
height: 100%;
overflow: hidden;
margin: 0
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
<script>
$(window).on("load resize",function(e){
var w = $("#canvas").width();
var h = $("#canvas").height();
// New York, NY (https://maps.googleapis.com/maps/api/geocode/json?address=New%20York,%20NY)
var lat = 40.91525559999999;
var long = -73.70027209999999;
var x = ((w/360) * (180 + long)) - 9;
var y = ((h/180) * (90 - lat)) - 18;
$("#text").text('X:'+x+', Y:'+y);
$("#point").offset({ top: y, left: x });
});
</script>
</head>
<body>
<div id="text"></div>
<div id="point">▼</div>
<img id="canvas" border="0" src="http://friday.westnet.com/~crywalt/dymaxion_2003/earthmap10k.reduced.jpg">
</body>
</html>