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()
답변
내가 생각할 수있는 두 가지 옵션은 다음과 같습니다.
-
500 킬로미터에 해당하는 정도를 계산합니다. 그런 다음 Buffer () 함수를 입력 할 수 있습니다. 학위에 일정한 측정 항목이 없으므로주의해야합니다. 사용중인 위도에 따라 다릅니다. 이 길을 가고 싶다면 Haversine 공식을 확인하십시오 .
-
또 다른 옵션은 shapefile 을 UTM으로 다시 투영하는 것 입니다. 그렇게하면 500km를 직접 사용할 수 있습니다. 관심있는 지역의 UTM 영역을 찾을 수 있습니다. ( 실수하지 않으면 앙골라의 UTM 영역 32S 가되어야합니다 )
답변
- 도를 사용하여 버퍼를 만들려면 적도 근처에 있지 않을 때 방향에 따라 도의 거리가 상당히 다르다는 것을 고려하십시오. 위도는 동일하게 유지되지만 위도는 1 도입니다. 아래는 위도에 따른 500km의 제곱도 표입니다. 앙골라 값 4.4는 높은 정밀도가 필요하지 않은 경우 좋은 추측 일 수 있습니다.
- 읽는 동안 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도