有没有办法在散景中绘制非圆弧?

时间:2018-12-05 13:59:34

标签: python python-3.x bokeh

我正在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)

散景中是否存在类似的东西?

2 个答案:

答案 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