首页 > 编程问答 >如何填充用 geopandas 溶解地理数据框时创建的多多边形中的孔?

如何填充用 geopandas 溶解地理数据框时创建的多多边形中的孔?

时间:2024-07-21 01:19:54浏览次数:12  
标签:python polygon geopandas folium shapely

我的目标是绘制 MSOA(英国的连续地理单位)集群的边界,为此我从 此处 下载了 MSOA 边界的 shapefile。然后,我添加一列簇标签并使用 geopandas 进行溶解。

df.dissolve(by='label', aggfunc='sum')

当我使用 Folium 绘制时,有多个内孔,如附图所示。我该如何删除这些?

#creates map
m = folium.Map([54.5,-3],zoom_start=6.8,tiles='cartodbpositron')

#makes boundaries plot
Boundaries = folium.GeoJson(
    df,
    name='Boundaries',
    style_function = lambda x: {
        'color': 'black',
        'weight': 3,
        'fillOpacity': 0
    }).add_to(m)
m

Visualisation Created


当使用 geopandas.dissolve 聚合相邻的多边形时,会在生成的多边形中出现孔,这是因为数据或地理处理操作中的不规则之处。出现这种情况的原因可能有以下几种:

  • 原始 MSOA 多边形中的拓扑错误: 原始 shapefile 中可能存在微小的间隙或重叠,在溶解操作后会变得更加明显。
  • 属性值差异: 即使在视觉上看起来是连续的,如果用于溶解的列 ( 'label' 在的例子中) 在本应合并的多边形中存在细微差异,也可能会导致孔洞。

以下是如何填充这些孔洞并将多边形创建为单一实体的方法:

1. 使用 shapely 简化几何形状:

  • geopandas 建立在 shapely 库之上,该库提供了用于操作几何对象的函数。 simplify() 函数可以帮助平滑多边形并消除小孔,而不会显著改变整体形状。

```python import geopandas as gpd

# 假设 df 是的 geopandas 地理数据框

# 在溶解之前,简化几何图形 df.geometry = df.geometry.simplify(tolerance=0.001)

# 现在执行溶解操作 df_dissolved = df.dissolve(by='label', aggfunc='sum') ```

  • 通过试验 tolerance 参数找到适合数据的最佳值。值越高,简化程度越高,这可能会导致丢失一些细节。

2. 使用 unary_union 创建单一多边形:

  • 溶解后,可以使用 shapely.ops.unary_union 强制将所有几何图形组合成一个单一的多边形。这将消除任何剩余的内部边界。

```python from shapely.ops import unary_union

# ...(溶解代码如上)...

# 创建一个单一的多边形 df_dissolved['geometry'] = unary_union(df_dissolved.geometry)

# 如果希望数据框中的每个集群/标签都有一个多边形: df_dissolved = gpd.GeoDataFrame(geometry=[unary_union(df_dissolved.geometry)]) ```

3. 检查和修复原始数据的拓扑错误:

  • 对于更持久和准确的解决方案,请考虑在溶解之前使用 geopandas 或其他 GIS 工具(如 QGIS)检查和修复原始 MSOA shapefile 中的任何拓扑错误。

以下是一些在 geopandas 中执行此操作的方法:

  • 识别并处理无效几何图形:

    python df = df[df.geometry.is_valid]

  • 使用 buffer(0) 解决微小的重叠/间隙:

    python df.geometry = df.geometry.buffer(0)

在应用这些方法后,的溶解地理数据框应该不再具有孔洞,并且可以使用 Folium 正确显示。请记住,最佳方法可能取决于的特定数据集和孔洞的原因。

标签:python,polygon,geopandas,folium,shapely
From: 63317410

相关文章

  • 将 python 脚本的 stdin 重定向到 fifo 会导致 RuntimeError: input():lost sys.stdin
    我有这个python脚本,它的作用是充当服务器,它从重定向到fifo的stdin读取命令:test.py:whileTrue:try:line=input()exceptEOFError:breakprint(f'Received:{line}')在bash中运行命令:mkfifotestfifotest.py<testfifo......
  • Python/Flask mysql 游标:为什么它不起作用?
    fromflaskimportFlaskfromflask_mysqldbimportMySQLapp=Flask(__name__)app.config['MYSQL_HOST']='localhost'app.config['MYSQL_USER']='root'app.config['MYSQL_PASSWORD']='password'a......
  • Python pandas to_csv 导致 OSError: [Errno 22] 参数无效
    我的代码如下:importpandasaspdimportnumpyasnpdf=pd.read_csv("path/to/my/infile.csv")df=df.sort_values(['distance','time'])df.to_csv("path/to/my/outfile.csv")此代码成功从infile.csv(一个3GBcsv文件)读取数据,对其进行排......
  • 从 python 中的字符串列表中提取 def 定义函数的标签
    我想使用Python中的正常def过程创建函数,并将标签分配给从字符串列表中提取的命名空间。如何实现这一点?这个问题的动机:我正在创建一个与sympy兼容的python函数库,供数学家用于符号计算实验。许多函数需要初始化具有相关标签的多个对象的系统,这些标签分别由用户提供的字......
  • 在 Raspberry Pi 4 上使用 Python 从具有 SPI 连接的 MT6816 磁性编码器读取
    我对这个领域完全陌生,并不真正知道自己在做什么并且需要帮助。我正在尝试使用MT681614位磁性编码器通过RaspberryPi的SPI连接读取绝对角度。我有以下问题:在硬件方面,是否只是简单地连接必要的连接(3.3V、MOSI、MISO、SCK、GND、CE01)?对于编码......
  • PythonW 不运行脚本。严重地
    因此,使用Windows10和Python3.6。我创建了一个.py脚本,它可以使用命令pythonmyscript.py在命令提示符下正常运行,但是当我制作该脚本的精确副本并为其赋予扩展名.pyw,并尝试使用pythonw运行它时命令pythonwmyscript.pyw,什么也没有发生......
  • 如何使用Python和Selenium模拟产品购买以获取库存信息
    我正在开发一项网络抓取服务,主要针对时尚行业。我的目标是提供有关产品的全面数据,包括库存水平。为了实现这一目标,我需要模拟购买以确定每种尺寸的产品的最大可用数量。我一直在使用Python和Selenium进行网络抓取部分,但在准确模拟购买方面面临着挑战检索股票信息的过程。......
  • 连接Python套接字的问题
    当我写“关闭”时,我试图让我的电报机器人关闭计算机。我不想将机器人连接到网站上的托管。我选择我的手机(AndroidRedmiNote10)作为托管。我在上面安装了Termux和Pydroid。我写了两个文件:main到我的电脑,client到我的手机。通过在计算机上运行这两个文件,一切正常。但是,当我在......
  • 如何修复导入 Numexpr Python 时的错误
    在Windows10Python3.7.9(IDLE)上,我成功安装了“pipinstallnumexpr”,但在“importnumexprasne”时出现错误:Traceback(最近一次调用):文件“<pyshell#21>”,第267行,位于将numexpr导入为ne文件“C:\Python379\lib\site-packages\numexpr_init_.py”......
  • 让 cpython 优化恒定条件
    我正在用Python编写需要尽可能高效运行的代码,但有时我需要深入挖掘调试语句。不要注释这些输入或输出(或者使用外部预处理器来处理代码,就像这里建议的那样Python相当于#ifdefDEBUG或这里如何在python中实现“#ifdef”?|||)我想在模块的开头定义一个变量......