首页 > 编程问答 >在考虑表格条件后,在空间上溶解相交的线

在考虑表格条件后,在空间上溶解相交的线

时间:2024-07-21 11:47:04浏览次数:11  
标签:python geopandas shapely

在参加一些表格条件后,我需要溶解来自 a geodataframe 的所有彼此相交的线串:1)具有相同的 ID 和 2)具有相同的 opening 年份。这些数据代表道路数据库,我正在使用 geopandas 数据如下所示:

    id    opening    geometry
0   30    2020       LINESTRING (45.01679 -12.12937, 45.01681 -12...
1   101   1999       LINESTRING (37.02849 -10.65968, 37.02849 -10...
2   30    2019       LINESTRING (47.10667 -15.49339, 47.10665 -15...
3   101   1999       LINESTRING (41.64170 -12.45764, 41.64180 -12...
4   135   2020       LINESTRING (45.31902 -9.76800, 45.31907 -9.7...

我尝试了以下代码:

import geopandas as gpd
import numpy as np
import shapely

gdf_sof = gpd.read_file('your_path/your_file')

# Concatenate the conected segments
gdf = gpd.GeoDataFrame()
for id in gdf_sof.id.unique():
  print(id)
  unique_id = gdf_sof.loc[gdf_sof.id == id]
  print(unique_id.shape)
  gdf_sof_id = gpd.GeoDataFrame()
  for dt in unique_id.opening.unique():
    print(dt)
    unique_oppening = unique_id.loc[unique_id.opening == dt]
    dissolved = gpd.geoseries.GeoSeries([geom for geom in unique_oppening.unary_union.geoms])
    gdf_sof_id = pd.concat([gdf_sof_id, dissolved], ignore_index=True, axis=0)
  gdf.concat(gdf_sof_id, ignore_index=True, axis=0, inplace=True)

gdf.shape

但收到了此错误消息:

---------------------------------------------------------------------------
AttributeError: 'LineString' object has no attribute 'geoms'

我还根据@Pieter的评论尝试了以下代码,但结果并不令人满意。我使用了 linemerge shapely.get_parts

import geopandas as gpd
import numpy as np
import pandas as pd
import shapely
from shapely.ops import linemerge

gdf_sof = gpd.read_file('your_path/your_file')

# Dissolve the connected segments
gdf = gpd.GeoDataFrame()
for id in gdf_sof.id.unique():
  unique_id = gdf_sof.loc[gdf_sof.id == id]
  gdf_sof_id = gpd.GeoDataFrame()
  for dt in unique_id.opening.unique():
    unique_opening = unique_id.loc[unique_id.opening == dt]
    shp = shapely.get_parts(unique_opening.geometry)
    dissolved = linemerge(shp)
    gdf_dissolved = gpd.GeoDataFrame({'id': [id],
                                      'opening': [dt],
                                      'geometry':dissolved},
                                      geometry = 'geometry', 
                                      crs = gdf_sof.crs)
    gdf_sof_id = pd.concat([gdf_sof_id, gdf_dissolved], ignore_index=True, axis=0)
  gdf = pd.concat([gdf, gdf_sof_id], ignore_index=True, axis=0)

gdf.shape

我的起始 gdf ​​( gdf_sof ) 的形状为 (7366, 3) ,最终的 gdf 的形状为 (973, 3) 然而,最终的 gdf (973,3) 溶解了不接触的段。

All highlighted segments in the image are just one row in the attribute table. I need them separated!

上图中所有突出显示的段只是属性表中的一行。我需要他们分开!


错误是由于试图将 unary_union 属性(用于生成新的几何图形)应用于 GeoSeries 中的单个 LineString 几何图形而发生的。 unary_union 操作应该在几何图形集合上执行,而不是在单个几何图形上执行。

相反,请尝试使用 dissolve 函数来基于 id opening 列对的 GeoDataFrame 进行分组,并将聚合函数设置为 'first' 以保留其他列。然后,将 explode 应用于结果以将多部分几何图形拆分为单独的特征:

import geopandas as gpd

# 从的文件读取 GeoDataFrame
gdf_sof = gpd.read_file('your_path/your_file')

# 基于 'id' 和 'opening' 列进行溶解,并保留其他列
gdf = gdf_sof.dissolve(by=['id', 'opening'], aggfunc='first')

# 将多部分几何图形炸开成单独的特征
gdf = gdf.explode(ignore_index=True)

# 打印结果 GeoDataFrame 的形状
print(gdf.shape)

此代码将首先根据 id opening 列的组合对 GeoDataFrame 进行分组。然后,它将溶解每个组内的几何图形,有效地合并具有相同 id opening 年份的所有相交线段。 aggfunc='first' 确保将保留来自原始 GeoDataFrame 的 id opening 列。最后, explode 函数将任何多部分几何图形(由溶解操作创建)拆分为单独的特征,从而为提供所需的结果。

标签:python,geopandas,shapely
From: 77053177

相关文章

  • 基于python的非平稳时间序列模型
    前言平稳时间序列指的是宽平稳时间序列,就是指时间序列的均值、方差和协方差等一二阶矩存在但不随时间改变,表现为时间的常数。若三个条件有一个不成立,那么就称该序列为非平稳时间序列。包括确定性趋势时间序列和随机性趋势时间序列。要想把非平稳的时间序列转化为平稳的时......
  • 猫头虎 Python知识点分享:pandas--read_csv()用法详解
    ......
  • 使用 Python 绘图
    我有一个.txt文件,从中找到有序对,然后使用numpy和matplotlib绘制图形。例如,这些是我的有序对:[[(4.0,0),(0,6.0)],[(6.0,0),(0,3.0)]](每个子列表代表最终图形中的一条线)图形如下所示:但我想找到两条线之间的交点。如果有更多的线,我怎样才能找到它们......
  • 用python计算形状的距离
    我想计算该图像的最小垂直距离和最大水平距离。就像线条一样。我正在尝试:_,binary_image=cv2.threshold(image,0,255,cv2.THRESH_BINARY)horizontal_distances=np.sum(binary_image==255,axis=1)max_horizontal_distance=np.max(horizontal_distance......
  • 在感知器学习模型的 Python 实现中将数组传递给 numpy.dot()
    我正在尝试将单层感知器分类器的Python实现放在一起。我发现SebastianRaschka的《Python机器学习》一书中的示例非常有用,但我对他的实现的一小部分有疑问。这是代码:importnumpyasnpclassPerceptron(object):"""Perceptronclassifier.Parameters......
  • 带时间戳的 Python 命令行历史记录
    有没有办法记录每个命令的时间?例如,挂钩交互式shell,以便它将相同的内容写入~/.python_history到~/.python_history_timestamps但带有时间戳?我正在跟踪我白天所做的事情并将其放入我的日历中。为了帮助回溯,我使用了firefox历史记录、Dropbox活动、一个......
  • 在 python3 中迭代字典键时无法删除它:“RuntimeError:字典在迭代期间更改了大小”
    我试图在迭代字典时从字典中删除一个键。从字典中删除键时,我得到:RuntimeError:dictionarychangedsizeduringiteration我的代码:mydict={'one':1,'two':2,'three':3,'four':4}fork,vinmydict.items():ifk=='two'......
  • Python pyTelegramBotAPI:设置不受循环影响的变量
    我想创建一个基本上是布尔值的变量(无论机器人是否工作)。但是,当使用TeleBot.polling()时,脚本开始无限循环,所以如果我在代码开头设置一个变量就像:is_bot_working=True,变量将始终为真,反之亦然。那么,我应该如何设置一个不受循环影响的变量?这就是代码:impor......
  • 编解码器无法解码位置 2-3 中的字节:截断的 \UXXXXXXXX 转义 (Python QREADER)
    我正在尝试pythonqreader模块,但每次我尝试运行它时,我都会收到SyntaxError:(unicodeerror)'unicodeescape'codeccan'tDecodebytesinposition2-3:truncated\UXXXXXXXXescapeerror.fromqreaderimportQReaderfromcv2importQRCodeDetector,imreadfrompyz......
  • Python 工程师对 3D 高斯溅射的介绍(第 1 部分)
    从Python工程师的角度理解和编写GaussianSplatting欢迎来到雲闪世界。2023年初,来自法国蔚蓝海岸大学和马克斯普朗克信息研究所的作者发表了一篇题为“用于实时场渲染的3D高斯溅射”的论文。¹该论文展示了实时神经渲染的重大进步,超越了NeRF等先前方法的实用性。²......