SQLRouter
Jump to navigation
Jump to search
The following script shows the length between two nodes based on the PostgreSQL infrastructure provided by a Mapnik installation.
#!/bin/bash
echo "select SUM(ST_length_spheroid(transform(way,4326),'SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]]')) as length from planet_osm_roads where osm_id IN (select regexp_split_to_table(x0.id||','||xn.id, ',')::int from
planet_osm_ways as x0,"
for i in `seq 1 $(($3 - 1))`; do
echo "planet_osm_ways as x$i,"
done
echo "planet_osm_ways as xn where
x0.nodes[1] = (
select osm_id from planet_osm_point where name = '$1' and (railway in ('halt', 'metro_station', 'tramstop'))
)
AND x0.nodes[array_upper(x0.nodes,1)] = x1.nodes[1] AND"
for i in `seq 1 $(($3 - 2))`; do
echo "x$i.nodes[array_upper(x$i.nodes,1)] = x"$(( $i + 1 ))".nodes[1] AND"
done
echo "x"$(($3 - 1))".nodes[array_upper(x"$(($3 - 1))".nodes,1)] = xn.nodes[1] AND"
echo "xn.nodes[array_upper(xn.nodes,1)] = (
select osm_id from planet_osm_point where name = '$2' and (railway in ('halt', 'metro_station', 'tramstop'))
));"
The script can be executed by:
sh sql-tmp "Wibautstraat" "Amstelstation" 2 | psql -U mapnikro osm
Since it is unknown how far the two nodes are from each other, the script needs to be run with an increasing number. In essence this is graph creation.
with temprouting (node
select nodes[1], nodes[array_upper(nodes,1)], 0 from planet_osm_ways where nodes[1] = (select osm_id from planet_osm_point where name = 'Amstelstation' and (railway in ('halt', 'metro_station', 'tramstop'))) union all select a.nodes[1], b.nodes[array_upper(nodes,1)], a.iteration+1 FROM temprouting
CREATE OR REPLACE FUNCTION skinkie_routing(int8, int8, boolean) RETURNS varchar AS 'DECLARE
itemid ALIAS FOR $1;
itemid2 ALIAS FOR $2;
forward ALIAS FOR $3;
itemfullname varchar(255);
itemrecord RECORD;
BEGIN
IF forward = TRUE THEN
select max(id), nodes[array_upper(nodes,1)] as nextstart INTO itemrecord from planet_osm_ways where nodes[1] = itemid AND id NOT IN (select regexp_split_to_table(itemfullname, '','')::int);
ELSE
select max(id), nodes[1] as nextstart INTO itemrecord from planet_osm_ways where nodes[array_upper(nodes,1)] = itemid AND id NOT IN (select regexp_split_to_table(itemfullname, '','')::int);
END IF;
itemfullname := itemrecord.id;
IF itemrecord.nextstart <> itemid2 THEN
RETURN itemfullname;
ELSE IF itemrecord IS NOT NULL THEN
RETURN itemfullname || '','' || skinkie_routing(itemrecord.nextstart, itemid2, TRUE);
ELSE IF forward = TRUE THEN
RETURN itemfullname || '','' || skinkie_routing(itemid, itemid2, FALSE);
ELSE
RETURN NULL;
END IF;
END IF;
END IF;
END' LANGUAGE 'plpgsql';
SELECT s.* INTO itemrecord FROM supplyitem s where si_id=itemid;
itemfullname := itemfullname + itemrecord.si_item;
IF itemrecord.si_parentid IS NOT NULL THEN
itemfullname := cp_getitemfullname(itemrecord.si_parentid) + ''->'' + itemfullname ;
RETURN itemfullname;
ELSE
RETURN itemfullname;
END IF;
END' LANGUAGE 'plpgsql'
select SUM(ST_length_spheroid(transform(way,4326),'SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]]')) as length from planet_osm_roads where osm_id IN (select regexp_split_to_table(skinkie_routing(3571269,301746256), ',')::int);