我有一个 geopandas 数据框,其中包含一系列匀称的 POINT 几何图形。还有另一列带有 ID 列表,用于指定每个点所属的唯一多边形。简化的输入代码是:
import pandas as pd
from shapely.geometry import Point, LineString, Polygon
from geopandas import GeoDataFrame
data = [[1,10,10],[1,15,20],[1,20,10],[2,30,30],[2,35,40],[2,40,30]]
df_poly = pd.DataFrame(data, columns = ['poly_ID','lon', 'lat'])
geometry = [Point(xy) for xy in zip(df_poly.lon, df_poly.lat)]
geodf_poly = GeoDataFrame(df_poly, geometry=geometry)
geodf_poly.head()
Run Code Online (Sandbox Code Playgroud)
我想对 poly_ID 进行分组,以便将几何图形从 POINT 转换为 POLYGON。此输出基本上如下所示:
poly_ID geometry
1 POLYGON ((10 10, 15 20, 20 10))
2 POLYGON ((30 30, 35 40, 40 30))
Run Code Online (Sandbox Code Playgroud)
我想这很简单,但我无法让它工作。我发现以下代码允许我将其转换为开放式多段线,但无法弄清楚多边形。谁能建议如何适应这个?
geodf_poly = geodf_poly.groupby(['poly_ID'])['geometry'].apply(lambda x: LineString(x.tolist()))
Run Code Online (Sandbox Code Playgroud)
简单地用 Polygon 替换 LineString 导致 TypeError: …
我试图在 Shapely 中找到线串的长度(以米为单位),但似乎无法达到预期的结果。几乎可以肯定我在坐标系方面犯了一些错误,但我一直无法弄清楚。
这是单行的一些简化代码:
from shapely.geometry import LineString
line = LineString([(12875996.563923, -3940011.116702), (12872802.929335, -3937989.118438)])
line.crs = 'EPSG:3857'
line.length
Run Code Online (Sandbox Code Playgroud)
输出为3779.92m。不过根据我的测量,应该是~3159m。
这是基于检查以下地点的点(两个环岛的中心)的位置,然后在 Google 地球中测量它们之间的位置。
第 1 点:
http://epsg.io/map#srs=3857&x=12875996.563923&y=-3940011.116702&z=14&layer=streets
第 2 点:
http: //epsg.io/map#srs=3857&x=12872802.929468&y=-3937989.1185 38&z =17&层=街道
我有两个地理数据框:一个包含许多线串,另一个包含许多多边形。这些直线和多边形彼此相交。我试图实现的输出是一个新的地理数据框,其中包含已在与多边形相交的任何位置处分割的链接。
简化测试代码如下:
import geopandas
from shapely.geometry import Polygon, LineString
#Create geodataframe containing 2 links:
linkID = ['1','2']
link_geom = [LineString([(0, 0), (10, 10)]),LineString([(10, 10), (20, 10)])]
a = {'linkID':linkID,'geometry':link_geom}
gdf_links = geopandas.GeoDataFrame(a)
#Create geodataframe containing 2 polygons:
polyID = ['100','200']
poly_geom = [Polygon([(2, 1), (2, 3), (4, 3), (4, 1)]),Polygon([(15, 7), (15, 13), (18, 13), (18, 7)])]
b = {'polyID':polyID,'geometry':poly_geom}
gdf_poly = geopandas.GeoDataFrame(b)
Run Code Online (Sandbox Code Playgroud)
通过运行以下代码,您可以看到线条与多边形相交:
links = gdf_links.unary_union
polys = gdf_poly.unary_union
geopandas.GeoSeries([links,polys]).plot(cmap='tab10')
Run Code Online (Sandbox Code Playgroud)
生成下图(以红色/绿色添加注释以显示涉及的各种元素):
将两条线在与 polgyon 相交的任意位置分割将得到 6 条线段(如上图中绿色标记)。
理想情况下,我想要实现的输出如下所示,其中“poly_intersect”列列出了发生分割的多边形的 ID。请注意,第 2 …