几何对象基础
要了解路网的存储就需要先了解线对象、点对象。
点对象
一个点对象由x坐标和y坐标构成,在python中构建一个点对象
from shapely.geometry import Point
node = Point(1.2, 2.3)
线对象
一条几何线条由一组有序的点构成,相邻点之间直线相连,构成线对象,线对象上的点分为:两端的端点和中间的折点。
两端的点1和点2是端点,中间的点1~点6是折点。
这里需要提及一个拓扑正向的概念,拓扑正向规定为:沿着点坐标序列的方向。可以想象在绘制这条线对象时,从端点1开始依次绘制折点1、折点2...直到端点2,那么从端点1到端点2的方向就是拓扑正向,端点2到端点1的方向就是拓扑反向。
from shapely.geometry import Point, LineString
p1 = Point(0, 0)
p2 = Point(1, 1)
p3 = Point(1, 2)
p4 = Point(2, 2)
# 使用点对象序列构建线对象
link1 = LineString([p1, p2, p3, p4])
# 使用坐标序列构建线对象
link2 = LineString([(0, 0), (1, 1), (1, 2), (2, 2)])
# 输出线对象的坐标序列, p1 --> p4为拓扑正向, p4 --> p1为拓扑反向
print(list(link1.coords)) # output:[(0.0, 0.0), (1.0, 1.0), (1.0, 2.0), (2.0, 2.0)]
print(list(link2.coords)) # output:[(0.0, 0.0), (1.0, 1.0), (1.0, 2.0), (2.0, 2.0)]
这里仅仅介绍一下点、线对象的基本概念,更多空间对象操作见shapely文档www.osgeo.cn/shapely/man…
路网存储格式
为了将现实世界中的道路网络抽象到计算机中存储,简单来说涉及到两张相互关联的表:Link表(线层表)和Node表(点层表):
Link表
表的每一行都是一个带属性的线对象,是对现实世界中某路段的抽象表达,该表的基本几何拓扑字段有link_id, dir, from_node, to_node, length, geometry以及自定义的属性字段。
- link_id是该路段的id,唯一索引。
- dir是用于标识该路段的方向,如果是双向通行,则值为0;如果是单行道,则值为1或者-1,若单向通行方向与线对象的拓扑方向一致,则值为1,如果单向通行方向与线对象的拓扑方向相反,则值为-1。
- from_node,to_node为该线对象的两个端点编号,from_node为拓扑正向的起始端点编号,to_node为拓扑正向的终到端点编号。
- length为改线对象的长度,geometry则存储了线对象本身,包含了线对象的所有几何信息。
- 自定义属性字段,比如我们需要一个字段来描述一个路段的通行能力,由于路段可能是是双向通行的,而一条路段的不同方向的通行能力有可能是不一样的,那么需要将两个方向的属性区分开来,假设用capacity表示,那么拓扑正向方向的通行能力用ab_capacity,那么拓反向方向的通行能力用ba_capacity来表示,ab_和ba_开头分别表示拓扑正向、拓扑反向属性,这也可以自己规定不同的字符串来区分(如_AB,_BA)。
Node表
表的每一行代表了一个端点对象,基本字段有:node_id、geometry
- node_id是该端点的id,唯一索引。
- geometry则存储了点对象本身。
例子
Link表:
| link_id | from_node | to_node | dir | length | ab_capacity | ba_capacity | geometry |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 6 | 0 | 5.1 | 700 | 700 | LineStringObj |
| 2 | 2 | 6 | -1 | 4.9 | -- | 500 | LineStringObj |
| 3 | 6 | 4 | 0 | 3.7 | 200 | 500 | LineStringObj |
| 4 | 3 | 6 | 0 | 6.1 | 200 | 100 | LineStringObj |
| 5 | 4 | 5 | 1 | 4.1 | 200 | -- | LineStringObj |
Node表:
| node_id | geometry |
|---|---|
| 1 | PointObj |
| 2 | PointObj |
| 3 | PointObj |
| 4 | PointObj |
| 5 | PointObj |
| 6 | PointObj |