การพิจารณาว่า Shapefile และแรสเตอร์ซ้อนทับกันใน Python โดยใช้ OGR / GDAL หรือไม่ [ปิด]


9

ฉันกำลังสร้างสคริปต์ใน python โดยใช้ OGR / GDAL

ฉันมีชุดไฟล์รูปร่างและชุดไฟล์แรสเตอร์ GeoTiff

ฉันต้องการให้สคริปต์ของฉันเพิกเฉยกับรูปร่างของไฟล์หากพวกเขาไม่ตัดกันกับพื้นที่แรสเตอร์

Shapefile ไม่ได้เป็นรูปสี่เหลี่ยมผืนผ้าดังนั้นฉันไม่สามารถเปรียบเทียบค่า xmin / xmax, ymin / ymax ที่ส่งกลับโดย layer เท่านั้น GetGetExtent () ฉันต้องการรูปหลายเหลี่ยมที่เกิดขึ้นจริงซึ่งเป็นรูปร่างโดยรวมแล้ววิธีพิจารณาว่ารูปหลายเหลี่ยมนั้นตัดกับสี่เหลี่ยมแรสเตอร์หรือไม่

ฉันคิดว่าฉันสามารถรวมรูปหลายเหลี่ยมทั้งหมดใน shapefile เข้ากับคุณลักษณะหนึ่งแล้วอ่านเรขาคณิตในคุณลักษณะนั้นแล้วเปรียบเทียบข้อมูลนั้นกับขอบเขตแรสเตอร์ อย่างไรก็ตามฉันไม่แน่ใจเกี่ยวกับวิธีการดำเนินการนี้โดยเฉพาะ

  1. วิธีดึงข้อมูลรูปหลายเหลี่ยมเส้นขอบจาก shapefile?
  2. วิธีการตรวจสอบว่ารูปหลายเหลี่ยมนั้นตัดกันพื้นที่สี่เหลี่ยมที่กำหนดหรือไม่

ฉันไม่คุ้นเคยกับ osgeo แต่สิ่งที่เทียบเท่า arcpy จะ (อาจ) เกี่ยวข้องกับ: อ่านขอบเขตแรสเตอร์สร้างรูปหลายเหลี่ยมครอบคลุมขอบเขตในหน่วยความจำวงจรผ่าน shapefiles ตัดแต่ละสี่เหลี่ยมขอบเขตทดสอบว่าผลลัพธ์อะไร
phloem

คำตอบ:


17

สคริปต์ต่อไปนี้จะกำหนดกล่องขอบของแรสเตอร์และสร้างตามเรขาคณิตของกล่องขอบ

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)

ถัดไปกำหนดรูปทรงเรขาคณิตของรูปหลายเหลี่ยมเวกเตอร์ นี่เป็นการตอบคำถามแรกของคุณ

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

สุดท้ายเรขาคณิตของเวกเตอร์และแรสเตอร์จะถูกทดสอบเพื่อหาจุดตัด (return TrueหรือFalse) นี่เป็นการตอบคำถามที่สองของคุณ

print rasterGeometry.Intersect(vectorGeometry)

2
ขอบคุณนี่คือสิ่งที่ฉันกำลังมองหา คำตอบนี้แสดงวิธีการสร้างแยกและเรียกใช้ฟังก์ชันระหว่างวัตถุเรขาคณิตอย่างชัดเจนซึ่งเป็นสิ่งที่ฉันกำลังมองหา
JFerg

วิธีการแก้ปัญหานี้ทดสอบว่ารูปหลายเหลี่ยม FID = 0 ตัดกับแรสเตอร์หรือไม่ คุณจะได้รับรูปทรงเรขาคณิตของ shapefile ทั้งหมดอย่างไรเมื่อไม่มีรูปหลายเหลี่ยมแสดงถึงสิ่งนี้
JFerg

1
แก้ไข: การเพิ่มขึ้นของเวลาการคำนวณนั้นไม่สำคัญดังนั้นฉันจึงตรวจสอบว่าแต่ละรูปหลายเหลี่ยมใน Shapefile ตัดกันหรือไม่
JFerg

4

ฉันพบโซลูชัน @ustroetz มีประโยชน์มาก แต่จำเป็นต้องได้รับการแก้ไขในสองแห่ง ประการแรก pixelHeight = การแปลง [5] เป็นค่าลบอยู่แล้วดังนั้นสมการควรเป็น

yBottom = yTop+rows*pixelHeight

ประการที่สองลำดับของคะแนนในแหวนจะต้องทวนเข็มนาฬิกา ฉันมีปัญหากับสิ่งนั้น ลำดับที่ถูกต้องคือ:

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.