J'essaie d'apprendre à utiliser l'ogr en python en utilisant les ensembles de données sur les pays et les lieux peuplés à partir de http://www.naturalearthdata.com/downloads/50m-cultural-vectors/. J'essaie d'utiliser des filtres et des tampons pour trouver des points (ne_50m_populated_places.shp) dans un tampon spécifié d'un pays nommé (filtré de la classe d'entités ADMIN dans ne_50m_admin_0_countries.shp). Le problème semble être que je ne comprends pas quelles unités utiliser pour buffer (). Dans le script, j'ai simplement utilisé une valeur arbitraire de 10 pour tester si le script fonctionne. Le script s'exécute mais renvoie des endroits peuplés de la région des Caraïbes pour le pays nommé 'Angola'. Idéalement, je veux être en mesure de spécifier une distance tampon, disons 500 km, mais je ne peux pas savoir comment le faire car ma compréhension est que buffer () utilise les unités de countries.shp qui seront au format wgs84 lat / long . Des conseils sur la méthode pour y parvenir seraient très appréciés.
# 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()
la source