python - पायथन में हावरसिन फॉर्मूला(दो जीपीएस अंक के बीच असर और दूरी)




gps distance (6)

मुसीबत

मैं जानना चाहता हूं कि 2 जीपीएस अंकों के बीच दूरी और असर कैसे प्राप्त करें। मैंने हावर्सिन फॉर्मूला पर शोध किया है। किसी ने मुझे बताया कि मैं उसी डेटा का उपयोग करके असर भी पा सकता हूं।

संपादित करें

सब ठीक काम कर रहा है लेकिन असर अभी तक काफी काम नहीं करता है। असर नकारात्मक उत्पादन करता है लेकिन 0 - 360 डिग्री के बीच होना चाहिए। सेट डेटा को क्षैतिज असर 96.02166666666666 बनाना चाहिए और यह है:

Start point: 53.32055555555556 , -1.7297222222222221   
Bearing:  96.02166666666666  
Distance: 2 km  
Destination point: 53.31861111111111, -1.6997222222222223  
Final bearing: 96.04555555555555

मेरा नया कोड यहां दिया गया है:

from math import *

Aaltitude = 2000
Oppsite  = 20000

lat1 = 53.32055555555556
lat2 = 53.31861111111111
lon1 = -1.7297222222222221
lon2 = -1.6997222222222223

lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])

dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * atan2(sqrt(a), sqrt(1-a))
Base = 6371 * c


Bearing =atan2(cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(lon2-lon1), sin(lon2-lon1)*cos(lat2)) 

Bearing = degrees(Bearing)
print ""
print ""
print "--------------------"
print "Horizontal Distance:"
print Base
print "--------------------"
print "Bearing:"
print Bearing
print "--------------------"


Base2 = Base * 1000
distance = Base * 2 + Oppsite * 2 / 2
Caltitude = Oppsite - Aaltitude

a = Oppsite/Base
b = atan(a)
c = degrees(b)

distance = distance / 1000

print "The degree of vertical angle is:"
print c
print "--------------------"
print "The distance between the Balloon GPS and the Antenna GPS is:"
print distance
print "--------------------"

असर गणना गलत है, आपको इनपुट को एटान 2 में स्वैप करने की आवश्यकता है।

    bearing = atan2(sin(long2-long1)*cos(lat2), cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(long2-long1))
    bearing = degrees(bearing)
    bearing = (bearing + 360) % 360

यह आपको सही असर देगा।


आप 360 डिग्री जोड़कर नकारात्मक असर समस्या को हल कर सकते हैं। दुर्भाग्यवश, इसका परिणाम सकारात्मक बीयरिंग के लिए 360 डिग्री सेल्सियस से अधिक हो सकता है। यह मॉड्यूलो ऑपरेटर के लिए एक अच्छा उम्मीदवार है, इसलिए आपको सभी को लाइन जोड़नी चाहिए

Bearing = (Bearing + 360) % 360

आपकी विधि के अंत में।


इनमें से अधिकतर उत्तर पृथ्वी के त्रिज्या "गोलाकार" हैं। यदि आप इन्हें अन्य दूरी कैलकुलेटर (जैसे भूगोल) के खिलाफ जांचते हैं, तो ये कार्य बंद हो जाएंगे।

यह अच्छी तरह से काम करता है:

lon1 = -103.548851
lat1 = 32.0004311
lon2 = -103.6041946
lat2 = 33.374939


def haversine(lat1, lon1, lat2, lon2):

      R = 3959.87433 # this is in miles.  For Earth radius in kilometers use 6372.8 km

      dLat = radians(lat2 - lat1)
      dLon = radians(lon2 - lon1)
      lat1 = radians(lat1)
      lat2 = radians(lat2)

      a = sin(dLat/2)**2 + cos(lat1)*cos(lat2)*sin(dLon/2)**2
      c = 2*asin(sqrt(a))

      return R * c

print(haversine(lat1, lon1, lat2, lon2))

इस लिंक का संदर्भ लें: https://gis.stackexchange.com/questions/84885/whats-the-difference-between-vincenty-and-great-circle-distance-calculations

यह वास्तव में दूरी पाने के दो तरीके देता है। वे हावरसिन और विन्सेंटिस हैं। मेरे शोध से मुझे पता चला कि विन्सेंटिस अपेक्षाकृत सटीक है। कार्यान्वयन करने के लिए आयात विवरण का भी उपयोग करें।


दूरी और असर की गणना करने के लिए यहां दो कार्य हैं, जो पिछले संदेशों में कोड पर आधारित हैं और https://gist.github.com/jeromer/2005586 (अक्षांश में भौगोलिक बिंदुओं के लिए जोड़ा गया टुपल प्रकार, स्पष्टता के लिए दोनों कार्यों के लिए लोन प्रारूप )। मैंने दोनों कार्यों का परीक्षण किया और वे सही काम करने लगते हैं।

#coding:UTF-8
from math import radians, cos, sin, asin, sqrt, atan2, degrees

def haversine(pointA, pointB):

    if (type(pointA) != tuple) or (type(pointB) != tuple):
        raise TypeError("Only tuples are supported as arguments")

    lat1 = pointA[0]
    lon1 = pointA[1]

    lat2 = pointB[0]
    lon2 = pointB[1]

    # convert decimal degrees to radians 
    lat1, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon2]) 

    # haversine formula 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    r = 6371 # Radius of earth in kilometers. Use 3956 for miles
    return c * r


def initial_bearing(pointA, pointB):

    if (type(pointA) != tuple) or (type(pointB) != tuple):
        raise TypeError("Only tuples are supported as arguments")

    lat1 = radians(pointA[0])
    lat2 = radians(pointB[0])

    diffLong = radians(pointB[1] - pointA[1])

    x = sin(diffLong) * cos(lat2)
    y = cos(lat1) * sin(lat2) - (sin(lat1)
            * cos(lat2) * cos(diffLong))

    initial_bearing = atan2(x, y)

    # Now we have the initial bearing but math.atan2 return values
    # from -180° to + 180° which is not what we want for a compass bearing
    # The solution is to normalize the initial bearing as shown below
    initial_bearing = degrees(initial_bearing)
    compass_bearing = (initial_bearing + 360) % 360

    return compass_bearing

pA = (46.2038,6.1530)
pB = (46.449, 30.690)

print haversine(pA, pB)

print initial_bearing(pA, pB)

यहां एक पायथन संस्करण है:

from math import radians, cos, sin, asin, sqrt

def haversine(lon1, lat1, lon2, lat2):
    """
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees)
    """
    # convert decimal degrees to radians 
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])

    # haversine formula 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    r = 6371 # Radius of earth in kilometers. Use 3956 for miles
    return c * r






bearing