6 votos

¿Cómo convertir la posición x, y en una imagen georreferenciada (con archivo de mundo) a longitud, latitud?

¿Qué pasos necesito seguir para calcular la longitud y latitud de un píxel específico en una imagen georreferenciada? Por ejemplo, esta imagen http://www.shadedreliefarchive.com/medit_Mideast_africa_copy.html contiene información, archivo .tfw:

1627.32174969982000 
0.00000000000000 
0.00000000000000 
-1627.32174969982000 
-4957506.34276705000000 
6096922.76188281000000 

y archivo .prj:

PROJCS["Lambert Azimuthal Equal-Area",
       GEOGCS["GCS_WGS_1984",
              DATUM["D_WGS_1984", SPHEROID["WGS_1984", 6378137, 298.257223563]],
              PRIMEM["Greenwich", 0],
              UNIT["Degree", 0.017453292519943295]],
       PROJECTION["Lambert_Azimuthal_Equal_Area"],
       PARAMETER["false_easting", 0],
       PARAMETER["false_northing", 0],
       PARAMETER["latitude_of_origin", 0],
       PARAMETER["central_meridian", 20],
       PARAMETER["xy_plane_rotation", 0],
       UNIT["Meter", 1]]

He creado este fragmento de código en javascript para calcular nuevos valores x1 y y1 para píxeles específicos en la imagen:

var A = 1627.32174969982000,
    D = 0.00000000000000,
    B = 0.00000000000000,
    E = -1627.32174969982000,
    C = -4957506.34276705000000,
    F = 6096922.76188281000000;

function x1(x, y) { return A*x + B*y + C; }

function y1(x, y) { return D*x + E*y + F; }

¿Qué más debo hacer para obtener la longitud y latitud? Por ejemplo, ¿C, F representan la esquina superior izquierda de la imagen, verdad? Entonces, ¿cómo traduzco C, F para obtener la longitud y latitud?

Quiero hacerlo usando solo javascript, he visto http://proj4js.org/ pero realmente no entiendo qué hacer con los valores que obtengo...

1 votos

¿no necesitas reproyectar la imagen de ráster con un paquete GIS primero?

0 votos

Con suerte no, me gustaría tener una función para convertir posiciones de píxeles en la imagen a posiciones de latitud/longitud y también, de ser posible, la traducción inversa.

0 votos

Solo un comentario: por lo general, las personas usan las coordenadas del centro de píxeles para calcular sus (latitud, longitud). Si eso es lo que quieres hacer, entonces en tu fragmento de código debes primero sumarle 1/2 a cada uno de los valores de x e y (asumiendo que son índices de fila y columna).

5voto

Slayd Puntos 111

El archivo .tfw representa la transformación afín para la imagen, es decir, cómo se mapean las coordenadas de píxeles de la imagen a coordenadas en el espacio definido por el archivo .prj.

Aquí tienes una explicación de los valores: http://en.wikipedia.org/wiki/World_file

Llegar a coordenadas geográficas es, por lo tanto, un proceso de dos pasos:

  • Encuentra las coordenadas del píxel en el sistema de coordenadas proyectadas
  • Desproyecta estas coordenadas de vuelta al sistema de coordenadas geográficas para obtener latitud y longitud.

La fórmula para el primer paso:

X_proj = C + (A * X_img) + (B * Y_img) 
Y_proj = F + (E * Y_img) + (D * X_img)

Nota: Estoy usando las variables A..F del artículo que enlazaste, ¡no las de tu código de arriba! No creo que correspondan; el artículo de Wikipedia eligió etiquetas que no se corresponden con los números de línea.

Ahora tienes las coordenadas X & Y en tu sistema de coordenadas deseado. Dado que estás utilizando Javascript (usando proj4js; perdóname si no he probado el código a continuación):

var source = new Proj4js.Proj('PROJ4_ARGS_FOR_YOUR_PROJECTION');
var dest = new Proj4js.Proj('EPSG:4326') // coordenadas geográficas + WGS84 (que coincide con el elipsoide utilizado en tu archivo .prj)

var p = new Proj4js.Point(X_proj, Y_proj)
Proj4js.transform(source, dest, p)

// p.x & p.y son ahora latitud y longitud. (o longitud y latitud, no puedo recordar el orden de las coordenadas)

Utilicé spatialrefrence.org para convertir tu archivo .prj en argumentos para Proj4; puedes verlo aquí haciendo clic en 'proj4': http://spatialreference.org/ref/sr-org/7119/ En general, la transformación de .prj a argumentos de proj4 es puramente mecánica.

0 votos

Gracias, no entiendo lo que sucede en spatialreference.org, pero ahora tengo algunas cosas para probar :)

1 votos

@antonj - Es simplemente la forma perezosa (y enlazable a la web) que solía utilizar para convertir tus parámetros .prj en argumentos proj4j. El sitio te ofrece muchas formas de descargar una referencia espacial, pero el enlace "proj4" es el que te interesa. Todos son la misma información de referencia espacial, solo en formatos diferentes. Por ejemplo, la "Proyección Azimutal Equivalente de Lambert" en tu .prj se traduce directamente en el argumento +proj=laea en la versión "proj4"; el "meridiano central" de 20 se traduce en +lon_0=20, etc.

2voto

Symmetric Puntos 158

No soy muy programador de js, pero esto me funciona:

Transformaciones de Coordenadas Geográficas en Javascript

// Pon tu definición de proyección aquí.
Proj4js.defs["EPSG:3575"] = "+proj=laea +lat_0=90 +lon_0=10 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs";

var A = 1627.32174969982000,
    D = 0.00000000000000,
    B = 0.00000000000000,
    E = -1627.32174969982000,
    C = -4957506.34276705000000,
    F = 6096922.76188281000000;

function frompixel(px, py) {
    px += 0.5; // Agregar un desplazamiento de medio píxel para obtener las coordenadas del centro del píxel.
    py += 0.5;
    return {x : A*px + B*py + C, y: D*px + E*py + F};
}

function tolatlong(x, y) {
    var src = new Proj4js.Proj('EPSG:3575'); // Mismo código que definiste arriba. Alternativamente, deja que proj4js obtenga la definición de spatialreference.org
    var dest = new Proj4js.Proj('EPSG:4326');
    var p = frompixel(x, y);

    document.write('Desde coordenadas: ');
    document.writeln(p.x, ',', p.y);

    // Esta es la parte que hace la transformación de coordenadas del mapa a lat/long.
    Proj4js.transform(src, dest, p);
    document.write('A lat/long: ');
    document.writeln(p.x, ',', p.y);
}

    tolatlong(100, 100);

Naturalmente, tendrás que jugar un poco con el código para integrarlo con tu página web, pero el principio debería ser correcto.

0 votos

Divertido... dimos, más o menos, la misma respuesta exacta al mismo tiempo. ;)

0 votos

Es bueno saber que ambos tenemos una posibilidad razonable de estar en lo correcto :)

0 votos

Al leer más detenidamente, no estoy seguro de que tu +0.5 sea correcto. (Ver el comentario que dejé en la discusión sobre la pregunta principal.)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X