40 votos

¿Crear un shapefile que muestre las huellas de los Rasters?

Tengo alrededor de 1.000 imágenes de satélite en formato tiff, y quiero crear un shapefile que sirva de índice a los rasters. Se trata de algo parecido a un catálogo raster, pero no quiero construir un catálogo raster.

Algunos obstáculos que puedo prever, es que la imagen está georreferenciada, por lo que no tienen forma rectangular (me refiero al área de datos).

Para aclarar, requiero que el polígono cubra sólo los píxeles no nódicos del raster, y no todo el raster rectangular. La mayoría de las respuestas hasta ahora, dan un polígono rectangular, que cubre los datos, así como los píxeles no datos.

Mi imagen A sample Satellite Image


Resultado dado por las herramientas que he examinado (como raster catlog, varios Arcscripts, script Python personalizado dado en una de las respuestas): Result


Resultado que quiero: enter image description here

15voto

Dave Haynes Puntos 999

Existe un plugin en QGIS llamado Límite de la imagen . Es una gran herramienta. Dentro de esta herramienta hay una opción de "Píxeles válidos" que omitirá los bordes negros de una imagen de satélite, por ejemplo.

[Actualización: Este plugin ya no existe en QGIS 3.12.3. El plugin "Image footprint" existe pero está obsoleto y no parece funcionar].

10voto

Arda Xi Puntos 1099

El siguiente código tomará un raster de entrada, obtendrá su extensión, e insertará esa extensión en una featureclass de polígono:

import arcpy

r = arcpy.Raster(in_raster)
point = arcpy.Point()
array = arcpy.Array()

corners = ["lowerLeft", "lowerRight", "upperRight", "upperLeft"]

cursor = arcpy.InsertCursor(fc)
feat = cursor.newRow()
for corner in corners:    
    point.X = getattr(r.extent, "%s" % corner).X
    point.Y = getattr(r.extent, "%s" % corner).Y
    array.add(point)
array.add(array.getObject(0))
print len(array)
polygon = arcpy.Polygon(array)
feat.shape = polygon
cursor.insertRow(feat)
array.removeAll()
del feat
del cursor

Puede ejecutarlo en la ventana de ArcMap Python configurando in_raster y fc así:

>>> fc = 'r_extent'
>>> in_raster = 'CaliCoast10mNED_HavCurvedPCS'

donde r_extent es una featureclass de polígono existente. A continuación, sólo tiene que copiar el código y ejecutarlo. Me sale esto:

enter image description here

5voto

Mohit Jain Puntos 145

Para ello puede utilizar gdaltindex: http://www.gdal.org/gdaltindex.html

Sin embargo, seguirá creando rectángulos (por ejemplo, 4+1 puntos) en el mismo sistema de referencia que las imágenes. Pero me pregunto si eso es realmente un problema: ¿qué tamaño tienen tus imágenes?

5voto

Anthony Cramp Puntos 126

Las respuestas anteriores funcionaban para QGIS 2.x.

Si estás leyendo esto después de 2020, verás que las respuestas no funcionan. Lo que funciona con QGIS 3.x es el plugin llamado Procesamiento de IBAMA .

Instale este plugin, y entonces obtendrá la herramienta/algoritmo `Crear huella de imágenes' en la caja de herramientas de Processing.

5voto

Greg Puntos 1756

Asegúrese de que las imágenes tienen nódulos definidos. Si las imágenes de origen no lo hacen, arréglelo con algo como lo que se indica a continuación, donde 0 o 255 es el valor de nodata que se supone:

gdal_translate ... -a_nodata 0 ... outimage.vrt
gdal_edit -a_nodata 255 somefile.tif

Cree pequeñas imágenes de vista previa para un procesamiento más rápido (útil cuando se trata de imágenes de satélite de varios GB). Sáltese este paso si quiere hacer coincidir los límites de los píxeles de valor con precisión. Me parece que usar la resolución objetivo -tr o elegir un porcentaje mayor que se aproxime a 2048 filas/columnas funciona bien. Se muestran tres enfoques, sólo use uno.

gdal_translate -tr 185 185 vendor_image.tif myimage.tif
gdal_translate -outsize 5% 5% vendor_image.tif myimage.tif
gdal_translate -outsize 2048 0 vendor_image.tif myimage.tif

Forzar los valores de los píxeles para que oscilen entre 1 y 255, luego reescalar de nuevo para que los datos = 100 y todos los demás sean nodatos . Utilice vrt para no conservar el almacenamiento y ser mucho más rápido también. La razón de escalar dos veces es para solucionar el problema de no saber qué rango de valores puede haber cuando empezamos. No hay ningún significado para 100, aparte de que por defecto se dibuja como un gris de tono medio, en contraste con el tradicional 1 que es visualmente indistinguible del negro.

gdal_translate -scale -ot byte myimage.tif myimage_8bit.vrt
gdal_translate -scale 1 255 100 100 myimage_8bit.vrt myimage_data_mask.vrt

Crear un polígono de la máscara de imagen de área de sólo datos para todas las regiones conectadas de píxeles en la trama que comparten un valor de píxel común, utilizando la conectividad de 8 vías.:

gdal_polygonize -8 myimage_data_mask.vrt .\footprints\myimage_data.shp

¡Que lo disfrutes! El color rosa es el área de extensión normal creada por gdaltindex y enfoques similares. El contorno negro es nuestro nuevo polígono de datos.

enter image description here

Ejemplo de procesamiento masivo del shell de Windows CMD

cd .\previews
md .\byte
md .\data-only
for %a in (*.tif) do gdal_translate -scale -ot byte %a .\byte\%~na.vrt
for %a in (byte\*.vrt) do gdal_translate -scale 1 255 100 100 %a .\data-only\%~na.vrt
for %a in (data-only\*.vrt) do call gdal_polygonize -8 %a %~na.shp

Reúne las huellas que has creado por cientos en un único índice general. {AUTO_NAME} rellena un campo con el nombre del archivo fuente de ese polígono. Véase ogrmerge página de documentos para otras opciones.

ogrmerge -single ^
  -src_layer_field_name Image_Name ^
  -src_layer_field_content {AUTO_NAME} ^
  -o ..\index_footprint_data.shp ^
  .\data-only\*.shp

before and after


Gracias https://gis.stackexchange.com/a/139045/108 para reescalar datos a punta de valor de un solo píxel. Hay otras formas de llegar al mismo fin utilizando gdal_calc pero creo que este enfoque de escala es más fácil de entender.

Creo que aprendí de Robert Simmon lo de reescalar sin conocer los valores de entrada de antemano, pero he perdido la referencia. No te puedes equivocar consultando su Introducción general a GDAL sin embargo.

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