[OSM-dev-fr] requete pour trouver un way qui intersecte plusieurs communes
didier2020
didier2020 at free.fr
Ven 22 Mai 10:04:14 UTC 2015
-l'analyse n'est pas du tout internationale, plutot "pointue" mais avec
peu de faux positif (pour ce que j'ai corrigé jusqu'a maintenant)
- il vaux mieux prendre des way qui sont longs, je pense que pour les
plus petits, d'autres analyses serait plus pertinente ou aurait le meme
effet de correction
(point adresse eloigné du way, associated street sans tag complémentaire
"xx:left ou xx:right dont le way est sur plusieurs commune,
analyse/verification de bano ou autre ?)
select
t.id,
-- a adapter a osmose
ST_AsText(ST_Centroid(t.linestring))
FROM
(
SELECT
highway.id,
highway.linestring,
ST_ClosestPoint(highway.linestring,
ST_Intersection(admin.linestring,highway.linestring)) AS intersection
FROM
relations
JOIN relation_members ON
relation_members.relation_id = relations.id AND
relation_members.member_type = 'W'
JOIN ways AS admin ON
admin.id = relation_members.member_id AND
ST_NPoints(admin.linestring) > 1
JOIN ways AS highway ON
-- way qui sont > a 2km et
-- qui ont le debut du name qui commence par "RUE" et certain type
de highway
-- OU qui ont un code fantoir (avec ou sans name)
highway.tags?'highway' AND
(
(
highway.tags->'highway' IN
('primary','secondary','primary_link','secondary_link','tertiary','tertiary_link', 'residential', 'unclassified', 'service', 'road') and
highway.tags?'name' AND
upper(left(highway.tags->'name',3))='RUE'
)
or highway.tags ? 'ref:FR:FANTOIR'
) and
ST_Length(highway.linestring, false) > 2000 AND
ST_NPoints(highway.linestring) > 1 AND
-- avec une intersection
ST_Intersects(admin.linestring, highway.linestring)
WHERE
relations.tags?'type' AND
relations.tags->'type' = 'boundary' AND
relations.tags?'boundary' AND
relations.tags->'boundary' = 'administrative' AND
relations.tags?'admin_level' AND
relations.tags->'admin_level' = '8' AND
relations.tags?'ref:INSEE'
) AS t
WHERE
-- la taille de l'intersection par rapport a la longueur de la voie
est significative
ST_Line_Locate_Point(linestring, intersection) > 0.1 AND
ST_Line_Locate_Point(linestring, intersection) < 0.9
group by 1,2
;
Plus d'informations sur la liste de diffusion dev-fr