OGR / GDALを使用してPythonでシェープファイルとラスターがオーバーラップするかどうかを判断する [閉まっている]


9

OGR / GDALを使用してPythonでスクリプトを作成しています。

シェープファイルのセットとGeoTiffラスターファイルのセットがあります。

シェープファイルがラスター領域と交差しない場合、スクリプトに無視させたいのですが。

シェープファイルは長方形ではないため、layer.GetExtent()から返されたxmin / xmax、ymin / ymaxの値を単純に比較することはできません。全体的な形状を表す実際のポリゴンが必要です。次に、そのポリゴンがラスタースクエアと交差するかどうかを判断する方法が必要です。

どういうわけか、シェープファイル内のすべてのポリゴンを1つのフィーチャにマージし、そのフィーチャのジオメトリを読み取って、その情報をラスター範囲と比較できると考えていました。ただし、具体的にどのように実行するかはわかりません。

  1. シェープファイルからボーダーポリゴン情報を抽出する方法は?
  2. そのポリゴンが特定の正方形の領域と交差するかどうかを判断するにはどうすればよいですか?

私はosgeoに精通していませんが、同等のArcpyには(おそらく)ラスターエクステントの読み取り、メモリ内のポリゴンカバリングエクステントの作成、シェープファイルの循環、エクステントの四角形へのクリッピング、結果があるかどうかのテストが含まれます。
師部2014

回答:


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()

最後に、ベクターとラスターのジオメトリの交差(戻り値TrueまたはFalse)がテストされます。これは2番目の質問に答えます。

print rasterGeometry.Intersect(vectorGeometry)

2
ありがとう、これはまさに私が探していたものでした。この答えは、ジオメトリオブジェクト間で関数を作成、抽出、実行する方法を明確に示しています。これはまさに私が探していたものです。
JFerg 14

このソリューションは、FID = 0のポリゴンがラスターと交差するかどうかをテストします。ポリゴンがこれを表していない場合、シェープファイル全体のジオメトリをどのように取得しますか?
JFerg、2015年

1
編集:計算時間の増加は重要ではないので、シェープファイルの各ポリゴンが今交差するかどうかを確認します。
JFerg、2015年

4

@ustroetzソリューションは非常に役立ちますが、2か所で修正する必要がありました。まず、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.