Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Thu 17 October 2013 10:15

Thomas Williamson
Participant actif
Lieu: Poitiers
Date d'inscription: 16 Nov 2008
Messages: 92

[PostGIS] Calcul d'un linéaire exact par polygone

Bonjour,

Je souhaite calculer un linéaire de réseau par commune, j'ai donc deux couches : communes (polygones) et réseau (polylignes). Mon problème réside dans les lignes qui sont à cheval sur des limites de communes.

Existe-t-il une fonction PostGIS pour calculer le linéaire exact par commune sans avoir à effectuer une découpe des lignes au préalable ?

Mon code qui compte deux fois les lignes « à cheval » :

Code:

SELECT a.nom, st_length(b.geom) as longueur FROM commune a, reseau b WHERE st_intersects(a.geom, b.geom);

Merci !

Thomas

Hors ligne

 

#2 Thu 17 October 2013 11:31

Benoit91
Participant assidu
Date d'inscription: 2 Oct 2008
Messages: 263

Re: [PostGIS] Calcul d'un linéaire exact par polygone

Bonjour

il me semble qu'avec une formule de ce type, cela calcul la longueur exact à l'intersection des polygones communes

Code:

SELECT commune.nom, sum(st_length(st_intersection(assainissement.geom, commune.geom))) AS ml_cana
FROM administratif.commune, technique.assainissement
WHERE st_intersects(commune.geom,assainissement.geom)
GROUP BY commune.nom

J'ai repris cette requête d'une requête plus générale donc elle est a adapter à vos besoins.
Cordialement.

Hors ligne

 

#3 Thu 17 October 2013 11:38

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: [PostGIS] Calcul d'un linéaire exact par polygone

Bonjour,

Non, sans découper les lignes, ca ne sera pas possible: il faut faire l'intersection entre la ligne et la commune pour savoir quelle portion de la ligne est contenue dans la commune.

Comme l'indique Benoit, ca peut cependant etre fait en une seule requete, sans créer physiquement une table contenant les lignes découpées. C'est toute la puissance de la base de données et de PostGIS.

Nicolas

Hors ligne

 

#4 Thu 17 October 2013 14:06

Thomas Williamson
Participant actif
Lieu: Poitiers
Date d'inscription: 16 Nov 2008
Messages: 92

Re: [PostGIS] Calcul d'un linéaire exact par polygone

Bonjour,

Merci pour ces éléments ! La requête donnée par Benoît ne renvoie pas le linéaire exact par commune mais le résultat est légèrement différent.

Pour résumer :


Scénario 1 - Ma requête compte en double les lignes qui chevauchent les contours de communes :

Code:

SELECT a.nom, st_length(b.geom) as longueur FROM commune a, reseau b WHERE st_intersects(a.geom, b.geom) ;

Scénario 2 - La requête proposée par Benoît tranche et associe chaque ligne à cheval à une commune en particulier :

Code:

