Convertir longitud / latitud a píxeles en el mapa

10

Tengo un mapa de aquí . Quiero poder convertir simplemente pares arbitrarios de lon / lat a píxeles en el mapa (también la capacidad de realizar conversiones inversas). Los mapas vienen con el archivo .tfw y la información de proyección, aquí está:

0.02222222222222 
0.00000000000000 
0.00000000000000 
-0.02222222222222 
-180.00000000000000 
90.00000000000000

e información de proyección:

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

Soy completamente nuevo en cosas relacionadas con la cartografía, y por lo que descubrí, primero debería hacer la transformación de WGS84 (par lon / lat) a proyección geográfica (¿no son lo mismo?). Me parece que son iguales, en realidad, pero el radio de la esfera en la información de proyección anterior es 6370997 y es diferente de la página spatialreference.com que encontré para la proyección Plate Carree. De todos modos, encontré la biblioteca DotSpatial.Projections puede hacer esto por mí, con el siguiente código:

    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);

Y luego debo traducir las coordenadas resultantes a píxeles en el mapa usando el archivo mundial. Soy consciente de la siguiente fórmula:

imagen de wikipedia

Pero parece que hay grados, no metros en el archivo mundial y no sé qué hacer con ellos. En general, ¿estoy haciendo las cosas bien? ¿O hay una manera más fácil, dados mis datos?

Dmitry Marchuk
fuente
1
Basado en el archivo mundial, el ráster está utilizando latitud-longitud y grados como unidades. El tamaño de la celda es de 0.0222 grados. Esto a veces se conoce como pseudoplaca Carree. Plate Carree escalaría y convertiría los valores a metros. También hay una mezcla de datos que se llama WGS84, pero se menciona una esfera con radio = 6370997. Intentando usar WKID: 4326.
mkennedy
@mkennedy ¿Creo que la fórmula anterior aplicada al archivo mundial no daría lugar a nada significativo porque fue diseñada para medidores? Tampoco sé y busqué en Google sin ningún resultado lo que significa WKID: 4326.
Dmitry Marchuk

Respuestas:

6

No hay transformación entre las coordenadas, sino hacia / desde las posiciones de píxeles, de esta manera: asumimos que px, py es una posición de píxeles en su mapa, mientras que geox y geoy son coordenadas del mundo real. También tenemos xOff, yOff tomado del tfw, con -180, 90 plus xsize e ysize, con 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

las dos pseudo funciones anteriores nos dicen la geolocalización (geox, geoy) para una posición de píxel dada y, creo que eso es lo que solicitó, la posición de píxel para una geolocalización dada. Esto solo es posible, porque la "placa de placa" trata los grados geográficos con longitud y latitud como coordenadas métricas en un plano (dentro de un sistema de coordenadas rectangular). Si dibujaras la retícula de la tierra, obtendrías cuadrados de igual tamaño (y así es como se ve tu imagen del mapa). Después de editar mis errores, ahora obtengo con lon / lat (50.4546600, 30.5238000) obtengo (10370.459803704598, 2676.42902676429). Conviértalo a entero, si necesita píxeles indizados.

Andreas Müller
fuente
px = (geox + xOff) / xsize, por ejemplo, sería (50.4546600 + (-180)) / 0.02222222222222negativo y aproximadamente igual 5830. Que no es 2113.3936363636362. Por favor, explique más o corrija la respuesta.
Dmitry Marchuk
El código original estaba en JavaScript con algunas dependencias, lo comprobaré ...
Andreas Müller
Cambié el código y el texto de arriba, porque tuve un error al copiarlo de un JavaScript.
Andreas Müller el