Home > Blockchain >  Flight Path by shapely LineString is not correct
Flight Path by shapely LineString is not correct

Time:12-16

I want to connect airplanes in origin (lat_1 lon_1) to dest(lat_2 lon_2). I use these data.

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

But unfortunately, I would get an incorrect result when creating LineString with shapely. I used everything like rotate and affine but it didn't correct.

Code:


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:

something that was interesting for me was that when I use Matplotlib to create lines everything is correct.

Code:

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:

What is the problem?

why isn't correct by shapely?

CodePudding user response:

it's just the way you are creating the geometry. Below works correctly.

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()
  • Related