Есть ли способ построить некруглую дугу в Боке? - PullRequest
0 голосов
/ 05 декабря 2018

Я работаю над визуализацией данных о траектории полета в Боке и мне интересно, есть ли более точный способ построения дуг.Используя уравнения навигации по большому кругу между двумя геолокациями, я могу найти среднюю точку, и в настоящее время я использую глиф дуги, чтобы построить окружность, определенную точками (начало, середина, конец) траектории полета, с началом и концом.Углы являются местами расположения двух аэропортов.

Отлично подходит для коротких маршрутов, но очень длинные маршруты, приближающиеся к полюсам, сильно искажаются, и дуги выглядят неправильно.Это связано со стандартной проекцией Web Mercator, используемой Боке в карте CARTODBPOSITRON.

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

m = figure()
m.non_circular_arc(start_x, start_y, start_angle, mid_x, mid_y, end_x, end_y, end_angle)

Существует ли что-то подобное в Боке?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Начиная с этого ответа до «Как большие круги проецируются на проекцию меркатора?» Я разработал эту функцию Python

def make_z(lat1, lon1, lat2, lon2):
    from math import degrees, radians, sin, sqrt
    from scipy.optimize import newton
    lat1, lon1, lat2, lon2 = map(radians, (lat1, lon1, lat2, lon2))
    z1, z2 = map(sin, (lat1, lat2))
    def find_z2(lon0):
        dd = (1-z1**2)*sin(lon1+lon0)**2/z1**2
        s = sin(lon2+lon0)
        return z2-s/sqrt(dd+s**2)
    lon0 = newton(find_z2, 0)
    dd = (1-z1**2)*sin(lon1+lon0)**2/z1**2
    def z(f):
        s = sin(radians(f)+lon0)
        return s/sqrt(dd+s**2)
    return z

где вход - это четверка (в градусах), которая описывает начальную точку и конечную точку большой дуги, а выход - это функция долготы (в градусах), которая описывает нормализованную (-1 <<em> z <1) высота <em>z на карте.

Вы используете это так

z = make_z(45, 10,   30, 100)
print(z(10), z(100))
# 0.7071067811865475 0.5000000000000003
0 голосов
/ 05 декабря 2018

Bokeh поддерживает рисование кубических кривых Безье с помощью метода глифа bezier:

https://bokeh.pydata.org/en/latest/docs/reference/plotting.html#bokeh.plotting.figure.Figure.bezier

Или quadratic кривых, если этого достаточно.

...