Determinare se shapefile e raster si sovrappongono in Python usando OGR / GDAL? [chiuso]


9

Sto costruendo uno script in Python usando OGR / GDAL.

Ho un set di shapefile e un set di file raster GeoTiff.

Vorrei che il mio script ignorasse gli shapefile se non si intersecano con l'area raster.

Lo shapefile non è un rettangolo, quindi non posso semplicemente confrontare i valori xmin / xmax, ymin / ymax restituiti da layer.GetExtent (). Ho bisogno del vero poligono che rappresenta la sua forma complessiva, e quindi un modo per determinare se quel poligono si interseca con il quadrato raster.

Pensavo di poter in qualche modo unire tutti i poligoni nello shapefile in un'unica funzione, quindi leggere la geometria su quella funzione e quindi confrontare tali informazioni in misura raster. Tuttavia, non sono sicuro di come eseguirlo.

  1. Come estrarre le informazioni sui poligoni del bordo dallo shapefile?
  2. Come determinare se quel poligono interseca una determinata area quadrata?

Non ho familiarità con osgeo, ma l'equivalente arcpico comporterebbe (potrebbe) comprendere: leggere l'estensione raster, creare l'estensione della copertura poligonale in memoria, scorrere i file di forma, ritagliarli ciascuno per estendere il rettangolo, verificare se qualcosa risulta.
floema

Risposte:


17

Il seguente script determina il riquadro di delimitazione di un raster e crea in base al riquadro di delimitazione una geometria.

import ogr, gdal

raster = gdal.Open('sample.tif')
vector = ogr.Open('sample.shp')

# Get raster geometry
transform = raster.GetGeoTransform()
pixelWidth = transform[1]
pixelHeight = transform[5]
cols = raster.RasterXSize
rows = raster.RasterYSize

xLeft = transform[0]
yTop = transform[3]
xRight = xLeft+cols*pixelWidth
yBottom = yTop-rows*pixelHeight

ring = ogr.Geometry(ogr.wkbLinearRing)
ring.AddPoint(xLeft, yTop)
ring.AddPoint(xLeft, yBottom)
ring.AddPoint(xRight, yTop)
ring.AddPoint(xRight, yBottom)
ring.AddPoint(xLeft, yTop)
rasterGeometry = ogr.Geometry(ogr.wkbPolygon)
rasterGeometry.AddGeometry(ring)

Successivamente, viene determinata la geometria del poligono vettoriale. Questo risponde alla tua prima domanda.

# Get vector geometry
layer = vector.GetLayer()
feature = layer.GetFeature(0)
vectorGeometry = feature.GetGeometryRef()

Infine, la geometria del vettore e del raster viene testata per l'intersezione (ritorni Trueo False). Questo risponde alla tua seconda domanda.

print rasterGeometry.Intersect(vectorGeometry)

2
Grazie, era esattamente quello che stavo cercando. Questa risposta mostra chiaramente come creare, estrarre ed eseguire funzioni tra oggetti geometrici, che è esattamente quello che stavo cercando.
JFerg,

Questa soluzione verifica se il poligono FID = 0 si interseca con il raster. Come si ottiene la geometria del totale del file di forma quando nessun poligono lo rappresenta?
JFerg,

1
EDIT: L'aumento del tempo di calcolo è irrilevante, quindi ora controllo se ogni poligono nel file di forma si interseca.
JFerg,

4

Trovo la soluzione @ustroetz molto utile, ma doveva essere corretta in due punti. Innanzitutto, pixelHeight = transform [5] è già un valore negativo, quindi dovrebbe essere l'equazione

yBottom = yTop+rows*pixelHeight

In secondo luogo, l'ordine dei punti nell'anello deve essere antiorario. Stavo avendo problemi con quello. L'ordine corretto è:

ring = ogr.Geometry(ogr.wkbLinearRing)
ring.AddPoint(xLeft, yTop)
ring.AddPoint(xLeft, yBottom)
ring.AddPoint(xRight, yBottom)
ring.AddPoint(xRight, yTop)
ring.AddPoint(xLeft, yTop)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.