2021-10-10 12:32:28 +02:00
|
|
|
CREATE OR REPLACE FUNCTION layer_obs_roads(bbox geometry, zoom_level int)
|
2021-10-31 20:50:09 +01:00
|
|
|
RETURNS TABLE(
|
|
|
|
way_id bigint,
|
|
|
|
geometry geometry,
|
|
|
|
distance_overtaker_mean float,
|
|
|
|
distance_overtaker_min float,
|
|
|
|
distance_overtaker_max float,
|
|
|
|
distance_overtaker_median float,
|
|
|
|
distance_overtaker_array float[],
|
|
|
|
overtaking_event_count int,
|
|
|
|
direction int,
|
|
|
|
offset_direction int
|
|
|
|
) AS $$
|
2021-10-10 12:32:28 +02:00
|
|
|
|
|
|
|
SELECT
|
|
|
|
road.way_id::bigint as way_id,
|
|
|
|
road.geometry as geometry,
|
|
|
|
avg(distance_overtaker) as distance_overtaker_mean,
|
2021-10-31 20:50:09 +01:00
|
|
|
min(distance_overtaker) as distance_overtaker_min,
|
|
|
|
max(distance_overtaker) as distance_overtaker_max,
|
|
|
|
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY distance_overtaker) as distance_overtaker_median,
|
|
|
|
array_agg(distance_overtaker) as distance_overtaker_array,
|
|
|
|
count(overtaking_event.id)::int as distance_overtaker_count,
|
|
|
|
r.dir as direction,
|
|
|
|
case when road.directionality = 0 then r.dir else 0 end as offset_direction
|
2021-10-10 12:32:28 +02:00
|
|
|
FROM road
|
2021-10-31 20:50:09 +01:00
|
|
|
FULL OUTER JOIN (VALUES (1, TRUE), (-1, FALSE)) AS r(dir, rev) ON (road.directionality = 0 or road.directionality = r.dir)
|
|
|
|
FULL OUTER JOIN overtaking_event ON (road.way_id = overtaking_event.way_id and overtaking_event.direction_reversed = r.rev)
|
|
|
|
-- WHERE road.name = 'Schlierbergstraße'
|
2021-10-10 12:32:28 +02:00
|
|
|
WHERE road.geometry && bbox
|
2021-10-31 20:50:09 +01:00
|
|
|
GROUP BY road.way_id, road.geometry, road.directionality, direction;
|
2021-10-10 12:32:28 +02:00
|
|
|
|
|
|
|
$$ LANGUAGE SQL IMMUTABLE;
|