Xác định xem shapefile và raster có trùng nhau trong Python bằng OGR / GDAL không? [đóng cửa]


9

Tôi đang xây dựng một kịch bản trong python bằng OGR / GDAL.

Tôi có một bộ shapefiles và một tập hợp các tệp raster GeoTiff.

Tôi muốn để kịch bản của mình bỏ qua các shapefiles nếu chúng không giao nhau với khu vực raster.

Shapefile không phải là một hình chữ nhật, vì vậy tôi không thể đơn giản so sánh các giá trị xmin / xmax, ymin / ymax được trả về bởi layer.GetExtent (). Tôi cần đa giác thực tế biểu thị hình dạng tổng thể của nó, và sau đó một số cách xác định xem đa giác đó có giao nhau với hình vuông raster không.

Tôi đã nghĩ rằng bằng cách nào đó tôi có thể hợp nhất tất cả các đa giác trong shapefile thành một tính năng, sau đó đọc hình học trên tính năng đó, và sau đó so sánh thông tin đó với phạm vi raster. Tuy nhiên, tôi không chắc chắn cụ thể làm thế nào để thực hiện điều này.

  1. Làm thế nào để trích xuất thông tin đa giác biên từ shapefile?
  2. Làm thế nào để xác định nếu đa giác đó giao nhau với một diện tích hình vuông nhất định?

Tôi không quen thuộc với osgeo, nhưng tương đương hồ quang sẽ (có thể) liên quan đến: đọc phạm vi raster, tạo phạm vi bao phủ đa giác trong bộ nhớ, quay vòng qua shapefile, cắt từng hình chữ nhật, kiểm tra xem có kết quả gì không.
phloem

Câu trả lời:


17

Kịch bản sau đây xác định hộp giới hạn của raster và tạo dựa trên hộp giới hạn một hình học.

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)

Tiếp theo, hình dạng của đa giác vector được xác định. Điều này trả lời câu hỏi đầu tiên của bạn.

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

Cuối cùng, hình dạng của vectơ và raster được kiểm tra giao nhau (trả về Truehoặc False). Điều này trả lời câu hỏi thứ hai của bạn.

print rasterGeometry.Intersect(vectorGeometry)

2
Cảm ơn, đây chính xác là những gì tôi đang tìm kiếm. Câu trả lời này cho thấy rõ cách tạo, trích xuất và chạy các hàm giữa các đối tượng hình học, đó chính xác là những gì tôi đang tìm kiếm.
JFerg

Giải pháp này kiểm tra xem đa giác FID = 0 có giao nhau với raster không. Làm thế nào để bạn có được hình học của tổng số shapefile khi không có đa giác đại diện cho điều này?
JFerg

1
EDIT: Việc tăng thời gian tính toán là không quan trọng vì vậy tôi kiểm tra xem mỗi đa giác trong shapefile có giao nhau không.
JFerg

4

Tôi thấy giải pháp @ustroetz rất hữu ích nhưng nó cần được sửa ở hai nơi. Thứ nhất, pixelHeight = Transform [5] đã là giá trị âm, vì vậy phương trình nên là

yBottom = yTop+rows*pixelHeight

Thứ hai, thứ tự của các điểm trong vòng phải ngược chiều kim đồng hồ. Tôi đã có vấn đề với điều đó. Thứ tự đúng là:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.