形状优美的 LineString 的飞行路径不正确

Flight Path by shapely LineString is not correct

我想将始发地 (lat_1 lon_1) 的飞机连接到目的地 (lat_2 lon_2)。我使用 these 数据。

callsign latitude_1 longitude_1 latitude_2 longitude_2
0 HBAL102 -4.82114 -76.3194 -4.5249 -79.0103
1 AUA1028 -33.9635 151.181 48.1174 16.55
2 ABW120 41.9659 -87.8832 55.9835 37.4958
3 CSN461 33.9363 -118.414 50.0357 8.5723
4 ETH3730 25.3864 55.4221 50.6342 5.43903

但不幸的是,在使用 shapely 创建 LineString 时,我会得到不正确的结果。我使用了旋转和仿射等所有方法,但它没有正确。

代码:


cols = pd.read_csv("/content/dirct_lines.csv",sep=";")

line = cols[["callsign","latitude_1","longitude_1","latitude_2","longitude_2"]].dropna()

line['geometry'] = line.apply(lambda x: [(x['latitude_1'],
                                                         x['longitude_1']),
                                                         (x['latitude_2'],
                                                          x['longitude_2'])], axis = 1)
geoline = gpd.GeoDataFrame(line,geometry="geometry",
                      crs="EPSG:4326")

import matplotlib.pyplot as plt

world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))

ax = world.plot(figsize=(14,9),
    color='white', edgecolor='black')

geoline.plot(figsize=(14,9),ax=ax,facecolor = 'lightgrey', linewidth = 1.75,
           edgecolor = 'red',
           alpha = 2)
plt.show()

Shapely Output:

对我来说有趣的是,当我使用 Matplotlib 创建线条时,一切都是正确的。

代码:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(12, 8))


ax = fig.add_subplot(projection=ccrs.PlateCarree())


ax.stock_img()

org_lon, org_lat = cols["longitude_1"], cols["latitude_1"]
dst_lon, dst_lat = cols["longitude_2"], cols["latitude_2"]


plt.plot([org_lon, dst_lon], [org_lat, dst_lat],
        color='black', linewidth=0.5, marker='_',
        transform=ccrs.PlateCarree()
        )


plt.savefig(f"fight_path.png",dpi=60,facecolor = None, bbox_inches = 'tight', pad_inches = None)
plt.show()

Matplotlib Output:

有什么问题?

为什么 shapely 不正确?

这就是您创建几何图形的方式。以下工作正常。

import io
import geopandas as gpd
import pandas as pd
import shapely.geometry

df = pd.read_csv(
    io.StringIO(
        """callsign,latitude_1,longitude_1,latitude_2,longitude_2
HBAL102,-4.82114,-76.3194,-4.5249,-79.0103
AUA1028,-33.9635,151.181,48.1174,16.55
ABW120,41.9659,-87.8832,55.9835,37.4958
CSN461,33.9363,-118.414,50.0357,8.5723
ETH3730,25.3864,55.4221,50.6342,5.43903
"""
    )
)

geoline = gpd.GeoDataFrame(
    geometry=[
        shapely.geometry.LineString(points)
        for points in zip(
            gpd.points_from_xy(df["longitude_1"], df["latitude_1"]),
            gpd.points_from_xy(df["longitude_2"], df["latitude_2"]),
        )
    ],
    data=df,
)

import matplotlib.pyplot as plt

world = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres"))
ax = world.plot(figsize=(14, 9), color="white", edgecolor="black")

geoline.plot(
    figsize=(14, 9),
    ax=ax,
    facecolor="lightgrey",
    linewidth=1.75,
    edgecolor="red",
)
plt.show()