вычисление gps-координаты с учетом точки, азимута и расстояния

StackOverflow https://stackoverflow.com/questions/4530943

Вопрос

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

По сути, я хочу замкнуть полигон, используя точки 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 градусов.

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

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

кто-нибудь?

Это было полезно?

Решение

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

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.

Другие советы

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

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

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

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

Более новая версия геопи (+ километры вместо мили)

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top