使用OGR / GDAL确定shapefile和栅格在Python中是否重叠?[关闭]


9

我正在使用OGR / GDAL在python中构建脚本。

我有一组shapefile和一组GeoTiff栅格文件。

如果脚本不与栅格区域相交,我希望脚本忽略它们。

shapefile不是矩形,因此我不能简单地比较layer.GetExtent()返回的xmin / xmax,ymin / ymax值。我需要代表其整体形状的实际多边形,然后通过某种方式确定该多边形是否与栅格正方形相交。

我当时想我可以以某种方式将shapefile中的所有多边形合并为一个要素,然后读取该要素上的几何图形,然后将该信息与栅格范围进行比较。但是,我不确定具体如何执行此操作。

  1. 如何从shapefile中提取边界多边形信息?
  2. 如何确定该多边形是否与给定的正方形相交?

我不熟悉osgeo,但是arcpy等效项(可能)涉及:读取栅格范围,在内存中创建覆盖范围的多边形,在shapefile中循环,将每个片段裁剪到范围矩形,测试是否有结果。
韧皮部

Answers:


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

最后,测试矢量和栅格的几何形状是否相交(返回TrueFalse)。这回答了您的第二个问题。

print rasterGeometry.Intersect(vectorGeometry)

2
谢谢,这正是我想要的。该答案清楚地显示了如何在几何对象之间创建,提取和运行函数,这正是我所要的。
JFerg 2014年

此解决方案测试FID = 0多边形是否与栅格相交。没有多边形表示时,如何获得shapefile的总几何?
JFerg,2015年

1
编辑:计算时间的增加是无关紧要的,所以我现在检查shapefile中的每个多边形是否相交。
JFerg,2015年

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.