如何从 NodeID 获取 long/lat 信息,反之亦然

How to get the long/lat information from a NodeID and vice versa

在 SpatiaLite 网站上,他们解释了如何使用 .osm 数据创建一个 SpatiaLite 数据库,其中包含一个 table,其中每一行都是道路图的弧线。然后,他们在their website:

中解释了计算从A到B的最短路径的过程
  1. 使用他们提供的工具从 .osm 文件创建 VirtualNetwork
  2. 执行以下查询:select * from VirtualNetwork where NodeFrom=267209305 and NoteTo=267209702得到最短路径
  3. 低于您应该从上面的查询中获得的结果。它代表最短路径上的每一条弧线。

问题:

  1. 如何从最短路径上的每个 NodeID 获取 Latitude/Longitude。否则,我将无法解释那些 NodeIDs 的意思。

  2. 如何从NodeFromLatitude/LongitudeNodeTo。否则,我将无法在第一时间执行最短路径查询。

按照您所说的https://www.gaia-gis.it/gaia-sins/spatialite-cookbook/html/dijkstra.html的例子,我们可以找到执行此查询的两个节点(154348和130324)之间的路由:

select *
from tuscany_net
where nodefrom = 154348
and nodeto = 130324

问题 1

要找到路径中节点的点(latitude/longitudes),可以查询tuscany_nodes table 过滤它 tuscany_net 的结果如下:

select node_id, st_y(geometry) latitude, st_x(geometry) longitude
from tuscany_nodes
where node_id in (
    select nodeto
    from tuscany_net
    where nodefrom = 154348
    and nodeto = 130324
)

你会得到这样的结果集:

node_id    latitude     longitude
130324    43.843969    10.981256
130337    43.843960    10.981382
130352    43.844300    10.981580
130414    43.845558    10.982525
130420    43.845541    10.982572
...

或者,如文档所述,此结果集的第一行总结了整个路径,并包含表示路线的相应几何图形,可用于绘制它或查找路线中的所有点.

如果想看WKT representation的路线可以查询:

select st_astext(Geometry)
from tuscany_net
where nodefrom = 154348
and nodeto = 130324 limit 1

你会得到这样的东西,可以用来提取路线上的 [​​=47=] 个点:

LINESTRING(11.138376 42.739078, 11.137961 42.738531,
 11.13765 42.738001, 11.137428 42.737463, 11.136459 42.734198,
 11.136129 42.733111, 11.135814 42.732221, 11.135666 42.732069,
 11.135485 42.731948, 11.135242 42.731884, 11.134913 42.731891,
 ... )

问题二

要获得给定 latitude/longitude 的 node_id,您需要对节点 table(示例中的 tuscany_nodes)执行查询。由于节点 table 包含表示节点的点(几何),因此最好的方法是执行空间查询以获取 fromto 节点。例如,您可以使用 st_distance 函数来获取比您的目标点 (here you can find the SQL functions reference list for SpatiaLite 4.2.0) 的给定距离更近的节点:

select node_id
from tuscany_nodes
where st_distance(Geometry, makepoint(9.69561, 44.44792), 1) < 10