#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.