ogr pythonを使用してベクターシェープファイルをバッファーする方法


10

http://www.naturalearthdata.com/downloads/50m-cultural-vectors/から国と居住場所のデータセットを使用してPythonでOGRを使用する方法を学習しようとしています。フィルターとバッファーを使用して、指定された国の指定されたバッファー(ne_50m_admin_0_countries.shpのフィーチャクラスADMINからフィルター)内のポイント(ne_50m_populated_places.shp)を見つけようとしています。問題は、buffer()に使用するユニットが理解できないことです。スクリプトでは、スクリプトが機能するかどうかをテストするために、任意の値10を使用しました。スクリプトは実行されますが、名前が付けられた国「アンゴラ」のカリブ地域周辺の人口の多い場所を返します。理想的には、バッファ距離を指定できるようにしたいのですが(たとえば500km)、buffer()がwgs84 lat / long形式であるcountrys.shpの単位を使用していることがわかっているので、これを行う方法を理解できません。これを達成するための方法についてのアドバイスをいただければ幸いです。

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

回答:


2

私が考えることができる2つのオプションは次のとおりです。

  1. 500キロメートルに相当する次数を計算します。その後、Buffer()関数を入力できます。ただし、次数には同等の一定の指標がないため、注意が必要です。緯度によって異なります。このルートを使いたい場合は、Haversine式を確認してください。

  2. 別のオプションは、シェープファイルをUTMに再投影することです。そうすれば、500キロメートルを直接使用できます。ただし、関心のある領域のUTMゾーンを見つける必要があります。(私が間違っていなければ、アンゴラではUTMゾーン32Sになるはずです)


3
赤道付近の短い距離を除いて、500キロメートルにも他の距離にも「相当する度」はありません。これは、距離と度の関係が方位と緯度で変化するためです。したがって、最初のオプションは通常正しく機能しません。
whuber

0
  1. 度を使用してバッファを作成する場合は、赤道に近づいていない場合、方向に応じて度の距離が大きく異なることを考慮してください。緯度は同じままですが、高緯度では経度1度ははるかに小さくなります。以下は、緯度別の500 km四方の度数表です。アンゴラの値4.4は、高精度が必要ない場合に適していると思います。
  2. 読み込み中にpython ogrでオブジェクトを再投影できます(そのためのTransform関数があります)。シェープファイル変換の必要はありません。
緯度0.0で500 kmは4.491576420597608 x 4.486983030705042度
緯度10.0で500 kmは4.491576420597608 x 4.389054945583991度
緯度20.0で500 kmは4.491576420597608 x 4.16093408959923度
緯度30.0で500 kmは4.491576420597608 x 3.8117296267699388度
緯度40.0で500 kmは4.491576420597608 x 3.3535548944407267度
緯度50.0で500 kmは4.491576420597608 x 2.8010165014556634度
緯度60.0で500 kmは4.491576420597608 x 2.170722673038327度
緯度70.0で500 kmは4.491576420597608 x 1.4808232946314916度
緯度80.0で500 kmは4.491576420597608 x 0.7505852760718597度
緯度84.0で500 kmは4.491576420597608 x 0.4516575041056399度

4
ユーザー@Dave Xは、この表は誤りであることに注意します。固定距離は、より高い緯度ではより多くの度数にまたがり、より短くはありません。除算が必要な場所で乗算を行って作成された可能性があります。それでも、それでは差異が完全に説明されていません。数パーセント程度のエラーが残っています。正確にこれらの数値をどのように計算しましたか?
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.