Разделите пары широты и долготы фрейма данных и постройте несколько цифр на основе значения столбца - PullRequest
0 голосов
/ 30 мая 2020

У меня есть фрейм данных пар широты и долготы, образующих многоугольник. Строки с GAP и NaN в столбцах lat / lon являются разделителями. Итак, в этом случае у меня есть 4 полигона с несколькими местоположениями по широте и долготе. Моя цель - отделить эти полигоны друг от друга, а затем построить график с использованием картографии.

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

Итак, как вы видите, я заменил GAP на NaN, а затем разделил строки с помощью 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, но я недостаточно хорошо знаю словари, чтобы управлять ими и строить график для каждого «ключа».

Я также попытался разделить каждое на новый фрейм данных. Думая, что я могу l oop через и создать df0, df1, et c. а затем используйте a для l oop для построения графика, но я тоже не мог этого понять.

Любая помощь будет принята с благодарностью, и, пожалуйста, спросите, необходимы ли дополнительные сведения.

1 Ответ

1 голос
/ 30 мая 2020

Вы почти у цели, если вы вызываете 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 ...



...