Конвертировать Lat / long в XY - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу преобразовать широту / долготу в координаты XY. Я взял это уравнение, но не могу получить желаемый результат:

x = r λ cos(φ0)
y = r φ

Измерения двух точек:

point1 = (-37.8206195, 144.9837765)
point2 = (-37.8193712, 144.9837765) 

Попытка:

import math

avg = (-37.8206195 + -37.8193712)/2
rad_avg = math.pi / 180

point1 = (-37.8206195, 144.9837765)
point2 = (-37.8193712, 144.9837765) 

dist = rad_avg * math.cos(avg)

print(dist)

Из:

0.01732592680044846

Выход должен быть около 160 м

1 Ответ

0 голосов
/ 07 ноября 2018

Прежде всего math.cos ожидает аргумент угла в радианах. Для перевода из градусов в радианы вам нужно сделать:

rad_avg = avg * math.pi / 180

Или даже:

math.radians(<angle_in_degrees>)

В основном это означает, что вы отображаете 180º с помощью pi и берете часть под свой угол.

Тогда я предполагаю, что вы хотите вычислить расстояние между обеими точками, сначала преобразовав его в координаты "xy" (в соответствии с вашей ссылкой ).

Вам нужно сначала получить обе точки в одной и той же системе координат. Как говорится в ссылке, для небольших областей их можно оценить по:

  • x = r λ cos (φ0)
  • y = r φ

Так что вам нужно сделать:

import math

point1 = (-37.8206195, 144.9837765) # Lat/Long (lambda/phi)
point2 = (-37.8193712, 144.9837765) # Lat/Long (lambda/phi)

r = 6371000 # meters
phi_0 = point1[1]
cos_phi_0 = math.cos(math.radians(phi_0))

def to_xy(point, r, cos_phi_0):
    lam = point[0]
    phi = point[1]
    return (r * math.radians(lam) * cos_phi_0, r * math.radians(phi))

point1_xy = to_xy(point1, r, cos_phi_0)
point2_xy = to_xy(point2, r, cos_phi_0)

Наконец, для вычисления расстояния в декартовых координатах необходимо использовать Теорема Питагора d = sqrt(delta_x^2 + delta_y^2)

В вашем примере:

dist = math.sqrt((point1_xy[0] - point2_xy[0])**2 + (point1_xy[1] - point2_xy[1])**2)

Какие результаты: 113.67954606562853. Ближе к тому, что вы ищете.

Плюс, есть ярлык, чтобы получить правильную формулу расстояния:

  • d = r * sqrt(x² + y²), где x = (λ2 - λ1) * math.cos(φ0) и y = (φ2 - φ1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...