web-dev-qa-db-fra.com

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 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?

25
Jorge

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.

19
Gubatron

Si vous utilisez la carte de type à projection cylindrique équidistante , voici ce que vous devez faire:

  1. Trouvez la latitude et la longitude de votre didacticiel de localisation ici:
    http://lifehacker.com/267361/how-to-find-latitude-and-longitude
  2. Saisissez ces informations dans les formules suivantes:
    x = (largeur totale de l'image en px) * (180 + latitude)/360
    y = (hauteur totale de l'image en px) * (90 - longitude)/180

    remarque: lorsque vous utilisez une longitude de latitude négative, assurez-vous d'ajouter ou de soustraire le nombre négatif, c'est-à-dire + (- 92) ou - 35) qui serait en fait -92 et +35

  3. Vous avez maintenant vos X et Y à tracer sur votre image

    Pour plus d'informations sur cette formule et le type de carte, cliquez ici:
    --- (http://www.progonos.com/furuti/MapProj/Dither/CartHow/HowER_W12/howER_W12.html#DeductionEquirectangular
11
Anthony Master

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.

8
Mayo

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.

7
Krishna sagar

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.

5
Eric J.

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

2
Savchenko Dmitry
<!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>
1
Omer