【问题标题】:Convert DataFrame to a multi polygon DataFrame, multiple data point - python将DataFrame转换为多多边形DataFrame,多个数据点-python
【发布时间】:2021-04-06 23:39:06
【问题描述】:

我有一个如下的 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

【问题讨论】:

    标签: python dataframe polygon geopandas


    【解决方案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()
    

    对了,(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
    

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

    【讨论】:

    • 很好,谢谢。似乎我交换了我的坐标,将编辑我的答案。
    【解决方案2】:

    试试这个,假设'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)
    

    【讨论】:

      猜你喜欢
      • 2016-12-15
      • 2022-07-22
      • 2019-07-23
      • 2020-08-20
      • 2018-08-19
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多