Si j'ai une carte jpeg avec la taille sizeX, sizeY
et quelques points d'étalonnage sur la carte (X, Y, Lon, Lat)
Quel serait l'algorithme pour calculer le point XY correspondant sur la carte avec une paire Longitude/Latitude donnée?
Voici ce qui a fonctionné pour moi, sans trop de bs.
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 les appareils Android. Donc, elles devraient être dans le même standard utilisé par tous les produits Google Earth/Map.
Si vous utilisez la carte de type à projection cylindrique équidistante , voici ce que vous devez faire:
Il existe de nombreuses informations sur Internet sur le calcul de la distance entre deux paires de latitude et de longitude. Nous utilisons ces calculs sur notre site Web public et ils ne sont pas triviaux à comprendre/discuter (donc je n'essaierai pas 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 pouvoir calculer la largeur et la hauteur de la carte en termes de distance entre les coins.
Ensuite, vous pouvez 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 des pixels 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 y.
(Pixels du côté gauche) = (largeur totale en pixels) * ((distance du géocodage entre la gauche et votre point)/(distance du géocodage entre le côté gauche et le côté droit))
(Pixels de haut) = (hauteur totale en pixels) * ((distance de géocodage entre le haut et votre point)/(distance de géocodage entre le haut et le bas))
EDIT: Au fur et à mesure de vos recherches, vous remarquerez que certaines solutions présenteront des résultats plus précis que d'autres en raison du fait que vous approximez la distance entre deux points sur une surface sphérique et que vous la cartographiez sur une surface plane. La précision diminue à mesure que la distance augmente. Le meilleur conseil pour vous est de l'essayer d'abord et de voir s'il répond à vos besoins.
C'est assez simple et simple .. laissez-moi vous expliquer comment c'est 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. mettez simplement ce sont les coordonnées X et Y d'un avion. La latitude est une ligne verticale allant du nord au sud avec ses 90 degrés au pôle nord et -90 degrés au pôle sud.
La longitude, d'autre part, est une ligne horizontale allant d'est en sud avec -180 degrés à l'ouest et 180 degrés à l'est.
vous pouvez convertir le latLng en coordonnées pixel 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 en degrés
//Height is calculated from the bottom
vous pouvez trouver une implémentation fonctionnelle de cette formule ici, sur mon site Web (il utilise uniquement JavaScript)
http://www.learntby.me/javascript/latLngconversion.php
faites-moi savoir si vous avez encore besoin de clarifications.
Il existe de nombreux schémas de projection cartographique différents. Vous devez savoir lesquels sont utilisés par vos cartes.
Pour plus d'informations sur les algorithmes de projection de carte et la cartographie avant/arrière, consultez ce lien . Il fournit les formules d'un certain nombre de projections courantes.
Faites ceci (pour la carte de projection Mercator):
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>