¿Cómo obtener un perfil de elevación para una pista de gps?

15

Me gustaría obtener un perfil de elevación razonablemente preciso para una pista grabada con un GPS (que a menudo tiene datos de altitud muy poco fiables y en ocasiones ninguno, según el modelo).

¿Alguien tiene alguna sugerencia sobre la forma más fácil de hacer esto? Las dos técnicas que estoy considerando hasta ahora son:

  • Utilizando el API de elevación de Google

    Esta API es relativamente fácil de usar, pero aún requiere algunos pasos que no son triviales debido a sus restricciones de uso: máximo de 512 muestras devueltas por solicitud, y el número de puntos a lo largo de la ruta es limitado (por la longitud de la URL) también.

    Espero que se pueda diseñar un gpsbabel simplify filter para reducir la pista a un número adecuado de puntos (no tiene sentido que estén más cerca de 100 m más o menos juntos debido a la resolución de los datos de altitud), pero luego sigue existiendo el problema de cómo asignar esta pista simplificada de nuevo a la ruta original, ya que las longitudes serán diferentes.

    O, si esto no es adecuado para la automatización, el mejor enfoque puede ser permitir que el usuario seleccione los puntos de transecto en un mapa manualmente.

  • Descargar los datos de la Misión de la Topografía del Radar del Transbordador (SRTM) y realizar la consulta localmente.

    Esto es algo con lo que no tengo experiencia, por lo que cualquier sugerencia sobre qué tan factible es esto es bienvenida. ¿Qué tan grande es el conjunto de datos? ¿Qué software GIS se requiere, y puede ser programado de una manera adecuada? Prefiero no tener que escribir un algoritmo de muestreo e interpolación, ya que suena como un dolor . ¿Cuál es el rendimiento probable de tal enfoque? (Necesito que sea bastante rápido y que se ejecute en un servidor web VPS con memoria limitada ...)

Algunos detalles adicionales para completar la respuesta de @MerseyViking es descargar los datos de enlace :

Hay 72 x 24 mosaicos, cada uno sobre un archivo zip de 20 mb que se descomprime en un archivo TIF de 72.1 mb de 16 bits (6001x6001 píxeles).

Eso es ~ 120 gb, que es más de lo que puedo almacenar. Dejarlo comprimido e ignorar los océanos lo reducirá a quizás 10 gb, lo que todavía es un poco demasiado grande. Cargar los datos a pedido reduciría drásticamente el espacio de almacenamiento necesario, pero el sitio de origen es lento (solo estaba obteniendo 10kb / s), lo que lo hace bastante poco práctico.

    
pregunta Tom 18.11.2011 - 10:49

5 respuestas

9

Para una solución local, se puede crear una secuencia de comandos de GRASS para hacer esto:

# extract raster values at our points
# use cubic convolution for interpolation between DEM locations
v.drape in=my_pts out=pts_srtm_elev type=point rast=srtm_dem method=cubic

Me encontré con una versión extendida de este para uno de mis los casos de uso y el rendimiento de v.drape no fueron ningún problema en absoluto.

    
respondido por el underdark 18.11.2011 - 12:02
5

gpsvisualizer.com lo hará por usted. Creo que está usando GPSBabel y Google API en segundo plano.

    
respondido por el Llaves 20.11.2011 - 07:55
5

Parece que necesita esto como una solución genérica, es decir, tiene todos los datos de elevación del mundo disponibles para cualquier pista que desee procesar, por lo que no desea almacenar todos los datos de CGIAR localmente; El gpsvisualizer.com mencionado anteriormente (@Llaves) puede ser su mejor apuesta.

Si no necesita alta resolución, el conjunto de datos de GTOPO (cuadrícula de 1 km) es solo ~ 300MB para todo el planeta; de lo contrario, los conjuntos de datos ASTER GDEM (30m) y SRTM original (90m) están disponibles pero, como usted señala, una gran cantidad de datos. (El tamaño de los datos ASTER se puede reducir después de la descarga al eliminar los archivos PDF agrupados que a menudo son más grandes que los datos de elevación reales. ¡El conjunto de datos de África se redujo en un 40% cuando hice esto!).

