Tôi đang cố gắng học cách sử dụng ogr trong python bằng cách sử dụng các bộ dữ liệu địa điểm và dân cư từ http://www.naturalearthdata.com/doads/50m-cestation-vector/. Tôi đang cố gắng sử dụng các bộ lọc và bộ đệm để tìm điểm (ne_50m_population_places.shp) trong một bộ đệm được chỉ định của một quốc gia được đặt tên (được lọc từ lớp tính năng ADMIN trong ne_50m_admin_0_countries.shp). Vấn đề dường như là tôi không hiểu đơn vị nào sẽ sử dụng cho bộ đệm (). Trong kịch bản, tôi chỉ đơn giản sử dụng giá trị tùy ý là 10 để kiểm tra xem tập lệnh có hoạt động không. Kịch bản chạy nhưng trả lại những nơi đông dân từ khắp vùng Carribean cho quốc gia được đặt tên là 'Angola'. Lý tưởng nhất, tôi muốn có thể chỉ định khoảng cách bộ đệm, giả sử là 500km, nhưng không thể tìm ra cách thực hiện điều này vì sự hiểu biết của tôi là bộ đệm () đang sử dụng các đơn vị của country.shp sẽ ở định dạng wks84 lat / long . Tư vấn về phương pháp để đạt được điều này sẽ được nhiều đánh giá cao.
# 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()