Oyt / GDAL kullanarak Python'da şekil dosyası ve raster çakışıyor mu? [kapalı]


9

OGR / GDAL kullanarak python'da bir senaryo oluşturuyorum.

Shapefiles bir dizi ve GeoTiff raster dosyaları bir dizi var.

Raster alanıyla kesişmezlerse, betiğimin şekil dosyalarını görmezden gelmesini istiyorum.

Şekil dosyası bir dikdörtgen değildir, bu nedenle layer.GetExtent () tarafından döndürülen xmin / xmax, ymin / ymax değerlerini karşılaştıramıyorum. Genel şeklini temsil eden gerçek çokgene ihtiyacım var ve sonra bu çokgenin raster karesi ile kesişip kesişmediğini belirlemenin bir yolu var.

Bir şekilde şekil dosyasındaki tüm çokgenleri tek bir özellikte birleştirebileceğimi ve daha sonra bu özellikteki geometriyi okuyabildiğimi ve sonra bu bilgileri raster boyutuyla karşılaştırabileceğimi düşünüyordum. Ancak, bunun nasıl yürütüleceğinden emin değilim.

  1. Şekil dosyasından kenarlık çokgen bilgileri nasıl ayıklanır?
  2. Bu çokgenin belirli bir kare alanla kesişip kesişmediği nasıl belirlenir?

Ben osgeo ile aşina değilim, ama arcpy eşdeğeri içerir (olabilir): raster kapsamı okumak, bellekte çokgen kaplama oluşturmak, şekil dosyaları arasında döngü, dikdörtgen genişletmek için her kırpma, bir şey sonuçlanırsa test.
phloem

Yanıtlar:


17

Aşağıdaki komut dosyası, bir raster sınırlayıcı kutusunu belirler ve sınırlayıcı kutuya göre bir geometri oluşturur.

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)

Daha sonra, vektör çokgenin geometrisi belirlenir. Bu ilk sorunuza cevap verir.

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

Son olarak, vektör ve raster geometrisi kesişim (dönüş Trueveya False) için test edilir . Bu ikinci sorunuza cevap verir.

print rasterGeometry.Intersect(vectorGeometry)

2
Teşekkürler, tam da aradığım şey buydu. Bu cevap, tam olarak aradığım şey olan geometri nesneleri arasında işlevlerin nasıl oluşturulacağını, çıkartılacağını ve çalıştırılacağını açıkça göstermektedir.
JFerg

Bu çözüm, FID = 0 çokgenin tarama ile kesişip kesişmediğini test eder. Çokgen bunu temsil etmediğinde şekil dosyası toplamının geometrisini nasıl elde edersiniz?
JFerg

1
DÜZENLEME: Hesaplama süresindeki artış önemsiz olduğundan şekil dosyasındaki her çokgenin şimdi kesişip kesişmediğini kontrol ediyorum.
JFerg

4

@Ustroetz çözümünü çok yararlı buluyorum, ancak iki yerde düzeltilmesi gerekiyordu. İlk olarak, pixelHeight = transform [5] zaten negatif bir değerdir, bu nedenle denklem

yBottom = yTop+rows*pixelHeight

İkinci olarak, halkadaki noktaların sırası saat yönünün tersine olmalıdır. Bununla ilgili problemlerim vardı. Doğru sipariş:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.