ฉันพยายามเรียนรู้วิธีใช้ ogr ใน python โดยใช้ประเทศและชุดข้อมูลสถานที่ที่มีประชากรจากhttp://www.naturalearthdata.com/downloads/50m-cultural-vectors/. ฉันกำลังพยายามใช้ตัวกรองและบัฟเฟอร์เพื่อค้นหาคะแนน (ne_50m_populated_places.shp) ภายในบัฟเฟอร์ที่ระบุของประเทศที่ตั้งชื่อ (กรองจาก ADMIN คลาสคุณลักษณะใน ne_50m_admin_0_countries.shp) ปัญหาดูเหมือนว่าฉันไม่เข้าใจหน่วยที่จะใช้สำหรับ buffer () ในสคริปท์ฉันใช้ค่า 10 โดยพลการเพื่อทดสอบว่าสคริปต์ทำงานหรือไม่ สคริปต์ทำงาน แต่ส่งคืนสถานที่ที่มีประชากรจากทั่วภูมิภาค Carribean สำหรับประเทศที่มีชื่อ 'Angola' เป็นการดีที่ฉันต้องการที่จะสามารถระบุระยะทางบัฟเฟอร์พูด 500km แต่ไม่สามารถหาวิธีการทำเช่นนี้เป็นความเข้าใจของฉันคือบัฟเฟอร์ () กำลังใช้หน่วยของ countries.shp ที่จะอยู่ในรูปแบบ 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()