如何在Shapely中获取LineString的端点。

问题描述 投票:0回答:1
Linestring1 = LINESTRING (51.2176008 4.4177154, 51.21758 4.4178548, **51.2175729 4.4179023**, *51.21745162000732 4.41871738126533*)
Linestring2 = LINESTRING (*51.21745162000732 4.41871738126533*, **51.2174025 4.4190475**, 51.217338 4.4194807, 51.2172511 4.4200562, 51.2172411 4.4201077, 51.2172246 4.4201654, 51.2172067 4.420205, 51.2171806 4.4202355, 51.2171074 4.4202929, 51.2170063 4.4203409, 51.2169564 4.4203641, 51.2168076 4.4204243, 51.2166588 4.4204833, 51.2159018 4.420431, 51.2154117 4.4203843)

考虑到这两个linetrings是从一个更大的linetring中切出来的,如何获得LineString的端点?

- 删除Point(51.21745162000732 4.41871738126533)

- 新的线串1的最后一个元素=" 51.2175729 4.4179023"。

- 新的第一个元素行串2=" 51.2174025 4.4190475"。

简而言之,我想得到第一部分(linetring1)的新的最后一个值和第二部分(linetring2)的新的第一个值,但没有剪切它们的点。我如何才能使之工作?

python shapely
1个回答
-1
投票

用两个例程解决,可以将一个Linestring进行如下分割。

  1. 函数:split_firstreturns第一个点,以及不含第一个点的LineString。

  2. 函数: split_lastreturn 最后一个点,以及从第一个点开始的不包括最后一个点的LineString。

编码

from shapely.ops import nearest_points
from shapely.geometry import Point
from shapely.geometry import LineString

def split_first(linestring):
  " returns first point and linestring without first point "
  coords = list(linestring.coords)

  p, *x = coords
  return Point(p), LineString(x)

def split_last(linestring):
  " returns first point and linestring without first point "

  *x, p = list(linestring.coords) = list(linestring.coords)

  return Point(p), LineString(x)

测试

数据

linestring = LineString([(51.2176008,4.4177154), (51.21758,4.4178548), (51.2175729,4.4179023), (51.21745162000732,4.41871738126533)])

第一个点,以及不包括第一个点在内的线型字符串

p, l = split_first(linestring)
print(p)
print(l)

POINT (51.2176008 4.4177154)
LINESTRING (51.21758 4.4178548, 51.2175729 4.4179023, 51.21745162000732 4.41871738126533)

第一个最后一个点,以及不包括最后一个点在内的线型字符串

p, l = split_last(linestring)
print(p)
print(l)

POINT (51.21745162000732 4.41871738126533)
LINESTRING (51.2176008 4.4177154, 51.21758 4.4178548, 51.2175729 4.4179023)

1
投票

要获得一个终端的 LineString,你只需要访问它的 boundary 属性。

from shapely.geometry import LineString

line = LineString([(0, 0), (1, 1), (2, 2)])
endpoints = line.boundary
print(endpoints)
# MULTIPOINT (0 0, 2 2)
first, last = line.boundary
print(first, last)
# POINT (0 0) POINT (2 2)

或者,你也可以从 "A "和 "B "中获取第一和最后的点数。coords 的坐标序列。

from shapely.geometry import Point
first = Point(line.coords[0])
last = Point(line.coords[-1])
print(first, last)
# POINT (0 0) POINT (2 2)

在你的具体案例中,你想删除第一条线的最后一点 和第二条线的第一点,然后才得到端点,你应该构建新的... LineString 的对象,首先使用相同的 coords 财产。

from shapely.wkt import loads

first_line = loads("LINESTRING (51.2176008 4.4177154, 51.21758 4.4178548, 51.2175729 4.4179023, 51.21745162000732 4.41871738126533)")
second_line = loads("LINESTRING (51.21745162000732 4.41871738126533, 51.2174025 4.4190475, 51.217338 4.4194807, 51.2172511 4.4200562, 51.2172411 4.4201077, 51.2172246 4.4201654, 51.2172067 4.420205, 51.2171806 4.4202355, 51.2171074 4.4202929, 51.2170063 4.4203409, 51.2169564 4.4203641, 51.2168076 4.4204243, 51.2166588 4.4204833, 51.2159018 4.420431, 51.2154117 4.4203843)")
first_line = LineString(first_line.coords[:-1])
second_line = LineString(second_line.coords[1:])
print(first_line.boundary[1], second_line.boundary[0])
# POINT (51.2175729 4.4179023) POINT (51.2174025 4.4190475)
© www.soinside.com 2019 - 2024. All rights reserved.