Mi proyecto favorito actual consiste en crear un servicio web que utilice el conjunto de datos mundiales de elevación SRTM del CGIAR. Cada petición al servicio consultará los datos de elevación de una pequeña área geográfica.
Almacenar todos los datos de forma que puedan consultarse rápidamente resulta difícil. Mi mejor idea es guardar los datos en archivos GeoTIFF y crear un índice que vincule las coordenadas lat/lon a los archivos. Lo que me lleva a mi principal problema actual:
¿Cómo puedo obtener los valores de elevación de un archivo GeoTIFF? Conozco la proyección, la escala y la orientación de los archivos GeoTIFF (es decir, sé qué valores lat/lon representa cada píxel). ¿Cómo puedo averiguar a qué elevación se refiere ese píxel? Tengo que usar PHP y pensé que podría usar la función ImageMagick para leer el color de un píxel. Desafortunadamente, devuelve R=2 G=2 B=2 para todos los píxeles.
actualización
Para responder a la pregunta de otra persona, he aquí mi solución.
Utilicé la biblioteca de Bob Osola sugerida en la respuesta aceptada más abajo e hice los siguientes cambios para ajustarla al formato de archivo SRTMv4.1 (el que está disponible en el sitio web del CGIAR). Actualizar las constantes a:
const NUM_DATA_ROWS = 6000; // the number of data rows in the file ( = ImageLength tag value)
const NUM_DATA_COLS = 6000; // the number of data columns in the file ( = ImageWidth tag value)
const DEGREES_PER_TILE = 5; // each tile is 5 x 5 degrees of lat/lon
const PIXEL_DIST = 0.000833333; // the distance represented by one pixel (0 degrees 0 mins 3 secs of arc = 1/1200)
const STRIPOFFSETS = 0x44bbd5c; // the offset address of the 'StripOffsets' tag
Además, había un error en el cálculo de la longitud. Para solucionarlo, sustituya
$topleftLon = 180 - (($tileRefHoriz -1) * self::DEGREES_PER_TILE);
if ($lon < 0) {
$topleftLon = -$topleftLon;
}
por
$topleftLon = (($tileRefHoriz -1) * self::DEGREES_PER_TILE) - 180;
Eso es todo.