Я хочу найти местоположение пользователя в пределах 500 метров от заданного широты и длины в Python.

Задано lat & long = 19.114315,72.911174

И я хочу проверить, находится ли новый лат и лонг в диапазоне 500 метров от заданного лат и лонг ..

Новый лонг и лонг = 19.112398,72.912743

Я использую эту формулу в Python ..

math.acos(math.sin(19.114315) * math.sin(19.112398) + math.cos(19.114315) * math.cos(19.112398) * math.cos(72.912743 - (72.911174))) * 6371 <= 0.500 

Но это не дает мне ожидаемых результатов. Я что-то упустил? пожалуйста помоги..

4
Neil 14 Дек 2015 в 11:54

3 ответа

Лучший ответ

Вы можете использовать формулу Haversine, чтобы получить расстояние большого круга (вдоль сферы) между двумя точками. Есть некоторые проблемы с обработкой земли как сферы на большие расстояния, но для 500 метров вы, вероятно, в порядке (при условии, что вы не пытаетесь бросить медицинские пакеты на лодку или что-то в этом роде).

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

def haversine(lat1, long1, lat2, long2, EARTH_RADIUS_KM=6372.8):

    # get distance between the points
    phi_Lat = radians(lat2 - lat1)
    phi_Long = radians(long2 - long1)

    lat1 = radians(lat1)
    lat2 = radians(lat2)

    a = sin(phi_Lat/2)**2 + \
        cos(lat1) * cos(lat2) * \
        sin(phi_Long/2)**2

    c = 2 * asin(sqrt(a))
    return EARTH_RADIUS_KM * c

Если расстояние между двумя точками меньше вашего порога, оно находится в пределах диапазона:

points_1 = (19.114315,72.911174)
points_2 = (19.112398,72.912743)
threshold_km = 0.5


distance_km = haversine(points_1[0], points_1[1], points_2[0], points_2[1])
if distance_km < threshold_km:
    print('within range')
else:
    print('outside range')
1
14 Дек 2015 в 09:47

Подсказка: напишите повторно используемый код и очистите свою математику. кажется, у вас есть ошибка, прямо в конце этой формулы ..

math.cos(longRad - (longRad)) == math.cos (0) == 1

Я плохо разбираюсь в гео вещах, поэтому я не буду исправлять это ..

import math

def inRangeRad(latRad, longRad):
    sinLatSqrd = math.sin(latRad) * math.sin(latRad)
    cosLatSqrd = math.cos(latRad) * math.cos(latRad)
    inner = sinLatSqrd +  cosLatSqrd * math.cos(longRad - (longRad))
    return math.acos( inner ) * 6371 <= 0.500

def inRangeDeg(latDeg, longDeg):
    latRad = 0.0174532925 * latDeg
    longRad = 0.0174532925 * longDeg
    return inRangeRad(latRad, longRad)

print "test"
print "19.114315, 72.911174"
print inRangeDeg(19.114315, 72.911174)
0
Henrik 14 Дек 2015 в 09:19

Будьте очень осторожны с этим! Вы не можете просто использовать cos и sin для расстояний, использующих координаты GPS, потому что расстояние будет неправильным!

https://en.wikipedia.org/wiki/Geodesy#Geodetic_problems

В случае плоской геометрии (справедливой для небольших областей на поверхности Земли) решения обеих задач сводятся к простой тригонометрии. На сфере решение значительно сложнее, например, в обратной задаче азимуты будут различаться между двумя конечными точками соединяющего большого круга, дуги, то есть геодезической.

Посмотрите GeoPy для этих расчетов, вы действительно не хотите реализовывать это самостоятельно.

0
mirosval 14 Дек 2015 в 09:29