দুর্দান্ত বৃত্তের দূরত্ব + লাইন তৈরি করার জন্য পাইথনের কোন সরঞ্জামগুলি উপলব্ধ?


20

একটি দুর্দান্ত বৃত্তের দূরত্ব তৈরি করতে আমার পাইথন ব্যবহার করতে হবে - একটি সংখ্যা এবং উভয়ই কিছু ধরণের 'বক্রতা' যা আমি ক্লায়েন্ট-পাশের মানচিত্রে আঁকতে ব্যবহার করতে পারি। আমি কার্ভের ফর্ম্যাটটি সম্পর্কে চিন্তা করি না - এটি ডব্লুকেটি হোক, বা জোড় স্থানাঙ্কের সেট হোক - তবে কেবল তথ্যটি বের করতে চাই।

সেখানে কি কি সরঞ্জাম আছে? আমার কী ব্যবহার করা উচিত?

উত্তর:



8

অন্যদের দেওয়া উত্তরগুলি কিছুটা মার্জিত, তবে এখানে একটি আল্ট্রাসিম্পল, কিছুটা অবাস্তব, পাইথনের বিটটি দেওয়া হয়েছে যা মৌলিক বিষয়গুলি সরবরাহ করে। ফাংশনটিতে দুটি সমন্বয়যুক্ত জোড় এবং একটি ব্যবহারকারী-নির্দিষ্ট সংখ্যার অংশ গ্রহণ করে। এটি একটি দুর্দান্ত চেনাশোনা পথ ধরে মধ্যবর্তী পয়েন্টগুলির একটি সেট দেয়। আউটপুট: কেএমএল হিসাবে লেখার জন্য পাঠ্য প্রস্তুত। ক্যাভেটস: কোডটি অ্যান্টিপোডগুলি বিবেচনা করে না এবং একটি গোলাকার পৃথিবী ধরে নেয়।

অ্যালান গ্লেনন দ্বারা কোড http://enj.com জুলাই ২০১০ (লেখক এই কোডটি পাবলিক ডোমেনে রাখে your আপনার নিজের ঝুঁকিতে ব্যবহার করুন)।

-

ডিফ টিউনসেজ (দ্রাঘিমাংশ 1, অক্ষাংশ 1, দ্রাঘিমাংশ 2, অক্ষাংশ 2, num_of_setions):

import math

ptlon1 = longitude1
ptlat1 = latitude1
ptlon2 = longitude2
ptlat2 = latitude2

numberofsegments = num_of_segments
onelessthansegments = numberofsegments - 1
fractionalincrement = (1.0/onelessthansegments)

ptlon1_radians = math.radians(ptlon1)
ptlat1_radians = math.radians(ptlat1)
ptlon2_radians = math.radians(ptlon2)
ptlat2_radians = math.radians(ptlat2)

distance_radians=2*math.asin(math.sqrt(math.pow((math.sin((ptlat1_radians-ptlat2_radians)/2)),2) + math.cos(ptlat1_radians)*math.cos(ptlat2_radians)*math.pow((math.sin((ptlon1_radians-ptlon2_radians)/2)),2)))
# 6371.009 represents the mean radius of the earth
# shortest path distance
distance_km = 6371.009 * distance_radians

mylats = []
mylons = []

# write the starting coordinates
mylats.append([])
mylons.append([])
mylats[0] = ptlat1
mylons[0] = ptlon1 

f = fractionalincrement
icounter = 1
while (icounter <  onelessthansegments):
        icountmin1 = icounter - 1
        mylats.append([])
        mylons.append([])
        # f is expressed as a fraction along the route from point 1 to point 2
        A=math.sin((1-f)*distance_radians)/math.sin(distance_radians)
        B=math.sin(f*distance_radians)/math.sin(distance_radians)
        x = A*math.cos(ptlat1_radians)*math.cos(ptlon1_radians) + B*math.cos(ptlat2_radians)*math.cos(ptlon2_radians)
        y = A*math.cos(ptlat1_radians)*math.sin(ptlon1_radians) +  B*math.cos(ptlat2_radians)*math.sin(ptlon2_radians)
        z = A*math.sin(ptlat1_radians) + B*math.sin(ptlat2_radians)
        newlat=math.atan2(z,math.sqrt(math.pow(x,2)+math.pow(y,2)))
        newlon=math.atan2(y,x)
        newlat_degrees = math.degrees(newlat)
        newlon_degrees = math.degrees(newlon)
        mylats[icounter] = newlat_degrees
        mylons[icounter] = newlon_degrees
        icounter += 1
        f = f + fractionalincrement

# write the ending coordinates
mylats.append([])
mylons.append([])
mylats[onelessthansegments] = ptlat2
mylons[onelessthansegments] = ptlon2

