Python에서 OGR / GDAL을 사용하여 shapefile과 래스터가 겹치는 지 확인 하시겠습니까? [닫은]


9

OGR / GDAL을 사용하여 파이썬으로 스크립트를 작성하고 있습니다.

shapefile 세트와 GeoTiff 래스터 파일 세트가 있습니다.

래스터 영역과 교차하지 않으면 스크립트가 shapefile을 무시하도록하고 싶습니다.

shapefile은 사각형이 아니므로 layer.GetExtent ()에 의해 반환 된 xmin / xmax, ymin / ymax 값을 간단히 비교할 수 없습니다. 전체 모양을 나타내는 실제 다각형이 필요하며 해당 다각형이 래스터 사각형과 교차하는지 확인하는 방법이 필요합니다.

모양 파일의 모든 다각형을 어떻게 든 하나의 피쳐로 병합 한 다음 해당 피쳐의 형상을 읽은 다음 해당 정보를 래스터 범위와 비교할 수 있다고 생각했습니다. 그러나 나는 이것을 어떻게 실행하는지 구체적으로 확신하지 못한다.

  1. shapefile에서 테두리 다각형 정보를 추출하는 방법은 무엇입니까?
  2. 해당 다각형이 주어진 사각형 영역과 교차하는지 확인하는 방법은 무엇입니까?

나는 osgeo에 익숙하지 않지만 arcpy에 해당하는 것에는 다음이 포함됩니다. 래스터 범위를 읽고, 메모리에서 다각형을 덮는 범위를 만들고, shapefile을 순환하고, 사각형으로 자르고, 결과가 있는지 테스트하십시오.
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()

마지막으로, 벡터와 래스터의 지오메트리는 교차점 (returns True또는 False)에 대해 테스트됩니다 . 두 번째 질문에 대한 답변입니다.

print rasterGeometry.Intersect(vectorGeometry)

2
고마워, 이것은 내가 찾던 것입니다. 이 답변은 지오메트리 객체 사이에서 함수를 생성, 추출 및 실행하는 방법을 명확하게 보여줍니다.
JFerg

이 솔루션은 FID = 0 다각형이 래스터와 교차하는지 테스트합니다. 폴리곤이 이것을 나타내지 않을 때 쉐이프 파일의 지오메트리를 어떻게 구할 수 있습니까?
JFerg

1
편집 : 계산 시간의 증가는 중요하지 않으므로 shapefile의 각 다각형이 지금 교차하는지 확인합니다.
JFerg

4

@ustroetz 솔루션이 매우 유용하지만 두 곳에서 수정해야했습니다. 먼저 pixelHeight = transform [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.