Convertir la longitude / latitude en pixels sur la carte


10

J'ai une carte d' ici . Je veux pouvoir convertir simplement une paire lon / lat arbitraire en pixels sur la carte (également la possibilité de faire une conversion inverse). Les cartes sont livrées avec le fichier .tfw et les informations de projection, la voici:

0.02222222222222 
0.00000000000000 
0.00000000000000 
-0.02222222222222 
-180.00000000000000 
90.00000000000000

et infos de projection:

Projection: Plate Carree aka Geographic or "LatLong"
Earth ellipsoid: Sphere, radius 6370997 m
Datum: WGS84
Extent: 180 West to 180 East, 90 North to 90 South
Size: 16,200 height samples wide x 8,100 high
Resolution: 2.47 km/pixel

Je suis complètement nouveau dans le domaine de la cartographie, et pour autant que je sache, je devrais d'abord faire la transformation de WGS84 (paire lon / lat) en projection géographique (ne sont-ils pas les mêmes?). Il me semble que ce sont les mêmes, en fait, mais le rayon de la sphère dans les informations de projection ci-dessus est 6370997 et est différent de la page spatialreference.com que j'ai trouvée pour la projection Plate Carree. Quoi qu'il en soit, j'ai trouvé que la bibliothèque DotSpatial.Projections peut le faire pour moi, avec le code suivant:

    var kievCoordinates = new[] { 50.4546600, 30.5238000 };
    var z = new[] { 1.0 };

    var wgs84 = KnownCoordinateSystems.Geographic.World.WGS1984;
    var dest = new ProjectionInfo();
    dest.ParseEsriString(
        "PROJCS[\"WGS 84 / Plate Carree (deprecated)\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]],PROJECTION[\"Equidistant_Cylindrical\"],PARAMETER[\"central_meridian\",0],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"Meter\",1]]");

    Reproject.ReprojectPoints(kievCoordinates, z, wgs84, dest, 0, 1);

Et puis je dois traduire les coordonnées résultantes en pixels sur la carte en utilisant le fichier monde. Je connais la formule suivante:

image wikipedia

Mais il semble qu'il y ait des degrés et non des mètres dans le fichier mondial et je ne sais pas quoi en faire. En général, est-ce que je fais les bonnes choses? Ou il existe un moyen plus simple, compte tenu de mes données?


1
Basé sur le fichier mondial, le raster utilise la latitude-longitude et les degrés comme unités. La taille des cellules est de 0,0222 degrés. Ceci est parfois connu sous le nom de pseudo-plaque Carree. Plate Carree mettrait à l'échelle et convertirait les valeurs en mètres. Il existe également un mélange de données appelé WGS84, mais une sphère de rayon = 6370997 est mentionnée. Essayer d'utiliser WKID: 4326.
mkennedy

@mkennedy Je pense que la formule ci-dessus appliquée au fichier mondial ne donnerait rien de significatif car elle a été conçue pour les compteurs? Je ne sais pas non plus et googlé sans résultat ce que signifie WKID: 4326.
Dmitry Marchuk

Réponses:


6

Il n'y a pas de transformation entre les coordonnées mais vers / depuis les positions des pixels, comme ceci: nous supposons que px, py est une position de pixel dans votre carte, tandis que geox et geoy sont des coordonnées du monde réel. Nous avons également xOff, yOff provenant du tfw, avec -180, 90 plus xsize et ysize, avec 0,02222222222222, -0,02222222222222

pix2coord(px,py)
    geox = xOff + (px * xsize)
    geoy = yOff + (py * ysize)

coord2pix(geox, geoy)
    px = (geox - xOff) / xsize 
    py = (geoy - yOff) / ysize

les deux pseudo-fonctions ci-dessus nous indiquent la géolocalisation (geox, geoy) pour une position de pixel donnée, et, je pense que c'est ce que vous avez demandé, la position de pixel pour une géolocalisation donnée. Cela n'est possible que parce que la "plaque carrée" traite les degrés géographiques avec la longitude et la latitude comme des coordonnées métriques sur un plan (dans un système de coordonnées rectangulaires). Si vous dessiniez le graticule de la terre, vous obtiendriez des carrés de taille égale (et c'est ce que votre image de carte ressemble). Après avoir édité mes erreurs, j'obtiens maintenant avec lon / lat (50.4546600, 30.5238000) j'obtiens (10370.459803704598, 2676.42902676429). Castez-le en entier, si vous avez besoin de pixels.


px = (geox + xOff) / xsize, par exemple, serait (50.4546600 + (-180)) / 0.02222222222222négatif et à peu près égal 5830. Ce qui ne l'est pas 2113.3936363636362. Veuillez expliquer davantage ou corriger la réponse.
Dmitry Marchuk du

Le code original était en javascript avec quelques dépendances, je vais vérifier ...
Andreas Müller

J'ai changé le code et le texte ci-dessus, car j'ai eu une erreur lors de la copie à partir d'un JavaScript.
Andreas Müller
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.