Вычисление координаты 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