Message posté par : neskuik01
----------------------------------------
-----------------
Nicolas Ribot écrit :
Bonjour,
Pour préciser un peu le traitement de hier et si j'ai bien compris: votre réseau
contient des segments géométriquement identiques mais avec potentiellement différentes
valeurs de v19, dont vous voulez faire la somme.
Dans ce cas, le plus simple est de "nettoyer" votre jeu de données en ne gardant
qu'un exemplaire du segment, et en faisant la somme des valeurs des segments
identiques, puis de lancer la récursion sur ce réseau propre.
Par exemple:
-----------------
Code :
create table data_clean as
select id_bdcarth::int, sum(v19) as v19, st_geometryn(wkb_geometry,
1)::geometry(linestring, 2972) as geom
from data_subset
group by 1, 3;
-----------------
La requête récursive proposée hier donne alors ce résultat:
-----------------
Code :
id_bdcarth vals
973195700 6
973196921 6
973196989 6
973197028 6
973195702 5
973195748 5
973195760 2
973195709 1
973195717 1
973195720 1
973195726 1
973195695 0
973195712 0
973195716 0
973195725 0
973195729 0
973195730 0
973195734 0
973195736 0
973195743 0
973195755 0
973195761 0
973195763 0
973196977 0
-----------------
Nicolas
-----------------
Bonjour Oui exactement c'est ce que j'ai fais ;). Comme dit sur le subset fournit
votre requête à très bien fonctionné mais c'est sur un réseau un peu plus volumineux
que ca échoue (il s'agit bien d'un réseau logique avec une topologie respectée).
j'ai exclu les test redondants en incluant une condition "WHERE not(d.ogc_fid =
any(ids))", mais après 5h de moulinette je n'avais toujours pas de résultat (et
il ne s'agit là que d'1/20 ème du réseau hydrographique que je dois couvrir ^^).
-----------------
Code :
create table add_3reg_v19 as
select * from (
with recursive toto as (
select (array_agg(ogc_fid))[1] as ogc_fid,
(array_agg(v))[1] as v,
1::int as iter,
array_agg(ogc_fid) as fids,
(array_agg(st_endpoint(geom)))[1] as geom,
array_agg[ogc_fid] as ids
from data_subset
group by unnest(ARRAY[st_startpoint(geom), st_endpoint(geom)])
having count(*) = 1
UNION ALL
select d.ogc_fid,
d.v,
iter+1,
t.fids || d.ogc_fid,
st_endpoint(d.geom),
ids || d.ogc_fid
from data_subset d join toto t on st_dwithin(t.geom, st_startpoint(d.geom), 0.001)
WHERE not(d.ogc_fid = any(ids)) -- exclu les tuples déjà testés
), tmp as (
select ogc_fid, v, unnest(fids[1:cardinality(fids) - 1]) as childs
from toto
), tmp1 as (
select t.ogc_fid, t.v, array_agg(distinct childs) as childs
from tmp t
group by t.ogc_fid, t.v
)
select t.ogc_fid, t.v + sum(d.v) as vals, dd.geom
from tmp1 t join data_subset d on d.ogc_fid = any(t.childs)
join data_subset dd on t.ogc_fid = dd.ogc_fid
group by t.ogc_fid, t.v, dd.geom
) as t;
-----------------
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=346735#p346735
Pour y répondre : geobd(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net