Bonjour,
J'ai une couche de points de plusieurs millions d'entités sur la France entière.
J'ai décidé d'utiliser la fonction \gexec de psql pour diviser mon jeu de données en plusieurs tables correspondant à chaque département.
Code:
SELECT 'DROP TABLE IF EXISTS pt_cuivre.dep' || code_dep || '; CREATE TABLE pt_cuivre.dep'|| code_dep || ' AS SELECT * FROM cuivre.v_france_extract_dep WHERE code_dep =' || quote_literal(code_dep) || ';' AS requete FROM (SELECT DISTINCT code_dep FROM cuivre.v_france_extract_dep) AS a \gexec
J'aimerais générer des diagrammes de voronoi en reprenant le même principe (c'est à dire une table de voronoi par département) mais en repartant des tables du schéma pt_cuivre.
Ma question est : comment exécuter mon script en lui faisant boucler sur toutes les tables du schéma pt_cuivre?
J'ai commencé une fonction qui crée la requête dynamique me donnant pour chaque table la bonne requête à exécuter. (l'essentiel du travail de génération de voronoi vient de de John Powell :
https://gis.stackexchange.com/questi.../172256#172256
Code:
CREATE OR REPLACE FUNCTION voronoi_pt_cuivre_dep() RETURNS VARCHAR as $BODY$
BEGIN
EXECUTE format($$
-- Calcule l'enveloppe concave pour les points d'entrée
-- les points sur l'enveloppe concave sont ceux qui ont des polygones non fermés dans le diagramme de Voronoï en sortie.
WITH conv_hull(geom) AS
(SELECT ST_ConcaveHull( ST_Collect(geom),0.70,true )
FROM %1$s.%2$s meshpoints),
-- Trouve les points d'origine de l'enveloppe concave
edge_points(points) AS
(SELECT mp.geom FROM %1$s.%2$s mp, conv_hull ch
WHERE ST_Touches(ch.geom, mp.geom)),
-- Buffer autour de l'enveloppe (distance arbitraire)
buffered_points(geom) AS
(SELECT ST_Buffer(geom, 100) as geom FROM conv_hull),
-- Trouve les points les plus proches du buffer de l'enveloppe la plus proche des points de l'étape 2
closest_points(points) AS
(SELECT ST_Closestpoint(ST_Exteriorring(bp.geom), ep.points) as points,ep.points as epoints FROM buffered_points bp, edge_points ep),
-- Ajouter ces points au jeu de données d'origine
combined_points(points) AS
(SELECT points FROM closest_points UNION SELECT geom FROM %1$s.%2$s meshpoints),
-- Calcule les diagrammes de voronoi à partir de ce jeu de données combiné. Tous les points ont maintenant des polygones fermés
voronoi (vor) AS
(SELECT ST_Dump(ST_VoronoiPolygons(ST_Collect(points))) as geom FROM combined_points)
SELECT
(vor).path[1] as id,
(vor).geom
INTO voronoi.%2$s
FROM voronoi
$$, schemaname, tablename)
FROM pg_catalog.pg_tables
WHERE schemaname = 'pt_cuivre';
END
$BODY$ LANGUAGE plpgsql;
Lorsque j'essaye d'exécuter ma fonction Postgres me dit que plus d'une ligne est renvoyée..je ne trouve pas mon erreur dans le code, auriez vous une idée?
Merci d'avance!
Marine.