9 votos

¿Conversión de ráster a vector generando líneas centrales?

Tengo un ráster binario que contiene píxeles de límite con el valor 1 (blanco) y píxeles sin límite con el valor 0 (negro):

enter image description here

Me gustaría vectorizar el raster manteniendo una línea central a través de los píxeles de los límites. Sin embargo, la mayoría de los métodos de poligonización que he probado (por ejemplo, gdalogr:polygonize, dan como resultado dos líneas alrededor del contorno de los píxeles del límite (líneas rojas) o ninguna salida (saga:gridskeletonization): enter image description here

¿Me he perdido algún método con el que se pueda hacer esto fácilmente? ¿O tengo que vectorizar primero la trama a una capa vectorial que contenga dos líneas paralelas y encontrar una manera de esqueletar/centrar las dos líneas?

8voto

Kristi Puntos 1

GRASS GIS es capaz de hacerlo.

Necesitas dos pasos:

  1. r.thin

Adelgaza las celdas no nulas que denotan características lineales en una capa de mapa rasterizado.

  1. r.to.vect

Convierte un mapa rasterizado en un mapa vectorial.

0 votos

A mí me funciona después de establecer un valor nodata al raster con gdal_translate -a_nodata .

0 votos

La solución de @RoVo no me ha funcionado del todo. Pude iniciar r.thin después de convertir la trama binaria con gdal_translate -ot INT32 src_dataset dst_dataset . Parece que a menudo se requieren conversiones similares antes de aplicar r.thin para evitar el error ERROR: La trama de entrada debe ser del tipo CELL [véase el siguiente enlace] ( gis.stackexchange.com/questions/197145/ ). Sin embargo, cuando se ejecuta r.to.vect en la trama creada con r.thin GRASS siempre deja de funcionar, incluso cuando se aplica a pequeñas extensiones de la trama.

0 votos

Ese parece ser un problema diferente.

5voto

vordep Puntos 38

Ahora me ha funcionado como sugirió antes @RoVo. El problema eran los valores sin datos en mi raster de entrada. Los cambié no con gdal_translate como sugiere @AndreJ (en los comentarios de la respuesta anterior), sino con GRASS r.mapcalc. Aquí los módulos que utilicé:

Reemplazar todos los valores sin datos:

processing.runalg('grass:r.mapcalculator',
                  {"amap": gPb_rlayer,
                   "formula": "if(A>0, 1, null())",
                   "GRASS_REGION_PARAMETER": "%f,%f,%f,%f" % (xmin, xmax, ymin, ymax),
                   "GRASS_REGION_CELLSIZE_PARAMETER": 1,
                   "outfile": mapcalc})

Capa de trama fina para adelgazar las celdas no nulas:

processing.runalg('grass7:r.thin',
                  {"input": mapcalc,
                   "GRASS_REGION_PARAMETER": "%f,%f,%f,%f" % (xmin, xmax, ymin, ymax),
                   "output": thinned})

Conversión de ráster a vector:

processing.runalg('grass7:r.to.vect',
                  {"input": thinned,
                   "type": 0,
                   "GRASS_OUTPUT_TYPE_PARAMETER": 2,
                   "GRASS_REGION_PARAMETER": "%f,%f,%f,%f" % (xmin, xmax, ymin, ymax),
                   "output": centerlines})

enter image description here

0 votos

Esto también funcionó en QGIS, aunque r.thin tardó como una hora en completarse.

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