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.
Liens sociaux