路网存储格式解析

409 阅读3分钟

几何对象基础

要了解路网的存储就需要先了解线对象、点对象。

点对象

一个点对象由x坐标和y坐标构成,在python中构建一个点对象

from shapely.geometry import Point
node = Point(1.2, 2.3)

线对象

一条几何线条由一组有序的点构成,相邻点之间直线相连,构成线对象,线对象上的点分为:两端的端点和中间的折点。

线对象.jpg

两端的点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则存储了点对象本身。

例子

路网示例.png Link表:

link_idfrom_nodeto_nodedirlengthab_capacityba_capacitygeometry
11605.1700700LineStringObj
226-14.9--500LineStringObj
36403.7200500LineStringObj
43606.1200100LineStringObj
54514.1200--LineStringObj

Node表:

node_idgeometry
1PointObj
2PointObj
3PointObj
4PointObj
5PointObj
6PointObj