我将解释我找到的解决方案(也许不是最好的)。
根据发布的图片,让我们假设我们在A点,然后我们将前往B点。如前所述,这不是顶点(使用osm2po工具生成的表中的源/目标)。
因此,我们需要知道步行/驾驶的方向。如果我们通过橙色路径从最近的顶点到点A(点绿色),则必须减去点A和点绿色(最近的顶点)之间的偏移量。但是,如果必须经过Calle Almirante Bonifaz街,则应在该边的长度上添加偏移量(从绿色点到Calle Almirante Bonifaz与Calle San Juan之间的交点)。
我运行以下查询以获取最短路径(您需要pgRouting扩展,在这里pgRouting-此处安装和要求安装和要求):
SELECT gid, cost, st_astext(the_geom) as the_geom FROM dijkstra_sp_delta('xx_2po_4pgr', source_vertex, target_vertex, 0.1);
这导致代表完整路线的一组边。例如,此查询的一个可能的输出可能是:
其中字段gid(在osm2po生成的表中的id)代表边缘标识符。好吧,我们必须检查起点和终点的偏移(点A / B)。
如果检查起始偏移量,则必须检查在上述查询中获得的一组边的第一条边是否与到Point A的最近路径相同。如果它们匹配,那么我们将减去偏移量。如果它们不匹配,我们将添加偏移量。为了获得到点的最近链接,我运行以下查询:
SELECT * FROM find_node_by_nearest_link_within_distance(point, 0.1, 'xx_2po_4pgr') as id;
您必须调整此功能,以便它返回最近的边。首先,您必须修改link_point类型(添加最近的链接字段):
CREATE TYPE link_point AS
(id integer,
name character varying,
nearest_link integer);
ALTER TYPE link_point
OWNER TO postgres;
您还必须修改find_node_by_nearest_link_within_distance。只需添加最后一行(我仅显示该函数的摘录):
-- Searching for a nearest link
FOR row in EXECUTE 'select id from find_nearest_link_within_distance('''||point||''', '||distance||', '''||tbl||''') as id'
LOOP
END LOOP;
IF row.id is null THEN
res.id = -1;
RETURN res;
END IF;
link:=row.id;
res.nearest_link:=link;
然后,您需要知道点(点A /点B)和最近的边(偏移)之间的距离。为此,我运行以下查询:
SELECT ST_Line_Locate_Point(geom , point)as offset;
其中geom是osm2po生成的表中的the_geom字段。
在这一点上,我们将要添加或减去的偏移量。
最后,您需要知道边长以应用在上面的查询中获得的值并调整实数(如果使用几何类型,则必须规范化以计量获得的值。只需将111000乘以在查询):
select st_length(the_geom) from (select ST_ASTEXT(the_geom) as the_geom FROM dr_2po_4pgr WHERE id= edge_identifier)t";
如果我们要检查结束偏移量,那么我们将必须检查在上述查询中获得的一组路径中的最后一条路径是否与到终点(B点)最近的路径相同,并且我们将在/减去和以前一样
打扰一下我的英语。