使“大圆弧”在Web墨卡托地图上看起来不错?


11

我正在尝试创建一个地图,其中的数据表示一些航班,并且希望使用大圆弧来连接源和目的地。

基本上,我想做一些类似于著名的Facebook地图的事情: 在此处输入图片说明

我使用了这篇文章中给出的功能:https : //gis.stackexchange.com/a/5205/442(即此博客文章:http : //anitagraser.com/2011/08/20/visualizing-global-connections /),我可以得到线,但它们越过国际日期线,并且在两极处扎堆:

在此处输入图片说明

@underdark在链接的博客文章中提到,这些行需要拆分,但是我不知道如何在PostGIS中自动拆分它们。

另外,极点附近的线束也需要解决。

当我有这些航班的起点和终点的位置时,我该怎么做?


可以使用极投影吗?
伊恩·特顿

2
我在这里给出了一些示例:gis.stackexchange.com/questions/133026/…。请注意,eqdc不能提供真正的大圆,而aeqd可以。
AndreJ

Answers:



8

您可以计算测地线。假设要显示从A到B的测地线,则可以首先计算从A到B的距离和方位角(反测地线问题),然后计算从A到A和B之间的几个点(直接测地线问题)。我使用GeographicLib在Python中添加了一个简单的脚本,只是在GeoJSON中输出内容:

from geographiclib.geodesic import Geodesic
from geojson import MultiLineString

def geodesic(lat1, lon1, lat2, lon2, steps):
    inverse = Geodesic.WGS84.Inverse(lat1, lon1, lat2, lon2)
    linestrings = []
    coordinates = []

    for i in range(0, steps + 1):
        direct = Geodesic.WGS84.Direct(inverse['lat1'], inverse['lon1'], inverse['azi1'], (i / float(steps)) * inverse['s12'])
        if len(coordinates) > 0:
            if (coordinates[-1][0] < -90 and direct['lon2'] > 90) or (coordinates[-1][0] > 90 and direct['lon2'] < -90):
                linestrings.append(coordinates)
                coordinates = []
        coordinates.append((direct['lon2'], direct['lat2']))

    linestrings.append(coordinates)
    geojson = MultiLineString(linestrings)
    return geojson

linestrings = []

# San Francisco: 37.7793, -122.4192
# Bangalore: 12.9, 77.616667
for linestring in geodesic(37.7793, -122.4192, 12.95, 77.616667, 100)['coordinates']:
    linestrings.append(linestring)

# Boston: 42.357778, -71.059444
# Bangalore: 12.9, 77.616667
for linestring in geodesic(42.357778, -71.059444, 12.95, 77.616667, 100)['coordinates']:
    linestrings.append(linestring)

print(MultiLineString(linestrings))

结果是WGS-84中两点之间的真实测地线。当然,您可以将坐标转换为所需的任何投影。在geojson.io上可视化的结果如下所示:

在此处输入图片说明


2
请参阅geoliblib.sourceforge.net/html/python/…,了解使用GeographicLib进行此操作的另一种方法(并且更快!)。还要注意使用LONG_UNROLL标志来确保经度的连续性。
cffk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.