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:
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?
la source
Réponses:
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
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.
la source
px = (geox + xOff) / xsize
, par exemple, serait(50.4546600 + (-180)) / 0.02222222222222
négatif et à peu près égal5830
. Ce qui ne l'est pas2113.3936363636362
. Veuillez expliquer davantage ou corriger la réponse.