Преобразовать географическое местоположение в координаты xy, чтобы получить относительное положение из центральной точки?

#python #plot #geolocation #trigonometry

#python #график #геолокация #тригонометрия

Вопрос:

Я пытаюсь зафиксировать относительное положение от одной широтной координаты в центре до всех остальных координат.

Чтобы привести вам пример, предположим, у нас есть 3 города Амстердам, Лондон и Цюрих.

Амстердам должен быть моей центральной точкой с координатами (0,0) xy на 2D плоскости. Теперь с помощью компаса я пытаюсь вычислить относительное направление как Лондона (запад), так и Цюриха (юго-восток) от Амстердама. Как только у меня будет записано направление и рассчитано расстояние между Амстердамом и Лондоном, а также Амстердамом и Цюрихом, я хочу отобразить это как координаты XY.

Я не уверен, чего мне не хватает в этом. Я концептуально неправ?

Текущий вывод:

Текущий вывод:

Ожидаемый результат:

Ожидаемый результат:

Пример кода:

 import math

def calc_compass_bearing(pointA, pointB):

    lat1 = math.radians(pointA[0])
    lat2 = math.radians(pointB[0])

    diffLong = math.radians(pointB[1] - pointA[1])

    x = math.sin(diffLong) * math.cos(lat2)
    y = math.cos(lat1) * math.sin(lat2) - (math.sin(lat1)
                                           * math.cos(lat2) * math.cos(diffLong))

    initial_bearing = math.atan2(x, y)

    initial_bearing = math.degrees(initial_bearing)
    compass_bearing = (initial_bearing   360) % 360

    return compass_bearing


def calc_dist(lat1, lon1, lat2, lon2):

    R = 6372.8  # earth radius in kms

    dLat = math.radians(lat2 - lat1)
    dLon = math.radians(lon2 - lon1)
    lat1 = math.radians(lat1)
    lat2 = math.radians(lat2)

    a = math.sin(dLat / 2)**2   math.cos(lat1) * 
        math.cos(lat2) * math.sin(dLon / 2)**2
    c = 2 * math.asin(math.sqrt(a))

    return R * c


locs = {'london': (51.509865, -0.118092),
        'zurich': (47.36667, 8.55),
        'amsterdam': (52.377956, 4.897070)}


# center point here is amsterdam
cp = 'amsterdam'
cp_geo_cords = locs[cp]
cp_xy_cords = (0, 0)


plot_input = {}
for i in locs.keys():
    rp_geo_cords = locs[i]

    if i == cp:
        plot_input[i] = cp_xy_cords
    else:
        bearing = calc_compass_bearing(cp_geo_cords, rp_geo_cords)
        dist = calc_dist(
            cp_geo_cords[0], cp_geo_cords[1], rp_geo_cords[0], rp_geo_cords[1])

        bearing_rad = bearing * (math.pi / 180)  # convert bearing to radians
        delta_x = dist * math.sin(bearing_rad)
        delta_y = dist * math.cos(bearing_rad)
        tree_x = cp_xy_cords[0]   delta_x
        tree_y = cp_xy_cords[1]   delta_y

        plot_input[i] = (tree_x, tree_y)


#plotting using pyvis
from pyvis.network import Network
net = Network(height='800px', width='1200px')

for node in plot_input.keys():
    net.add_node(node, color='red', size=15,
                 x=plot_input[node][0], y=plot_input[node][0], physics=False)

net.show("output.html")
  

Ответ №1:

Я нашел ошибку. При построении графика я также использовал x cordniate в параметре y.

 for node in plot_input.keys():
    net.add_node(node, color='red', size=15,
                 x=plot_input[node][0], y=plot_input[node][0], physics=False)
  

Код отлично работает после исправления этого! Просто нужно инвертировать ось Y.