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

时间:2016-03-26 06:30:19

标签: sqlite shortest-path spatialite

在SpatiaLite网站上,他们解释了如何使用.osm数据创建一个包含单个表的SpatiaLite数据库,其中每一行都是路线图的弧形。然后,他们解释了计算their website中从A到B的最短路径的过程:

  1. 使用他们提供的工具从VirtualNetwork文件创建.osm
  2. 执行以下查询:select * from VirtualNetwork where NodeFrom=267209305 and NoteTo=267209702以获取最短路径
  3. 您应该从上面的查询中获得结果。它代表最短路径上的每个弧。
  4. 1

    问题:

    1. 如何从最短路径上的每个 NodeID 获取纬度/经度。否则,我将无法解释 NodeID 的含义。

    2. 如何从NodeFromNodeTo纬度/经度获取 NodeIDs 。否则,我将无法首先执行最短路径查询。

1 个答案:

答案 0 :(得分:1)

按照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

要查找路径中节点的点(纬度/经度),您可以查询tuscany_nodes表,使用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
...

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

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

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

你会得到类似的东西,可以用来提取路线上点的纬度/经度:

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,
 ... )

问题2

要获取给定纬度/经度的node_id,您需要在节点表(示例上为tuscany_nodes)上执行查询。由于节点表包含表示节点的点(几何),因此最佳方法是执行空间查询以获取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