在SpatiaLite网站上,他们解释了如何使用.osm
数据创建一个包含单个表的SpatiaLite数据库,其中每一行都是路线图的弧形。然后,他们解释了计算their website中从A到B的最短路径的过程:
答案 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
)上执行查询。由于节点表包含表示节点的点(几何),因此最佳方法是执行空间查询以获取from
和to
节点。例如,您可以使用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