En R, puede extraer el perfil de elevación de cualquiera de estos conjuntos de datos con bastante rapidez, aunque la carga del ráster puede llevar la mayoría del tiempo. Esto utiliza una pequeña función readGPX personalizada y gpsbabel para procesar datos GPX:

#Load elevation model and process track:
dem <- raster("E020N40.DEM")
track <- readGPXt("trackfile.gpx")
coordinates(track) <- ~Longitude+Latitude
proj4string(track) <- "+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs"
#Overlay (extract) the elevation data for the track points:
track$profile <- extract(dem, track)
track <- as.data.frame(track)

'track' es ahora una tabla de puntos GPS con lat / lon, otros datos GPX estándar (velocidad, elevación de GPS, etc.) y una columna de 'perfil' que indica la elevación en ese punto.

    
respondido por el Simbamangu 25.11.2011 - 07:26
4

Los datos SRTM son fáciles de descargar para un área determinada, he usado este sitio en la pasado. Los archivos no son enormes, y puede obtenerlos como archivos TIFF georreferenciados. Descargar todo el mundo puede tardar un poco, pero un par de fichas cubre un área bastante grande. El problema que podría tener es con la resolución horizontal, que es de aproximadamente 90 metros para la mayor parte del mundo, y el error vertical puede ser bastante grande, con picos y áreas de datos faltantes.

El conjunto de datos ASTER GDEM es una encuesta más reciente y de mayor resolución con una resolución horizontal de ~ 30 m, pero la calidad suele ser inferior a los datos SRTM correspondientes.

No sé en qué resolución se encuentran los datos de elevación de Google, pero no me sorprendería si estuviera basado en SRTM, por lo que el uso de la API de Google puede proporcionarle resultados similares a los de un proceso local.

Siguiendo con la respuesta de @underdark, si se trata de un sistema simple basado en la web, GRASS GIS es probablemente el camino a seguir. He usado r.profile para hacer diagramas de intervisibilidad simples con cierto éxito, pero no estoy seguro qué método de interpolación utiliza; posiblemente podría ser el vecino más cercano. Editar : mirando el código fuente , r.profile usa el vecino más cercano, por lo que es posible que obtengas algunos artefactos escalonados.

Otra opción podría ser escribir un script de Python, usando GDAL y NumPy , que puede ser un poco más de trabajo, pero sería una buena solución personalizada.

    
respondido por el MerseyViking 19.11.2011 - 14:54
3

Primero debes especificar con qué tipo de precisión horizontal / vertical estarías satisfecho.

Pero veamos esto desde una perspectiva práctica:

  • Cada mosaico SRTM3 tiene 1200x1200 celdas , cada celda es un valor entero de dos bytes que representa la elevación en metros. Eso es alrededor de 2.75 MB de datos sin comprimir sin procesar.
  • Hay 14042 azulejos SRTM3. Eso es cca. 38 GB de datos sin procesar.
  • ¿Realmente necesitas cubrir todo el mundo? Me imagino que no hay mucho interés en mostrar el perfil de elevación de una pista de GPS en el medio del Sahara, el desierto de Gobi o Siberia, por lo que no es económicamente factible cubrirla si tiene poco dinero (BTW: SRTM3 no cubre todo el mundo , por lo que no debe preocuparse por lugares como Groenlandia y la Antártida;)).
  • Con un poco de compresión inteligente y codificación de datos, podría reducir drásticamente el tamaño del conjunto de datos. Los valores de elevación son de 0 a 8848, por lo que los dos bits restantes no se utilizan. También puede codificar elevaciones a través de la compresión delta para reducirla aún más. También puede renunciar a algo de la precisión vertical (a, digamos, 2 m, que luego le ahorra un bit extra para cada celda.
  • Dependiendo de los tipos de rastreos de GPS que se usarán para (caminar, montar en bicicleta, conducir ...), debe almacenar los datos en mosaicos más pequeños (por ejemplo, 0.25x0.25 grados) como archivos en el disco o filas en un tabla de base de datos.
  • Use algún caché de memoria inteligente para los mosaicos para que no tenga que volver a cargar los que se usan con frecuencia.
  • Calcular la elevación desde las celdas es la parte fácil de todo este negocio.
respondido por el Igor Brejc 25.11.2011 - 16:38

Lea otras preguntas en las etiquetas