Вычисление координаты GPS с учетом точки, азимута и расстояния

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

Я в основном пытаюсь поймать многоугольник, используя точки 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 ответа

Решение

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

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.1955489, -76.853359.

Более новая версия 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

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

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

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

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

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
Другие вопросы по тегам