首页Python【Shapely矢量数据空...

【Shapely矢量数据空间分析】6.线性参考方法


本系列文章是根据Shapely官方文档翻译整理,学习任何一个Python第三方库,其官方文档都是最好的学习资料。相比网络搜索得到的一些资料,官方文档是权威的一手资料,其内容全面、准确可靠。通过官方文档入手,能够保证学习认知不会有大偏差。在学习完官方文档后,可以在寻找其他资料进一步学习。

点击“阅读原文”或者直接访问下方链接,查看翻译整理的“Shapely 2.0.0 中文文档”。

https://www.mizhushare.com/docs/shapely-2-0-0-%e4%b8%ad%e6%96%87%e6%96%87%e6%a1%a3/
本系列文章配套代码获取有以下两种途径:
  • 可以通过百度网盘获取,需要在本地配置代码运行环境:
链接:https://pan.baidu.com/s/1iWGGhB4kra9V7bUj-CWR0w?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Shapely




使用一维参照系统指定沿线性要素(如LineStringMultiLineString)得位置是很有用的。Shapely支持基于长度或距离的线性参考,计算沿几何对象到给定点的投影距离,或沿对象给定距离点的距离。
  • object.interpolate(distance[, normalized=False])

返回一个沿线性几何对象的指定距离的点。如果normalized参数为True,距离将被解释为几何对象长度的一部分。

 1>>> line = LineString([(00), (01), (11)])
2>>> line
3<LINESTRING (0 00 11 1)>
4
5>>> point1 = line.interpolate(0.75)
6>>> point1
7<POINT (0 0.75)>
8>>> list(point1.coords)
9[(0.00.75)]
10
11>>> point2 = line.interpolate(0.75 , normalized=True)
12>>> point2
13<POINT (0.5 1)>
14>>> list(point2.coords) # 1.5 / 2 = 0.75
15[(0.51.0)]

两个点在线性几何对象上的相对关系如下图所示:

  • object.project(other[, normalized=False])

返回沿该几何对象到最接近另一个对象的点的距离。如果normalized参数为True,返回对象长度的标准化距离。project()方法是interpolate()的逆运算。

1>>> line.project(point1)
20.75
3
4>>> line.project(point1, normalized=True)
50.375
6
7>>> line.project(point2, normalized=True)
80.75
  • 线性参考方法可以被用来按指定的距离分割线。

 1>>> def cut(line, distance):
2...     # 将一条线从起点处一分为二
3...     if distance <= 0.0 or distance >= line.length:
4...         return [LineString(line)]
5...     coords = list(line.coords)
6...     for i, p in enumerate(coords):
7...         pd = line.project(Point(p)) # 返回该点(组成线的点)与线段起点间的距离
8...         if pd == distance:
9...             return [
10...                 LineString(coords[:i+1]),
11...                 LineString(coords[i:])]
12...         if pd > distance:
13...             cp = line.interpolate(distance) # 沿线段指定距离的点
14...             return [
15...                 LineString(coords[:i] + [(cp.x, cp.y)]),
16...                 LineString([(cp.x, cp.y)] + coords[i:])]
17...
18
19>>> line = LineString([(00), (10), (20), (30), (40), (50)])
20>>> line
21<LINESTRING (0 01 02 03 04 05 0)>
22
23>>> [list(x.coords) for x in cut(line, 0.5)]
24[[(0.00.0), (0.50.0)], [(0.50.0), (1.00.0), (2.00.0), (3.00.0), (4.00.0), (5.00.0)]]
25
26>>> [list(x.coords) for x in cut(line, 1.0)]
27[[(0.00.0), (1.00.0)], [(1.00.0), (2.00.0), (3.00.0), (4.00.0), (5.00.0)]]
28
29>>> [list(x.coords) for x in cut(line, 2.5)]
30[[(0.00.0), (1.00.0), (2.00.0), (2.50.0)], [(2.50.0), (3.00.0), (4.00.0), (5.00.0)]]


END

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments