繁体   English   中英

将 pd dataframe 转换为 geopandas dataframe 与同一列中的多边形和多边形

[英]convert pd dataframe to geopandas dataframe with polygon and multipolygons in the same column

我有一个带有“几何”列的 dataframe,具有多多边形或具有这种结构的多边形:

"{""coordinates"": [[[[7.550173037853544, 53.67503770572817], [7.547448703728663, 53.67578543283669], [7.546742188094777, 53.674936990272656], [7.544119530708709, 53.67559257263587], [7.539340754839757, 53.67377737266573]]]], ""type"": ""多边形""}"

"{""coordinates"": [[[[7.550173037853544, 53.67503770572817], [7.547448703728663, 53.67578543283669], [7.546742188094777, 53.674936990272656], [7.544119530708709, 53.67559257263587], [7.539340754839757, 53.67377737266573]]]], ""type"": ""多多边形""}"

(这些只是条目的一部分,它们会太长而无法发布)。

我试图将整个 DataFrame 转换为地理数据框,但我很挣扎。

我所做的是删除列中的所有字符串,只留下坐标。 然后我用这个 function 将列转换为多边形:

def polygons_from_custom_xy_string(df_column):
    
    def chunks(lst, n):
        for i in range(0, len(lst), n):
            yield lst[i:i + n]
    
    def xy_list_from_string(s):
        # 'x y x y ...' -> [[x, y], [x, y], ...]
        return list(chunks([float(i) for i in s.split()], 2))
    
    def poly(s):
        """ returns shapely polygon from point list"""
        ps = xy_list_from_string(s)
        return Polygon([[p[0], p[1]] for p in ps])

    polygons = [poly(r) for r in df_column]


gemeinde['geometry'] = polygons_from_custom_xy_string(gemeinde['geometry'])
gemeinde = gpd.GeoDataFrame(gemeinde, geometry='geometry')

我可以像这样 plot ,但是我所有的 MultiPolygons 都坏了。 有没有更简单的方法可以将所有形状转换为相应的形状?

我也试过这个,但它不起作用:

gemeinde['geometry'] = gemeinde['geometry'].apply(wkt.loads)

出现错误:WKTReadingError: 由于读取输入时出错,无法创建几何图形。 我的文件坏了吗? 在所有其他线程中,我看到 ""type"": ""MultiPolygon"" 部分位于单元格的开头,而不是单元格的结尾。

非常感谢任何帮助,我在这里有点迷失了。

我的数据是 geojson 文件,而不是 wkt。 我可以使用以下方法将我的数据转换为地理数据框:

gemeinde['geometry'] = gemeinde['geometry'].apply(lambda x: geojson.loads(x))
gemeinde = gpd.GeoDataFrame(gemeinde, geometry='geometry')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM