ogr python을 사용하여 벡터 shapefile을 버퍼링하는 방법은 무엇입니까?


10

http://www.naturalearthdata.com/downloads/50m-cultural-vectors/ 에서 국가와 인구 통계 정보를 사용하여 파이썬에서 ogr을 사용하는 방법을 배우려고합니다 .. 이름이 지정된 국가의 지정된 버퍼 (ne_50m_admin_0_countries.shp의 기능 클래스 ADMIN에서 필터링 됨) 내에서 포인트 (ne_50m_populated_places.shp)를 찾기 위해 필터와 버퍼를 사용하려고합니다. 문제는 buffer ()에 사용할 단위를 이해하지 못하는 것 같습니다. 스크립트에서는 스크립트가 작동하는지 테스트하기 위해 임의의 값 10을 사용했습니다. 이 스크립트는 실행되지만 명명 된 국가 'Angola'의 카리브 지역 주변에서 채워진 장소를 반환합니다. 이상적으로는 500km와 같은 버퍼 거리를 지정할 수 있기를 원하지만 buffer ()가 국가 단위를 사용하고 있기 때문에 이해하는 방법을 해결할 수 없습니다 .wgs84 lat / long 형식입니다. . 이를 달성하는 방법에 대한 조언은 대단히 감사하겠습니다.

# 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

내가 생각할 수있는 두 가지 옵션은 다음과 같습니다.

  1. 500 킬로미터에 해당하는 정도를 계산합니다. 그런 다음 Buffer () 함수를 입력 할 수 있습니다. 학위에 일정한 측정 항목이 없으므로주의해야합니다. 사용중인 위도에 따라 다릅니다. 이 길을 가고 싶다면 Haversine 공식을 확인하십시오 .

  2. 또 다른 옵션은 shapefile 을 UTM으로 다시 투영하는 것 입니다. 그렇게하면 500km를 직접 사용할 수 있습니다. 관심있는 지역의 UTM 영역을 찾을 수 있습니다. ( 실수하지 않으면 앙골라의 UTM 영역 32S 가되어야합니다 )


3
대략 적도 근처의 작은 거리를 제외하고는 500 킬로미터 나 다른 거리의 "도 등가"는 없습니다. 거리와 도의 관계가 위도뿐만 아니라 방위에 따라 변하기 때문입니다. 따라서 첫 번째 옵션은 일반적으로 올바르게 작동하지 않습니다.
whuber

0
  1. 도를 사용하여 버퍼를 만들려면 적도 근처에 있지 않을 때 방향에 따라 도의 거리가 상당히 다르다는 것을 고려하십시오. 위도는 동일하게 유지되지만 위도는 1 도입니다. 아래는 위도에 따른 500km의 제곱도 표입니다. 앙골라 값 4.4는 높은 정밀도가 필요하지 않은 경우 좋은 추측 일 수 있습니다.
  2. 읽는 동안 python ogr에서 객체를 다시 투영 할 수 있으며 (변환 기능이 있음) 파일 변환을 쉐이핑 할 필요가 없습니다.
위도 0.0에서 500km는 4.491576420597608 x 4.486983030705042 deg입니다.
위도 10.0에서 500km는 4.491576420597608 x 4.389054945583991도
위도 20.0에서 500km는 4.491576420597608 x 4.16093408959923 deg입니다.
위도 30.0에서 500km는 4.491576420597608 x 3.8117296267699388도
위도 40.0에서 500km는 4.491576420597608 x 3.3535548944407267도
위도 50.0에서 500km는 4.491576420597608 x 2.8010165014556634 °입니다.
위도 60.0에서 500km는 4.491576420597608 x 2.170722673038327도
위도 70.0에서 500km는 4.491576420597608 x 1.4808232946314916도
위도 80.0에서 500km는 4.491576420597608 x 0.7505852760718597도
위도 84.0에서 500km는 4.491576420597608 x 0.4516575041056399도

4
@Dave X 사용자는이 테이블이 잘못되었다는 점에 주목합니다. 고정 된 거리는 위도가 높을수록 더 큰 각도로 확장됩니다. 나눗셈이 필요한 곳에 곱셈을함으로써 만들어 졌을 수도 있습니다. 그렇더라도 불일치를 완전히 설명하지는 못합니다. 몇 퍼센트 정도의 오류가 남아 있습니다. 이 숫자를 정확히 어떻게 계산 했습니까?
whuber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.