Message posté par : preliator
----------------------------------------
Bonjour,
Disposant d'une couche multilinestring représentant les routes d'un département,
je souhaiterais couper cette couche en lignes de 500m.
Voici un aperçu de ma couche de routes :
https://zupimages.net/viewer.php?id=20/16/eh9e.png
Après quelques recherche sur internet, je suis parti sur cette démarche :
- Regrouper ma couche de route en un seul bloc (j'ai trouvé cela cohérent car la
couche de base est constitués de plusieurs lignes de tailles variables)
- Transformer ce bloc en linestring pour la requête suivante
- Créer des points tous les 500m le long de ma linestring avec st_lineinterpolatepoints
(pas possible de créer les points sur ma couche regroupée, car cette fonction
n'accepte que du linestring)
- Couper la couche regroupée sur cette couche de points.
-----------------
Code :
-- REGROUPER MA COUCHE DE ROUTE EN UN SEUL BLOC MULTILINESTRING
drop table if exists ligne_regroup;
create table ligne_regroup as
select St_linemerge(ST_Union(geom)) as geom
from public.route_echantillon;
-- TRANSFORMER LE BLOC EN LINESTRING
drop table if exists ligne_regroup_linestring;
CREATE TABLE ligne_regroup_linestring AS
SELECT (ST_Dump(ligne_regroup.geom)).geom::Geometry(LineString,2154) AS geom
FROM ligne_regroup;
-- CREER UN IDENTIFIANT UNIQUE SUR LA LINESTRING
alter table ligne_regroup_linestring add column id serial;
-- CREER LES POINT TOUS LES 500 METRES
drop table if exists point_500;
create table point_500 as
with tmp as(
select *
from ligne_regroup_linestring
where st_length(ligne_regroup_linestring.geom) > 500)
SELECT id, st_lineinterpolatepoints((tmp.geom),500/st_length(tmp.geom)) as geom
from tmp;
-- ON COUPE LA ROUTE REGROUPEE SUR LES POINTS
drop table if exists route_cut_500_metres;
create table route_cut_500_metres as
select ST_SNAP((ST_DUMP(st_difference(ligne_regroup.geom,point))).geom,all_point,0.1) as
geom
from
(select ST_Multi(ST_Union(st_expand(point_500.geom, 0.05))) as point from point_500 ) as
t1,
ligne_regroup,(select ST_MULTI(ST_COLLECT(point_500.geom))as all_point from point_500) as
t2;
-----------------
Malheureusement, j'obtiens des résultats aberrants. Les lignes semblent bien se
découper, mais il manque de nombreuses lignes.
Comme on peut voir sur l'exemple suivant :
https://zupimages.net/viewer.php?id=20/16/oaem.png
En vert : ma couche de route regroupée (ligne_regroup)
En rouge : le résultat de "route_cut_500_metres"
Les points : Résultat de la requête qui me crée des points tous les 500 mètres.
Merci.
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=332169#p332169
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