[OSM-dev-fr] Postgis: selectionner les ways qui ne sont pas dans une relation
Vincent de Chateau-Thierry
vdct at laposte.net
Lun 5 Mar 21:45:54 GMT 2012
Le 05/03/2012 22:25, Gilles Bassière a écrit :
> Le lundi 05 mars 2012 à 21:59 +0100, yvecai a écrit :
>> Alors il me semble que j'arrive à trouver les way qui appartiennent à
>> des relations:
>> pistes-mapnik=# SELECT
>> count(b.osm_id)
>> FROM
>> planet_osm_rels,
>> planet_osm_line AS b
>> WHERE
>> b.osm_id = ANY(planet_osm_rels.parts)
>> AND b."piste:type" IS NOT NULL
>> AND b.osm_id>0;
>> count
>> -------
>> 11098
>> (1 row)
>> Mais pas l'inverse:
>> pistes-mapnik=# SELECT
>> count(b.osm_id)
>> FROM
>> planet_osm_rels,
>> planet_osm_line AS b
>> WHERE
>> b.osm_id = ANY(planet_osm_rels.parts)
>> AND b."piste:type" IS NOT NULL
>> AND b.osm_id>0;
>> count
>> ----------
>> 75773488
>> (1 row)
>> C'est un peu beaucoup puisque je n'ai que 51'026 ways ... ??
>>
>
> Tu dois pouvoir arriver à tes fins avec exists() :
>
> SELECT count(*)
> FROM planet_osm_line AS l
> WHERE
> NOT EXISTS (
> SELECT *
> FROM planet_osm_rels AS r
> WHERE l.osm_id = ANY(r.parts)
> )
> AND l."piste:type" IS NOT NULL
> AND l.osm_id> 0;
>
> Dans le cas particulier des tableaux, il y a peut-être plus direct mais
> je n'ai pas l'habitude de manipuler ces types de données.
>
Une autre possibilité (pas testée) : compter les ways complémentaires de
l'ensemble des ways inclus dans une relation. Ça revient à compter tous
les ways, et à soustraire les ways que tu as identifié dans ta première
requête. La différence entre les 2 ensembles se fait avec "except" :
SELECT count(*)
FROM
( SELECT osm_id
FROM planet_osm_line
EXCEPT
SELECT b.osm_id
FROM planet_osm_rels,
planet_osm_line AS b
WHERE b.osm_id = ANY(planet_osm_rels.parts) AND
b."piste:type" IS NOT NULL AND
b.osm_id>0
) ways_diff;
vincent
Plus d'informations sur la liste de diffusion dev-fr