我正在Bokeh中进行飞行路径数据可视化,并且想知道是否存在更精确的绘制弧线的方法。使用两个地理位置之间的大圆弧导航方程式,我可以找到一个中点,并且我目前正在使用弧形字形绘制由飞行路径的点(起点,中点,终点)定义的圆,并带有起点和终点角度是两个机场的位置。
这对于短距离路线非常有效,但是靠近极点的非常长的路线会变得相当扭曲,并且弧线看起来不正确。这是由于Bokeh在CARTODBPOSITRON地图中使用的Web Mercator标准投影。
我也可以从大圆导航方程中找到初始和最终标题。所以我在这里的基本问题是我想做类似的事情:
m = figure()
m.non_circular_arc(start_x, start_y, start_angle, mid_x, mid_y, end_x, end_y, end_angle)
散景中是否存在类似的东西?
答案 0 :(得分:0)
Bokeh支持使用bezier
字形方法绘制三次Bézier曲线:
https://bokeh.pydata.org/en/latest/docs/reference/plotting.html#bokeh.plotting.figure.Figure.bezier
也可以quadratic
弯曲,如果足够的话。
答案 1 :(得分:0)
我从this answer到"How do great circles project on the mercator projection?"设计了这个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 < z <1)在地图上的高度 z 。
您像这样使用它
z = make_z(45, 10, 30, 100)
print(z(10), z(100))
# 0.7071067811865475 0.5000000000000003