ওজিগর পাইথন ব্যবহার করে কীভাবে একটি ভেক্টর শেফফাইল বাফার করবেন?


10

আমি কীভাবে দেশ এবং জনবহুল জায়গাগুলির ডেটাসেটগুলি http://www.naturalearthdata.com/downloads/50m-cultural-vectors/ থেকে অজগরটিতে অগ্রে কীভাবে ব্যবহার করতে হয় তা শিখার চেষ্টা করছি। আমি একটি নির্দিষ্ট দেশের নির্দিষ্ট বাফারের মধ্যে (ne_50m_admin_0_countries.shp এডমিন বৈশিষ্ট্যযুক্ত ক্লাস থেকে ফিল্টার করা) একটি নির্দিষ্ট দেশের বাফারের মধ্যে পয়েন্টগুলি (ne_50m_populated_places.shp) সন্ধান করতে ফিল্টার এবং বাফার ব্যবহার করার চেষ্টা করছি। সমস্যাটি মনে হচ্ছে যে আমি বাফার () এর জন্য কী ইউনিটগুলি ব্যবহার করব তা বুঝতে পারছি না। স্ক্রিপ্টটিতে আমি স্ক্রিপ্টটি কাজ করে কিনা তা পরীক্ষা করার জন্য 10 এর একটি নির্বিচার মান ব্যবহার করেছি। স্ক্রিপ্টটি চলতে থাকে তবে ক্যারিবীয় অঞ্চল থেকে নামী দেশ 'অ্যাঙ্গোলা' এর জন্য আশেপাশের জনবহুল স্থানগুলি ফিরিয়ে দেয়। আদর্শভাবে, আমি একটি বাফার দূরত্ব নির্দিষ্ট করতে সক্ষম হতে চাই, 500 কিলোমিটার বলি, তবে কীভাবে এটি করা যায় তা বুঝতে আমার কাজটি বুঝতে পারছে না কারণ আমার বোঝার বিষয়টি বাফার () দেশগুলির ইউনিট ব্যবহার করছে .shp যা wgs84 ল্যাট / দীর্ঘ বিন্যাসে থাকবে । এটি অর্জনের জন্য পদ্ধতি সম্পর্কে পরামর্শ অনেক প্রশংসা হবে।

# 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 কিলোমিটার সমতুল্য ডিগ্রি গণনা করুন। তারপরে আপনি এটি বাফার () ফাংশনটি ইনপুট করতে পারেন। ডিগ্রিটির ধ্রুবক মেট্রিক সমতুল্য না থাকলেও আপনাকে সতর্ক থাকতে হবে। এটি নির্ভর করে আপনি কোন অক্ষাংশে আছেন। আপনি যদি এই রুটে যেতে চান তবে আপনি হ্যাভারসাইন সূত্রটি পরীক্ষা করে দেখতে পারেন।

  2. আর একটি বিকল্প হ'ল ইউটিএম-এ শেফফাইলটি ছড়িয়ে দেওয়া । এইভাবে, আপনি সরাসরি 500 কিলোমিটার ব্যবহার করতে পারেন। আপনার আগ্রহের জায়গার জন্য আপনি ইউটিএম জোন পাবেন। ( আমি ভুল না হলে অ্যাঙ্গোলার জন্য কোনটি ইউটিএম জোন 32 এস হওয়া উচিত )


3
নিরক্ষীয় অঞ্চলের কাছাকাছি ছোট দূরত্ব ছাড়া প্রায় 500 কিলোমিটার, বা অন্য কোনও দূরত্বের কোনও "ডিগ্রি সমতুল্য" নেই: কারণ দূরত্ব এবং ডিগ্রিগুলির মধ্যে সম্পর্ক বহন পাশাপাশি অক্ষাংশের সাথে পরিবর্তিত হয়। সুতরাং প্রথম বিকল্পটি সাধারণত সঠিকভাবে কাজ করবে না।
whuber

0
  1. আপনি যদি ডিগ্রি ব্যবহার করে বাফার করতে চান, তবে আপনি যখন নিরক্ষরেখার কাছাকাছি না থাকবেন তখন ডিগ্রিগুলির দিকের উপর নির্ভর করে বেশ আলাদা দূরত্ব রয়েছে তা বিবেচনা করুন। অক্ষাংশ একই থাকে, তবে এক ডিগ্রি দ্রাঘিমাংশ উচ্চ অক্ষাংশে অনেক ছোট। নীচে বিভিন্ন অক্ষাংশে আমার 500-কিলোমিটার স্কোয়ারের টেবিলটি রয়েছে। আমি অনুমান করি যে অ্যাঙ্গোলা মানের জন্য 4.4 এর মানটি ভাল অনুমান করতে পারে যদি আপনার উচ্চ নির্ভুলতার প্রয়োজন না হয়।
  2. আপনি পড়ার সময় পাইথন ওগরে (এটির জন্য ট্রান্সফর্ম ফাংশন রয়েছে) অবজেক্টগুলি পুনরায় প্রজেক্ট করতে পারেন, তারপরে রূপান্তরগুলি শেফফাই করার দরকার নেই is
500 কিমি ল্যাট 0.0 এ 4.491576420597608 x 4.486983030705042 ডিগ্রি
ল্যাট 10.0 এ 500 কিমিটি 4.491576420597608 x 4.389054945583991 ডিগ্রি
500 কিমি ল্যাট 20.0 এ 4.491576420597608 x 4.16093408959923 ডিগ্রি
30 কিমি ল্যাট 30.0 এ 4.491576420597608 x 3.8117296267699388 ডিগ্রি
40 কিমি ল্যাট 40.0 এ 4.491576420597608 x 3.3535548944407267 ডিগ্রি
500 কিমি ল্যাট 50.0 এ 4.491576420597608 x 2.8010165014556634 ডিগ্রি
60 কিমি ল্যাট 60.0 এ 4.491576420597608 x 2.170722673038327 ডিগ্রি
70 কিমি ল্যাট 70.0 এ 4.491576420597608 x 1.4808232946314916 ডিগ্রি
600 কিমি ল্যাট 80.0 এ 4.491576420597608 x 0.7505852760718597 ডিগ্রি
ল্যাট ৮৪.০ এ 500 কিলোমিটারটি 4.491576420597608 x 0.4516575041056399 ডিগ্রি

4
ব্যবহারকারী @Dave এক্স নোট যে এই টেবিল ভ্রান্ত হল: একটি নির্দিষ্ট দূরত্ব ঘটনাকাল একটি বৃহত্তর উচ্চতর অক্ষাংশে ডিগ্রী সংখ্যা, না একটি ক্ষুদ্রতর। এটি প্রদর্শিত হয় এটি সম্ভবত একটি গুণ তৈরি করে নির্মিত হয়েছে যেখানে বিভাগ প্রয়োজন। তবুও, এটি তাত্পর্যগুলি পুরোপুরি ব্যাখ্যা করে না: বেশ কয়েকটি শতাংশের ক্রমটিতে ত্রুটি রয়েছে। ঠিক কীভাবে আপনি এই সংখ্যাগুলি গণনা করেছেন?
শুক্র
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.