# Now, the array mylats[] and mylons[] have the coordinate pairs for intermediate points along the geodesic
# My mylat[0],mylat[0] and mylat[num_of_segments-1],mylat[num_of_segments-1] are the geodesic end points

# write a kml of the results
zipcounter = 0
kmlheader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><kml xmlns=\"http://www.opengis.net/kml/2.2\"><Document><name>LineString.kml</name><open>1</open><Placemark><name>unextruded</name><LineString><extrude>1</extrude><tessellate>1</tessellate><coordinates>"
print kmlheader
while (zipcounter < numberofsegments):
        outputstuff = repr(mylons[zipcounter]) + "," + repr(mylats[zipcounter]) + ",0 "
        print outputstuff
        zipcounter += 1
kmlfooter = "</coordinates></LineString></Placemark></Document></kml>"
print kmlfooter

8

জিওগ্রাফিকলিবের একটি অজগর ইন্টারফেস রয়েছে :

এটি একটি এলিপসয়েডে কম্পিউটার জিওডেসিকগুলি করতে পারে (দুর্দান্ত চেনাশোনাগুলি পেতে শূন্যের সমতলতা সেট করে) এবং কোনও জিওডেসিকের মধ্যবর্তী পয়েন্ট তৈরি করতে পারে (নমুনায় "লাইন" কমান্ড দেখুন)।

জেএফকে থেকে চাঙ্গি বিমানবন্দর (সিঙ্গাপুর) পর্যন্ত জিওডেসিক লাইনে পয়েন্টগুলি কীভাবে মুদ্রণ করতে হবে তা এখানে:

from geographiclib.geodesic import Geodesic
geod = Geodesic.WGS84

g = geod.Inverse(40.6, -73.8, 1.4, 104)
l = geod.Line(g['lat1'], g['lon1'], g['azi1'])
num = 15  # 15 intermediate steps

for i in range(num+1):
    pos = l.Position(i * g['s12'] / num)
    print(pos['lat2'], pos['lon2'])

->
(40.60, -73.8)
(49.78, -72.99)
(58.95, -71.81)
(68.09, -69.76)
(77.15, -65.01)
(85.76, -40.31)
(83.77, 80.76)
(74.92, 94.85)
...

জিওগ্রাফিকলিবের পাইথন বন্দরটি এখন পাইপাই.পাইথন.আর.পি.পি.পি
জোগ্রাফিকলিবে

এই কাগজটি আরও দেখুন: সিএফএফ কার্নে, জিওডিক্সের জন্য অ্যালগরিদম, জে জিওড, ডিওআই: dx.doi.org/10.1007/s00190-012-0578-z
সিএফকে

7

pyproj হয়েছে Geod.npts ফাংশন যা পাথ বরাবর পয়েন্ট একটি অ্যারের ফিরে আসবে। মনে রাখবেন এটি অ্যারেতে টার্মিনাল পয়েন্টগুলি অন্তর্ভুক্ত করে না, সুতরাং আপনার সেগুলি অ্যাকাউন্টে নেওয়া দরকার:

import pyproj
# calculate distance between points
g = pyproj.Geod(ellps='WGS84')
(az12, az21, dist) = g.inv(startlong, startlat, endlong, endlat)

# calculate line string along path with segments <= 1 km
lonlats = g.npts(startlong, startlat, endlong, endlat,
                 1 + int(dist / 1000))

# npts doesn't include start/end points, so prepend/append them
lonlats.insert(0, (startlong, startlat))
lonlats.append((endlong, endlat))

ধন্যবাদ! সমাধান এখানে সুপরিচিত এবং ব্যাপকভাবে ব্যবহৃত লাইব্রেরি দ্বারা সরবরাহ করা হয়েছে :)
tdihp

3

জিওপি পাইথনের জন্য একটি জিওকোডিং সরঞ্জাম বাক্স

http://code.google.com/p/geopy/wiki/GettingStarted#Calculating_distances


1
+1 জিওডেসিক বরাবর মধ্যবর্তী পয়েন্টগুলি করতে কার্যকারিতা দেখেনি, তবে জানার জন্য খুব ভাল টুলসেট (এলিপসয়েড ক্যালকগুলি পরিচালনা করে)। ধন্যবাদ.
গ্লেনন

-2

আমি এই প্যাকেজটি ব্যবহার করি নি, তবে এটি আকর্ষণীয় এবং একটি সম্ভাব্য সমাধান বলে মনে হচ্ছে: http://trac.gispython.org/lab/wiki/Shapely


7
আফাইক, সুস্পষ্টভাবে Shapely is a Python package for set-theoretic analysis and manipulation of **planar** features
স্পেরোডিয়াল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.