将 DataFrame 转换为多多边形 DataFrame,多个数据点 - python

时间:2021-04-05 19:50:41

标签: python dataframe polygon geopandas

我有一个如下所示的 DataFrame,我想将数据转换为多多边形 DataFrame,因为我想在地图上绘制每个多多边形。

如果我有两个数据点,我知道如何转换,但是如果有 6 个数据点,我不知道如何转换它。谁能帮帮我。



geometry = [Point(xy) for xy in zip(neightrip_counts_.lan0, neightrip_counts_.long0)]
geometry
#neightrip_counts_.lan1, neightrip_counts_.long1,neightrip_counts_.lan2, neightrip_counts_.long2


    lan0          long0       lan1        long1      lan2         long2
0   59.915667   10.777567   59.916738   10.779916   59.914943   10.773977
1   59.929853   10.711515   59.929435   10.713682   59.927596   10.710033
2   59.939230   10.759170   59.937205   10.760581   59.943750   10.760306
3   59.912520   10.762240   59.911594   10.761774   59.912347   10.763815
4   59.929634   10.732839   59.927140   10.730981   59.931081   10.736003

2 个答案:

答案 0 :(得分:1)

试试这个,假设 'lan' 是纬度。

import geopandas as gpd
from shapely.geometry import Polygon
import numpy as np
import pandas as pd
import folium

# ....

def addpolygeom(row):
    row_array = np.array(row)
    # split dataframe row to a list of tuples (lat, lon)
    coords = [tuple(i)[::-1] for i in np.split(row_array, range(2, row_array.shape[0], 2))]
    polygon = Polygon(coords)
    return polygon

# Convert points to shapely geometry
neightrip_counts_['geometry'] = neightrip_counts_.apply(lambda x: addpolygeom(x), axis=1)

# Create a GeoDataFrame
gdf = gpd.GeoDataFrame(neightrip_counts_, geometry='geometry')

start_coords = [ gdf.centroid[0].y, gdf.centroid[0].x]
gdf_json = gdf.to_json()

map = folium.Map(start_coords, zoom_start=4)
folium.GeoJson(gdf_json, name='mypolygons').add_to(map)

答案 1 :(得分:1)

为了简洁起见,让我将数据框 neightrip_counts_ 重命名为 df。这是将为每一行数据框创建多边形的相关代码。

df['geometry'] = [Polygon([(z[0],z[1]), (z[2],z[3]), (z[4],z[5])]) for z in zip(df.long0, df.lan0, df.long1, df.lan1, df.long2, df.lan2)]
gpdf = df.set_geometry("geometry", drop=True)
gpdf.plot()

polyplot

顺便说一下,你必须注意 (long, lat) 的顺序。

start_coords = [ gdf.centroid[0].x, gdf.centroid[0].y] # is wrong

改用这个。

start_coords = [ gdf.centroid[0].y, gdf.centroid[0].x]

编辑

为了读者的利益,这里是完整的可运行代码:

import pandas as pd
import geopandas as gpd

from io import StringIO

from shapely.geometry import Polygon, Point, LineString
import numpy as np
import folium

data1 = """index    lan0          long0       lan1        long1      lan2         long2
0   59.915667   10.777567   59.916738   10.779916   59.914943   10.773977
1   59.929853   10.711515   59.929435   10.713682   59.927596   10.710033
2   59.939230   10.759170   59.937205   10.760581   59.943750   10.760306
3   59.912520   10.762240   59.911594   10.761774   59.912347   10.763815
4   59.929634   10.732839   59.927140   10.730981   59.931081   10.736003"""

# read/parse data into dataframe
df0 = pd.read_csv(StringIO(data1), sep='\s+', index_col='index')
# create `geometry` column
df0['geometry'] = [Polygon([(xy[0],xy[1]), (xy[2],xy[3]), (xy[4],xy[5])]) \
                   for xy in zip(df0.long0, df0.lan0, df0.long1, df0.lan1, df0.long2, df0.lan2)]

# set geometry
gpdf = df0.set_geometry("geometry", drop=True)

# do check plot. (uncomment next line)
#gpdf.plot()

# make geojson
center_pt = gpdf.centroid[0].y, gpdf.centroid[0].x
gdf_json = gpdf.to_json()

# plot the geojson on the folium webmap
webmap = folium.Map(location = center_pt, zoom_start = 13, min_zoom = 3)
folium.GeoJson(gdf_json, name='data_layer_1').add_to(webmap)

# this opens the webmap
webmap

输出屏幕截图(交互式网络地图):

webmap