Saya mencoba mempelajari cara menggunakan ogr di python menggunakan negara dan mengisi kumpulan data dari http://www.naturalearthdata.com/downloads/50m-cultural-vectors/. Saya mencoba menggunakan filter dan buffer untuk menemukan poin (ne_50m_populated_places.shp) dalam buffer yang ditentukan dari negara yang disebutkan (difilter dari ADMIN kelas fitur di ne_50m_admin_0_countries.shp). Masalahnya tampaknya saya tidak mengerti unit apa yang digunakan untuk buffer (). Dalam skrip saya hanya menggunakan nilai arbitrer 10 untuk menguji apakah skrip berfungsi. Script berjalan tetapi mengembalikan tempat-tempat berpenduduk dari seluruh wilayah Karibia untuk negara bernama 'Angola'. Idealnya, saya ingin dapat menentukan jarak buffer, katakanlah 500km, tetapi tidak bisa mengetahui bagaimana melakukan ini karena pemahaman saya adalah buffer () menggunakan unit country.shp yang akan berada dalam format wgs84 lat / panjang . Saran tentang metode untuk mencapai ini akan sangat dihargai.
# 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()