ओग पायथन का उपयोग करके एक वेक्टर शेपफाइल बफर कैसे करें?


10

मैं जानने की कोशिश कर रहा हूं कि देश और आबादी वाले स्थानों के डेटा का उपयोग करते हुए http://www.naturalearthdata.com/downloads/50m-cultural-vectors/ पर अजगरों का उपयोग कैसे करें?। मैं एक नामित देश के निर्दिष्ट बफ़र (ne_50m_admin_0 -countries.shp में फ़ीचर वर्ग ADMIN से फ़िल्टर्ड) के भीतर अंक (ne_50m_populated_places.shp) खोजने के लिए फ़िल्टर और बफ़र्स का उपयोग करने का प्रयास कर रहा हूं। समस्या यह प्रतीत होती है कि मुझे समझ में नहीं आ रहा है कि बफर () का उपयोग करने के लिए कौन सी इकाइयाँ हैं। यदि स्क्रिप्ट काम करती है, तो मैंने स्क्रिप्ट का केवल 10 के मनमाने मूल्य का उपयोग किया है। स्क्रिप्ट चलती है लेकिन नामित देश 'अंगोला' के लिए कैरिबियन क्षेत्र के आसपास से आबादी वाले स्थानों पर लौटती है। आदर्श रूप से, मैं एक बफर दूरी निर्दिष्ट करने में सक्षम होना चाहता हूं, 500 किमी कहता हूं, लेकिन यह काम नहीं कर सकता कि यह कैसे करना है क्योंकि मेरी समझ बफर है () देशों की इकाइयों का उपयोग कर रही है। जो कि 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()

जवाबों:


2

दो विकल्प मैं सोच सकता हूं:

  1. 500 किलोमीटर के समकक्ष डिग्री की गणना करें। फिर आप इसे बफ़र () फ़ंक्शन इनपुट कर सकते हैं। आपको सावधान रहना होगा हालांकि डिग्री के रूप में एक स्थिर मीट्रिक समतुल्य नहीं है। यह निर्भर करता है कि आप किस अक्षांश पर हैं। आप देख सकते हैं Haversine सूत्र यदि आप इस मार्ग जाना चाहते हैं।

  2. एक अन्य विकल्प यह होगा कि आप UTM के आकार-प्रकार को eproject करें । इस तरह, आप सीधे 500 किलोमीटर का उपयोग कर सकते हैं। आपको अपने रुचि के क्षेत्र के लिए UTM क्षेत्र मिल जाएगा। ( अगर मैं गलत नहीं हूँ तो अंगोला के लिए UTM ज़ोन 32S होना चाहिए )


3
भूमध्य रेखा के पास छोटी दूरी को छोड़कर लगभग 500 किलोमीटर की कोई "डिग्री समतुल्य" नहीं है, न ही किसी अन्य दूरी की, ऐसा इसलिए है क्योंकि अक्षांश के साथ-साथ दूरी और डिग्री के बीच संबंध बदलते हैं। इस प्रकार पहला विकल्प आमतौर पर सही ढंग से काम नहीं करेगा।
whuber

0
  1. यदि आप डिग्री का उपयोग करके बफर बनाना चाहते हैं, तो विचार करें कि जब आप भूमध्य रेखा के पास नहीं होते हैं तो दिशा के आधार पर डिग्री काफी भिन्न होती है। अक्षांश समान रहता है, लेकिन उच्च अक्षांशों में एक डिग्री देशांतर बहुत छोटा होता है। नीचे विभिन्न अक्षांशों में डिग्री में 500-किमी वर्ग की मेरी तालिका है। मुझे लगता है कि 4.4 के अंगोला मूल्य के लिए अच्छा अनुमान हो सकता है अगर आपको उच्च परिशुद्धता की आवश्यकता नहीं है।
  2. आप पढ़ने के दौरान अजगर ओआरआर (इसके लिए ट्रांसफ़ॉर्म फ़ंक्शन) में ऑब्जेक्ट को फिर से अस्वीकार कर सकते हैं, फिर रूपांतरणों को आकार देने की आवश्यकता नहीं है।
500 किमी लेट 0.0 पर 4.491576420597608 x 4.486983030705042 डाउन है
500 किमी लेट 10.0 पर 4.491576420597608 x 4.389054945583991 डाउन है
500 किमी लेट 20.0 पर 4.491576420597608 x 4.16093408959923 है
500 किमी लेट 30.0 पर 4.491576420597608 x 3.8117296267699388 डाउन है
500 किमी लेट 40.0 पर 4.491576420597608 x 3.3535548944407267 गिरावट है
50 किमी पर 500 किमी 4.491576420597608 x 2.8010165014556634 है
५०० किमी पर ६०.० किमी ४.४ ९ १५ at६४२० ९ ६०६ 2.1 x २.०67०30२२38६०३32३२ deg डिगरी है
500 किमी लेट 70.0 पर 4.491576420597608 x 1.4808232946314916 गिरावट है
500 किमी की दूरी पर 80.0 4.491576420597608 x 0.7505852760718597 डिग्री है
500 किमी लेट 84.0 पर 4.491576420597608 x 0.4516575041056399 डाउन है

4
उपयोगकर्ता @Dave एक्स नोट कि इस तालिका गलत है: एक निश्चित दूरी फैला एक अधिक से अधिक उच्च अक्षांश पर अंशों की संख्या, नहीं एक कम। ऐसा प्रतीत होता है कि इसका निर्माण एक ऐसे गुणन द्वारा किया गया होगा जहाँ एक विभाजन की आवश्यकता होती है। फिर भी, यह पूरी तरह से विसंगतियों की व्याख्या नहीं करता है: कई प्रतिशत के आदेश पर त्रुटियां बनी हुई हैं। वास्तव में आपने इन नंबरों की गणना कैसे की?
whuber
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.