Ich versuche zu lernen, wie man ogr in Python verwendet, indem ich die Datensätze des Landes und der bevölkerten Orte von http://www.naturalearthdata.com/downloads/50m-cultural-vectors/ verwende.. Ich versuche, Filter und Puffer zu verwenden, um Punkte (ne_50m_populated_places.shp) in einem angegebenen Puffer eines benannten Landes zu finden (gefiltert nach der Feature-Class ADMIN in ne_50m_admin_0_countries.shp). Das Problem scheint zu sein, dass ich nicht verstehe, welche Einheiten für buffer () verwendet werden sollen. Im Skript habe ich einfach einen beliebigen Wert von 10 verwendet, um zu testen, ob das Skript funktioniert. Das Skript wird ausgeführt, gibt jedoch besiedelte Orte aus der Karibik für das benannte Land "Angola" zurück. Idealerweise möchte ich in der Lage sein, eine Pufferentfernung von beispielsweise 500 km anzugeben, kann aber nicht herausfinden, wie dies zu tun ist, da nach meinem Verständnis buffer () die Einheiten von country.shp verwendet, die im Lat / Long-Format wgs84 vorliegen . Ratschläge zur Methode, um dies zu erreichen, wären sehr willkommen.
# 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()