Annonce
Pour sa 21ème année, l’association GeoRezo a toujours besoin de vous !
10€ = 1 mois de frais bancaires ; 15€ = 12 mois de nom de domaine ; 30€ = 1 semaine de location des serveurs …
Retrouver nos membres bienfaiteurs
#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: 1554
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: 3961
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: 1554
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: 3961
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