7 votos

Crear mapa de bits a partir de datos OSM y GeoTIFF en Python

Quiero crear un mapa de bits (como un array numpy 2D) para una imagen de satélite dada en formato GeoTIFF. El mapa de bits debe tener las mismas dimensiones que el GeoTIFF y debe obtener el valor 1 en cada píxel donde el GeoTIFF tenga agua.

Mi enfoque actual sería:

  1. Obtener los límites de GeoTIFF.
  2. Consulta la API de paso superior para todas las características con "natural=agua".
  3. Inicializa un array numpy con las mismas dimensiones que GeoTIFF.
  4. Traducir Lat/Lon de características OSM a índices en array numpy.
  5. Usa los índices del paso 4 para poner las entradas del array numpy a 1.

Mi problema está en el paso 5. Las zonas acuáticas suelen ser vías cerradas, que no son más que una lista de nodos. Esto significa que en mi matriz numpy tendría que identificar todos los índices que se encuentran en el polígono definido por los nodos dados. Esto suena como un problema adecuado para Shapely pero he mirado en la documentación de Polygons y no he encontrado nada.

Podría hacer un bucle a través de cada índice posible en mi matriz numpy y comprobar si ese punto se encuentra en mi polígono, pero eso parece ser un poco engorroso para mí.

Así que mi pregunta es: ¿Existe una solución fácil para el problema del paso 5?

¿Todo este proceso parece razonable o hay una forma más directa de crear un mapa de bits para la aparición de agua en un GeoTIFF?

3voto

Antonio Haley Puntos 2588

Este proceso suele denominarse "rasterización" y su planteamiento es acertado. Shapely no hace esto, pero su paquete hermano, Rasterio, hace los pasos 1, 3, 4, 5: https://mapbox.github.io/rasterio/topics/features.html#burning-shapes-into-a-raster . Si puede obtener polígonos de masas de agua de OSM en formato GeoJSON (utilizando http://wiki.openstreetmap.org/wiki/Overpass_turbo/GeoJSON ), puedes grabar los polígonos en una matriz numpy utilizando la función de Rasterio features.rasterize método: https://mapbox.github.io/rasterio/api/rasterio.features.html#rasterio.features.rasterize .

2 votos

Comprobación de natural=water no será suficiente si se encuentra en medio del océano (véase overpass-turbo.eu/s/kWS como ejemplo), ya que no devolvería ningún dato. Además, incluir waterway=* también puede ser necesario. Como consejo más general, puede echar un vistazo a herramientas como OSMCoastLine o tal vez el estilo de renderizado OpenStreetMap-Carto en osm.org para inspirarse. Incluso puedes descargar polígonos de agua ya creados aquí: openstreetmapdata.com/data/water-polygons

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