如何将 LineString 拆分为段
How to split a LineString to segments
我的数据集由一个LineString
组成,我想过滤掉这个LineString
的各个线段。更准确地说,每个街道段。
到目前为止,我已经从数据集中提取了各个点并将它们保存在单独的列表中。此外,我想再次收集这些点并从中创建单独的 LineStrings 以将它们存储到 Geodataframe 中。
数据具有以下形式:
LINESTRING (3275.284016199762 340555.8579582386, 3241.504528076811 340504.1348617533, 3245.415803206172 340501.457084205, 3280.414559049542 340552.7138220053, 3285.19053022
我的问题是我必须为每次迭代创建并显式保存一个单独的 LineString
。
谁能帮我这个?有更好的方法吗?
from shapely.geometry import Point, LineString
#Loop over LineString and gather Points
c=[]
for i in range(0,end):
c.append(Point(route1.coords[i]))
iterator=len(c)
max=len(c)-1
#Loop to store LineStrings - got stuck here
for i in np.arange(0,iterator):
if i<max:
LineString([c[i], c[i+1]]).wkt
else:
break;
输出应如下所示:
Linestring(Point A, Point B)
Linestring(Point B, Point C)
Linestring(Point C, Point D)
...
Linestring(Point Y, Point Z)
欢迎来到 SO。
您不必编写代码来拆分 LineString
。让 PostGIS 来完成这项工作 :) 下面的快速示例使用 CTE
to ST_DumpPoints
from your LineString
, and subsequently creates another line with path,path+1 using the window function lead()
:
WITH j AS (
SELECT ST_DumpPoints('LINESTRING (10 10, 12 12, 14 14, 16 16, 18 18)') AS g
)
SELECT ST_AsText(point) FROM (
SELECT ST_MakeLine((g).geom, lead((g).geom,1) OVER ()) AS point
FROM j) i
WHERE i.point IS NOT NULL
st_astext
-------------------------
LINESTRING(10 10,12 12)
LINESTRING(12 12,14 14)
LINESTRING(14 14,16 16)
LINESTRING(16 16,18 18)
(4 Zeilen)
说到 Shapely,它没有提供将曲线对象(LineString
或 LinearRing
)分割成段的功能,因此您必须自己编写。这是一个如何使用 zip
to iterate over pairs of coordinates and map
到 LineString
的例子:
from shapely.geometry import LineString, LinearRing
def segments(curve):
return list(map(LineString, zip(curve.coords[:-1], curve.coords[1:])))
line = LineString([(0, 0), (1, 1), (2, 2)])
ring = LinearRing([(0, 0), (1, 0), (1, 1), (0, 1)])
line_segments = segments(line)
for segment in line_segments:
print(segment)
# LINESTRING (0 0, 1 1)
# LINESTRING (1 1, 2 2)
ring_segments = segments(ring)
for segment in ring_segments:
print(segment)
# LINESTRING (0 0, 1 0)
# LINESTRING (1 0, 1 1)
# LINESTRING (1 1, 0 1)
# LINESTRING (0 1, 0 0)
我的数据集由一个LineString
组成,我想过滤掉这个LineString
的各个线段。更准确地说,每个街道段。
到目前为止,我已经从数据集中提取了各个点并将它们保存在单独的列表中。此外,我想再次收集这些点并从中创建单独的 LineStrings 以将它们存储到 Geodataframe 中。 数据具有以下形式:
LINESTRING (3275.284016199762 340555.8579582386, 3241.504528076811 340504.1348617533, 3245.415803206172 340501.457084205, 3280.414559049542 340552.7138220053, 3285.19053022
我的问题是我必须为每次迭代创建并显式保存一个单独的 LineString
。
谁能帮我这个?有更好的方法吗?
from shapely.geometry import Point, LineString
#Loop over LineString and gather Points
c=[]
for i in range(0,end):
c.append(Point(route1.coords[i]))
iterator=len(c)
max=len(c)-1
#Loop to store LineStrings - got stuck here
for i in np.arange(0,iterator):
if i<max:
LineString([c[i], c[i+1]]).wkt
else:
break;
输出应如下所示:
Linestring(Point A, Point B)
Linestring(Point B, Point C)
Linestring(Point C, Point D)
...
Linestring(Point Y, Point Z)
欢迎来到 SO。
您不必编写代码来拆分 LineString
。让 PostGIS 来完成这项工作 :) 下面的快速示例使用 CTE
to ST_DumpPoints
from your LineString
, and subsequently creates another line with path,path+1 using the window function lead()
:
WITH j AS (
SELECT ST_DumpPoints('LINESTRING (10 10, 12 12, 14 14, 16 16, 18 18)') AS g
)
SELECT ST_AsText(point) FROM (
SELECT ST_MakeLine((g).geom, lead((g).geom,1) OVER ()) AS point
FROM j) i
WHERE i.point IS NOT NULL
st_astext
-------------------------
LINESTRING(10 10,12 12)
LINESTRING(12 12,14 14)
LINESTRING(14 14,16 16)
LINESTRING(16 16,18 18)
(4 Zeilen)
说到 Shapely,它没有提供将曲线对象(LineString
或 LinearRing
)分割成段的功能,因此您必须自己编写。这是一个如何使用 zip
to iterate over pairs of coordinates and map
到 LineString
的例子:
from shapely.geometry import LineString, LinearRing
def segments(curve):
return list(map(LineString, zip(curve.coords[:-1], curve.coords[1:])))
line = LineString([(0, 0), (1, 1), (2, 2)])
ring = LinearRing([(0, 0), (1, 0), (1, 1), (0, 1)])
line_segments = segments(line)
for segment in line_segments:
print(segment)
# LINESTRING (0 0, 1 1)
# LINESTRING (1 1, 2 2)
ring_segments = segments(ring)
for segment in ring_segments:
print(segment)
# LINESTRING (0 0, 1 0)
# LINESTRING (1 0, 1 1)
# LINESTRING (1 1, 0 1)
# LINESTRING (0 1, 0 0)