вычисление координаты GPS с учетом точки, азимута и расстояния - PullRequest
3 голосов
/ 25 декабря 2010

У меня есть проблема, которая на какое-то время притягивает меня назад в каком-то проекте.

Я в основном пытаюсь поймать многоугольник, используя точки x, y, нарисованные ранее написанным сценарием.lat1, lon1 - центральные gps-шнуры многоугольника, и я ищу его окружающий многоугольник.

вот часть моего кода на python:

def getcords(lat1,lon1,dr,bearing):
    lat2=asin(sin(lat1)*cos(dr)+cos(lat1)*sin(dr)*cos(bearing))
    lon2=lon1+atan2(sin(bearing)*sin(dr)*cos(lat1),cos(dr)-sin(lat1)*sin(lat2))
    return [lat2,lon2]

мой ввод выглядит так: lat1, lon1 - даны в десятичных градусах.-dr - это угол, вычисленный путем деления расстояния в милях на -излучения (= 3958,82) Земли между 0-360 градусами.

однако для входных данных getcorsds1 (42.189275, -76.85823,0.5 / 3958.82,30) я получаю [-1.3485899508698462, -76.8576637627568], однако [42.2516666666667, -76.8097222222222] - правильный ответ.

что касается углового расстояния, то я вычисляю его просто путем деления расстояния в милях на радиусы Земли (= 3958,82).

Кто-нибудь?

Ответы [ 4 ]

4 голосов
/ 25 декабря 2010

Почему бы вам не использовать хорошие библиотеки ?

from geopy import Point
from geopy.distance import distance, VincentyDistance

# given: lat1, lon1, bearing, distMiles
lat2, lon2 = VincentyDistance(miles=distMiles).destination(Point(lat1, lon1), bearing)

Для lat1, lon1, distMiles, отношение = 42,189275, -76,85823, 0,5, 30 возвращает 42,194889, -76,853359.

2 голосов
/ 25 декабря 2010

Функции sin и cos ожидают свои аргументы в радианах , а не в градусах. Функции asin и atan2 выдают результат в радианах , а не в градусах. Как правило, необходимо преобразовать входные углы (lat1, lon1 и подшипник) из градусов в радианы, используя math.radians(), и преобразовать выходные углы (lat2 и lon2) из ​​радианов в градусы, используя math.degrees().

Обратите внимание, что в вашем коде есть две другие проблемы:

(1) Он не позволяет путешествовать по 180-градусному меридиану долготы; Вы должны ограничить свой ответ таким образом, чтобы -180 <= longitude_degrees <= + 180. </p>

(2) Если вы собираетесь широко использовать эту функцию, вы можете удалить избыточные вычисления: sin (lat1), cos (dr), cos (lat1) и sin (dr) рассчитываются дважды.

1 голос
/ 17 ноября 2016

более новая версия geopy (+ километры вместо миль)

from geopy import Point
from geopy.distance import vincenty

distKm = 1
lat1 = 35.68096477080332 
lon1 = 139.76720809936523

print 'center', lat1, lon1
print 'north', vincenty(kilometers=distKm).destination(Point(lat1, lon1), 0).format_decimal()
print 'east', vincenty(kilometers=distKm).destination(Point(lat1, lon1), 90).format_decimal()
print 'south', vincenty(kilometers=distKm).destination(Point(lat1, lon1), 180).format_decimal()
print 'west', vincenty(kilometers=distKm).destination(Point(lat1, lon1), 270).format_decimal()

результат равен

center 35.6809647708 139.767208099
north 35.6899775841, 139.767208099
east 35.680964264, 139.778254714
south 35.6719519439, 139.767208099
west 35.680964264, 139.756161485
0 голосов
/ 17 мая 2014

eumiro ваш код
результат Too many values to unpack
как это исправить

from geopy import Point
from geopy.distance import distance, VincentyDistance

# given: lat1, lon1, bearing, distMiles
lat2, lon2 = VincentyDistance(miles=9.32057).destination(Point(52.20444, 0.3605$
print lat2, lon2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...