簡體   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