分离数据帧纬度/经度对并根据列值绘制多个图形

Posted

技术标签:

【中文标题】分离数据帧纬度/经度对并根据列值绘制多个图形【英文标题】:Separate dataframe lat/lon pairs and plot multiple figures based on column value 【发布时间】:2020-09-17 16:12:13 【问题描述】:

我有一个形成多边形的纬度/经度对的数据框。 lat/lon 列中带有“GAP”和 NaN 的行是分隔符。所以在这种情况下,我有 4 个具有多个纬度/经度位置的多边形。我的目标是将这些多边形彼此分开,然后使用 cartopy 进行绘图。

    0      1           2
0   POINT  87.6298     9.397332
1   POINT  87.8435     9.842206
2   POINT  87.2354     9.472004
4     GAP         NaN       NaN
5   POINT  87.8354     9.397332
6   POINT  87.9544     9.472004
7   POINT  87.9632     9.191509
8   POINT  87.6244     9.221509
9   POINT  87.4554     9.397332
10    GAP         NaN       NaN
11  POINT  87.6249     9.397332
12  POINT  87.7556     9.221509
13  POINT  87.5567     9.086767
14  POINT  87.3222     9.397332
15    GAP         NaN       NaN
16  POINT  87.6554     9.221509
17  POINT  87.9667     9.191509
18  POINT  87.8854     9.056767
19  POINT  87.4452     9.086767

假设在任何时候运行此程序,每个多边形中的多边形数量和纬度/经度对的数量都会发生变化。

设置示例代码如下:

df = pd.read_excel(xl, sheet_name=0, header=None)
#change column names
df.rename(columns=1:'lon', 2:'lat',inplace=True)
#replace GAP with nan so i can separate by group numbers with each line of nans (didnt work with 'GAP')
df.replace('GAP',np.nan, inplace=True)
df['group_no'] = df.isnull().all(axis=1).cumsum()
#define amount of unique numbers and put into list for looping
numbers = df['group_no'].unique()

aa = list(numbers)

这是我迷路的地方(设置后和绘制代码之前的区域)如下所示。

a_lon, a_lat = 87.8544, 8.721576
b_lon, b_lat = 87.6554, 8.585951


fig,ax = plt.subplots()
plt.figure(figsize=(10.6,6))
proj = ccrs.PlateCarree()

ax = plt.axes(projection=proj)
ax.stock_img()
ax.set_extent([90, 85, 7, 11], crs=ccrs.PlateCarree()) 


proj = ccrs.Geodetic()
plt.plot([a_lon, b_lon], [a_lat, b_lat], linewidth=1, color='blue', transform=proj)
#plt.show()

如您所见,我用 NaN 替换了“GAP”,然后用“group_no”分隔行,这是一个新列。然后去掉了楠的。结果数据框:

        0         lon       lat  group_no
0   POINT  87.6298     9.397332         0
1   POINT  87.8435     9.842206         0
2   POINT  87.2354     9.472004         0
4   POINT  87.8354     9.397332         1
5   POINT  87.9544     9.472004         1
6   POINT  87.9632     9.191509         1
7   POINT  87.6244     9.221509         1
8   POINT  87.4554     9.397332         1
10  POINT  87.6249     9.397332         2
11  POINT  87.7556     9.221509         2
12  POINT  87.5567     9.086767         2
13  POINT  87.3222     9.397332         2
15  POINT  87.6554     9.221509         3
16  POINT  87.9667     9.191509         3
17  POINT  87.8854     9.056767         3
18  POINT  87.4452     9.086767         3

我尝试了几件事,但似乎无法完成交易。我尝试使用 group_by 将它们分隔在字典中,键是 group_no,值是 lat/lon 对,但我不太了解字典来操作它们并为每个“键”绘图。

我还尝试将每个分隔成一个新的数据框。以为我可以循环并创建一个 df0、df1 等,然后使用 for 循环进行绘图,但也无法弄清楚。

我们将不胜感激,如果需要更多详细信息,请询问。

【问题讨论】:

【参考方案1】:

您快到了,如果您在组号上调用 groupby,您只需拉出每个组并获取纬度/经度对。确保您也设置了正确的投影。

from shapely.geometry import Polygon

for group_no,group_data in df.groupby('group_no'):
    poly_coords = group_data[['lon','lat']].values

    # Whatever function you are using to create shape with the 'poly_coords e.g.'
    polygon = Polygon(poly_coords)

    #add to map ...



【讨论】:

以前从未使用过多边形。我如何使用它进行绘图?编辑:没关系:使用了 polygon.exterior.coords

以上是关于分离数据帧纬度/经度对并根据列值绘制多个图形的主要内容,如果未能解决你的问题,请参考以下文章

如何在散景中绘制纬度和经度

批量绘图 EXCEL绘制基站扇区地图

如何在不同的数据帧中选择特定时间段内的点,然后根据纬度/经度选择这两个点之间的距离

使用数据库中的多个纬度和经度值在 Google 地图上标记路线

在实时纬度和经度之间绘制路线

数据帧的纬度/经度到 UTM 转换失败