0

使用 python、sqlalchemy 和 psycopg2 驱动程序,我试图从一个 shapefile 到一个地理数据框,再到一个在这个问题之后安装了 postgis 的 postgres 数据库

我将几何图形转换为 WKB 十六进制字符串,并df.to_sql()成功使用导入的标准数据框。

运行alter table查询时出现错误:

sqlalchemy.exc.DataError: (psycopg2.errors.InvalidParameterValue) Geometry type (MultiPolygon) does not match column type (Polygon)
4

3 回答 3

3

重写了@Hugh_Kelley 的函数以更快。

def _explode(indf):
    count_mp = 0
    outdf = gpd.GeoDataFrame(columns=indf.columns)
    outdf = indf[indf.geometry.type == 'Polygon']
    indf = indf[indf.geometry.type != 'Polygon']
    for idx, row in indf.iterrows():
        if type(row.geometry) == MultiPolygon:
            count_mp = count_mp + 1
            multdf = gpd.GeoDataFrame(columns=indf.columns)
            recs = len(row.geometry)
            multdf = multdf.append([row]*recs,ignore_index=True)
            for geom in range(recs):
                multdf.loc[geom,'geometry'] = row.geometry[geom]
            outdf = outdf.append(multdf,ignore_index=True)
        else:
            print(row)
    print("There were ", count_mp, "Multipolygons found and exploded")
    return outdf
于 2020-11-18T16:18:30.440 回答
1

这是因为 shapefile 将为生成的地理数据框的给定行指示几何类型,该几何类型可以是多边形或多多边形。

转换为 Well-Known-Binary 十六进制字符串时包含此信息,并在将文本转换为几何图形时产生类型问题。

mhweber 的要点中的爆炸功能将通过将多面体分解为其组件部分来解决此问题。

import geopandas as gpd
from shapely.geometry.polygon import Polygon
from shapely.geometry.multipolygon import MultiPolygon

def explode(indata):
    count_mp = 0
    indf = gpd.GeoDataFrame.from_file(indata)
    outdf = gpd.GeoDataFrame(columns=indf.columns)
    for idx, row in indf.iterrows():
        if type(row.geometry) == Polygon:
            outdf = outdf.append(row,ignore_index=True)
        if type(row.geometry) == MultiPolygon:
            count_mp = count_mp + 1
            multdf = gpd.GeoDataFrame(columns=indf.columns)
            recs = len(row.geometry)
            multdf = multdf.append([row]*recs,ignore_index=True)
            for geom in range(recs):
                multdf.loc[geom,'geometry'] = row.geometry[geom]
            outdf = outdf.append(multdf,ignore_index=True)
    print("There were ", count_mp, "Multipolygons found and exploded")
    return outdf

我添加了一个副作用来打印找到的多面体的数量。

奇怪的是,您应该调查这些以确保爆炸功能不会破坏您需要的关系。

于 2019-07-18T11:33:03.140 回答
1

对于仍然回到这篇文章的人:explode 方法(在相当长的时间内)是 GeoPandas api 的一部分:

gpd.GeoDataFrame.explode()
于 2021-05-03T13:51:59.243 回答