Tilemill : possibilité de créer une requête avec une fonctio

Bonjour,
J’avance dans la création de requête de (un peu) plus en plus longues dans Tilemill. Mais je bloque sur ce point.
Est-il possible (surement) de créer une table avec uniquement (ou une colonne de table avec un true/false) les polygones contenus dans un polygone défini (et éventuellement présent dans la base de données utilisée) ?
Du genre :

(SELECT name, ref, admin_level, way, way_area
FROM planet_osm_polygon

WHERE (c’est ici, l’élément est contenu dans le polygone ayant l’osm_id n°…, ou les tags …)

ORDER BY way_area DESC)as toto

Merci,
JB.

Bonjour,
C’est là que ca devient sympa :slight_smile:

http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/spatial_relationships.html
http://www.postgis.fr/chrome/site/docs/workshop-foss4g/doc/joins.html

Bruno

Sinon de mon côté j’explore les déformations de géométries à des fins purement esthétiques

(SELECT p1.name, p1.ref, p1.admin_level, p1.way, p1.way_area
FROM planet_osm_polygon p1, planet_osm_polygon p2
WHERE ST_Contains(p2.way, p1.way) and p1.way && !bbox! and p2.way && !bbox!
AND p2.osm_id = mon_id_qui_va_bien

ORDER BY way_area DESC)as toto


C’est pour quoi faire au juste ?

Merci, avec ça, j’ai de quoi essayer… Je vais regarder ça ce soir ou ce week-end.
Christian, c’est pour délimiter une carte à une région géographique. J’avais aussi essayé de limiter les données à la surface en filtrant en amont avec osmconvert, mais je ne sais pas pourquoi il me perdait certains éléments (multipolygones à l’intérieur avec une surface en commun, mais pas tous) malgré l’option de garder ce qui dépasse.
JB

Tu peux même “couper” les géométries pour que rien ne soit rendu au dehors parce que là ce n’est pas le cas.

Il suffit pour ça de remplacer ST_Contains par ST_Intersection

Bonjour

Pour compléter il y a la solution des outils de composition de tilemill, sans SQL : on utilise un polygone comme masque de rendu, cette couche sera composé avec le rendu en cours via des effets complexes.
https://www.mapbox.com/tilemill/docs/guides/comp-op/
http://support.mapbox.com/discussions/tilemill/3213-overlay-a-mask-over-multiple-layers-except-for-a-specific-region

Le gros avantage : on contrôle plus finement le rendu final : le masque peut être agrandi (avec un line-width assez grand) et flouté.
L’inconvénient : tilemil utilise toutes les géométries pour le rendu, postgis ne filtre rien. Donc c’est plus lourd en calcul, mais dans ce cas il ne s’agit pas de rendre la terre entière.

Il y a aussi une solution de masque simple à base de d’openlayers/leaflet pour les cartes en ligne mais je ne retrouve pas

A+
Bruno

Comme ici ?
http://terrageo.sogefi-web.com/terrageo/?insee=34172

C’est un multipolygone troué.

Salut,
Effectivement, la requête fonctionne bien. La table des éléments affichée dans Tilemill semble être bonne (mais elle est bien longue à charger). Par contre, plus moyen de faire afficher un rendu à Tilemill. Est-ce lié à la lourdeur de l’analyse ? Ou à autre chose ? Je vois que le processus Postgre tourne au maximum.
JB.

PS : la requête :

(SELECT p1.“ref:FR:CEF”, split_part(p1.“ref:FR:CEF”,’_’,2) AS “ref:FR:CEF:short”, p1.admin_level, p1.name, p1.way
FROM planet_osm_polygon p1, planet_osm_polygon p2
WHERE p2.“ref:FR:CEF”=‘Be’ AND p1.boundary=‘religious_administration’ AND ST_Contains(p2.way, p1.way) and p1.way && !bbox! and p2.way && !bbox!
)as toto

C’est que la requête n’est pas optimisée et donc postgres pédale à fond.

Tu fais ça sur une base avec quelle emprise ? Région ? France ? Europe ? Monde ?

Est-ce qu’il y a un index sur planet_osm_polygon.boundary ?

C’est sur une région. La base OSM ne contient que la région (récupérée sur Géofabrik), le polygone de délimitation fait à peu près la moitié de cette région.
Je n’ai pas créé d’index supplémentaire (à ceux fait par défaut lors de l’importation). Ça se fait facilement ?
JB.

CREATE INDEX ON planet_osm_polygon USING GIST (way) WHERE boundary=‘religious_administration’;

Ca crée un index partiel (clause WHERE), mais je ne pense pas que tu y gagne grand chose sur une petite base. Sur une grosse, ça peut être très intéressant.