如何使用ogr python缓冲矢量shapefile?


10

我想学习如何使用Python中的国家和居住区的数据集从使用OGR http://www.naturalearthdata.com/downloads/50m-cultural-vectors/。我试图使用过滤器和缓冲区在命名国家/地区的指定缓冲区(从ne_50m_admin_0_countries.shp中的要素类ADMIN过滤)中查找点(ne_50m_populated_places.shp)。问题似乎是我不了解用于buffer()的单位。在脚本中,我只是使用任意值10来测试脚本是否有效。该脚本会运行,但会从加勒比海地区返回命名国家为“安哥拉”的人口稠密的地方。理想情况下,我希望能够指定一个缓冲距离,例如500km,但是由于我的理解是buffer()使用的是country.shp单位(将采用wgs84纬度/经度格式),因此无法解决该问题。对此方法的建议将不胜感激。

# import modules
import ogr, os, sys


## data source
os.chdir('C:/data/naturalearth/50m_cultural')

# get the shapefile driver
driver = ogr.GetDriverByName('ESRI Shapefile')

# open ne_50m_admin_0_countries.shp and get the layer
admin = driver.Open('ne_50m_admin_0_countries.shp')
if admin is None:
  print 'Could not open ne_50m_admin_0_countries.shp'
  sys.exit(1)
adminLayer = admin.GetLayer()

# open ne_50m_populated_places.shp and get the layer
pop = driver.Open('ne_50m_populated_places.shp')
if pop is None:
  print 'could not open ne_50m_populated_places.shp'
  sys.exit(1)
popLayer = pop.GetLayer()

# use an attribute filter to restrict ne_50m_admin_0_countries.shp to "Angola"
adminLayer.SetAttributeFilter("ADMIN = ANGOLA")

# get the Angola geometry and buffer it by 10 units
adminFeature = adminLayer.GetFeature(0)
adminGeom = adminFeature.GetGeometryRef()
bufferGeom = adminGeom.Buffer(10)

# use bufferGeom as a spatial filter on ne_50m_populated_places.shp to get all places
# within 10 units of Angola
popLayer.SetSpatialFilter(bufferGeom)

# loop through the remaining features in ne_50m_populated_places.shp and print their
# id values
popFeature = popLayer.GetNextFeature()
while popFeature:
  print popFeature.GetField('NAME')
  popFeature.Destroy()
  popFeature = popLayer.GetNextFeature()

# close the shapefiles
admin.Destroy()
pop.Destroy()

Answers:


2

我可以想到的两个选择是:

  1. 计算度相当于500公里。然后可以输入Buffer()函数。尽管度数没有等量的常数,但您必须要小心。这取决于您所处的纬度。如果您想走这条路线,可以查看Haversine公式

  2. 另一个选择是将shapefile重新投影到UTM。这样,您可以直接使用500公里。不过,您会找到您感兴趣的区域的UTM区域。(如果我没有记错的话,那应该是安哥拉的UTM区域32S


3
除了近似于赤道附近的小距离外,没有500公里的“度当量”,也没有任何其他距离:这是因为距离和度之间的关系随方位角和纬度而变化。因此,第一个选项通常将无法正常工作。
whuber

0
  1. 如果要使用度数来制作缓冲区,那么当您不在赤道附近时,请考虑度数取决于方向的不同。纬度保持不变,但在高纬度时,经度要小得多。下面是我在不同纬度下以度为单位的500公里平方表。我猜对于安哥拉,如果您不需要高精度,则4.4可能是一个不错的猜测。
  2. 您可以在读取过程中在python ogr中重新投影对象(具有Transform函数),因此无需shapefile转换。
纬度0.0时500公里为4.491576420597608 x 4.486983030705042度
每小时10.0时的500公里是4.491576420597608 x 4.389054945583991度
纬度20.0时的500公里是4.491576420597608 x 4.16093408959923度
纬度30.0时的500公里是4.491576420597608 x 3.8117296267699388度
纬度40.0处的500公里是4.491576420597608 x 3.3535548944407267度
50.0时500公里为4.491576420597608 x 2.8010165014556634度
纬度60.0处的500公里为4.491576420597608 x 2.170722673038327度
lat 70.0时的500公里是4.491576420597608 x 1.4808232946314916度
lat 80.0时的500公里是4.491576420597608 x 0.7505852760718597度
lat 84.0时500公里为4.491576420597608 x 0.4516575041056399度

4
用户@Dave X注意到该表是错误的:在较高的纬度上,固定的距离跨度数更大,而在较小的纬度上。看来它可能是通过在需要除法的位置进行乘法来构造的。即使这样,也不能完全解释差异:仍然存在大约百分之几的误差。您究竟是如何计算这些数字的?
ub
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.