SELECT a.nom, sum(st_length(st_intersection(a.geom, b.geom)) AS longueur FROM commune a, reseau b WHERE st_intersects(a.geom, b.geom) GROUP BY a.commune ;

Nicolas, comment t'y prendrais-tu pour intégrer cette découpe dans la requête (avec la structure WITH table AS...) ?


Merci encore pour votre aide !

Thomas

Dernière modification par Thomas Williamson (Thu 17 October 2013 14:47)

Hors ligne

 

#5 Thu 17 October 2013 14:12

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3807

Re: [PostGIS] Calcul d'un linéaire exact par polygone

Bonjour,
la requête de Benoît découpe le linéaire aux limites des communes et chaque commune prend sa part. C'est ce que fait st_intersection (http://postgis.refractions.net/docs/ST_ … ction.html), fonction qui n'apparaït plus dans votre requête scenario 2

Hors ligne

 

#6 Thu 17 October 2013 15:11

Benoit91
Participant assidu
Date d'inscription: 2 Oct 2008
Messages: 263

Re: [PostGIS] Calcul d'un linéaire exact par polygone

Ne serait-ce pas votre group by qui pose problème ?

Vous faites un select a.nom et un group by a.commune

Cordialement.

Hors ligne

 

#7 Thu 17 October 2013 15:18

Thomas Williamson
Participant actif
Lieu: Poitiers
Date d'inscription: 16 Nov 2008
Messages: 92

Re: [PostGIS] Calcul d'un linéaire exact par polygone

En effet, avec ça c'est mieux :

Code:

SELECT a.nom, sum(st_length(st_intersection(a.geom, b.geom)) AS longueur FROM commune a, reseau b WHERE st_intersects(a.geom, b.geom) GROUP BY a.nom;

merci à tous pour votre aide !!

Thomas

Hors ligne

 

#8 Thu 17 October 2013 15:18

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: [PostGIS] Calcul d'un linéaire exact par polygone

Par calcul de linéaire, vous souhaitez obtenir la somme des longueurs de réseau contenue dans chaque commune ?

Si c'est le cas, il y a deux options concernant les lignes confondues avec une frontiere de commune:
    • comptabiliser leur longueur pour chaque commune, (la requete de Benoit)
    • comptabiliser leur longueur une seule fois, en attribuant le segment a une seule commune: il faut alors un critère pour choisir a quelle commune attribuer un segment commun.

Nicolas

Hors ligne

 

#9 Thu 17 October 2013 15:21

Thomas Williamson
Participant actif
Lieu: Poitiers
Date d'inscription: 16 Nov 2008
Messages: 92

Re: [PostGIS] Calcul d'un linéaire exact par polygone

Bonjour,

Je voulais bel et bien découper les segments suivant les limites de commune de manière à calculer le linéaire exact pour chaque commune.

Thomas

Hors ligne

 

#10 Thu 17 October 2013 15:36

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3807

Re: [PostGIS] Calcul d'un linéaire exact par polygone

Je pense que la remarque de Nicolas voulait dire : quel choix faites-vous lorsque la ligne longe (entendre, se superpose à) une portion de votre limite communale? Pour le coup, ce linéaire touche les deux communes. La requête proposée par Benoît compte cette portion dans les deux communes.
Après, peut-être que cette situation est marginale dans vos traitements... Mais c'est à savoir.

Hors ligne

 

#11 Thu 17 October 2013 15:45

Thomas Williamson
Participant actif
Lieu: Poitiers
Date d'inscription: 16 Nov 2008
Messages: 92

Re: [PostGIS] Calcul d'un linéaire exact par polygone

Bonne remarque ! Cela s'avère très certainement marginal dans mon cas mais je le garde à l'esprit si des statistiques posent problème. Il faudra alors creuser ce point pour éliminer les double-comptages éventuels.

Thomas

Hors ligne

 

#12 Fri 28 April 2023 12:57

emmamillefeuille
Juste Inscrit !
Date d'inscription: 26 Apr 2022
Messages: 9

Re: [PostGIS] Calcul d'un linéaire exact par polygone

Bonjour,

Je me permets de réanimer ce sujet car je suis dans un cas similaire : je souhaite moi aussi obtenir la longueur d'un réseau (cours d'eau) par communes et la fonction que j'utilise est la même que celle plus haut avec

Code:

sum(st_length(st_intersection(a.geom,b.geom)))

et elle fonctionne très bien pour les cours d'eau qui "entrent" une fois par communes et la traversent par exemple.

Néanmoins, certains cours d'eau en bordure de communes longent la limite, entrant et sortant plusieurs fois de chaque communes (en zigzag) et là la longueur est nulle.

Auriez-vous une idée ? Je sais que la géométrie "en morceau" de la ligne sera discutable, mais j'aimerais bien obtenir la longueur par communes malgré tout.

Merci à tous

Emma

Hors ligne

 

Pied de page des forums

Powered by FluxBB