#1 Wed 05 October 2011 11:29
- Loublande
- Participant occasionnel
- Date d'inscription: 29 Oct 2008
- Messages: 38
calcul d'intersection postgis
Bonjour,
Je suis novice en BD. J'ai 2 table dans postgis (parcelle et EBC) Je voudrais faire calculer à la machine la chose suivante :
Calcul d'intersection entre les objets de la table parcelle et de la table EBC avec retour de la surface intersectée.
Quelqu'un peut-il m'aider.
Je vous remercie par avance.
Hors ligne
#2 Wed 05 October 2011 11:51
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: calcul d'intersection postgis
Bonjour,
Je suis novice en BD. J'ai 2 table dans postgis (parcelle et EBC) Je voudrais faire calculer à la machine la chose suivante :
Calcul d'intersection entre les objets de la table parcelle et de la table EBC avec retour de la surface intersectée.
Quelqu'un peut-il m'aider.
Je vous remercie par avance.
Bonjour,
Code:
select st_area(st_intersection(a.geom, b.geom)) from parcelle a, ebc b where st_intersects(a.geom, b.geom)
Creer des index spatiaux sur les tables avant.
Si volumetrie importante, ca peut prendre du temps !
(http://postgis.refractions.net/document … ction.html)
Nicolas
En ligne
#3 Wed 05 October 2011 12:32
- Loublande
- Participant occasionnel
- Date d'inscription: 29 Oct 2008
- Messages: 38
Re: calcul d'intersection postgis
Merci Nicolas pour la réponse mais, la machine me renvoie ce message :
NOTICE: TopologyException: found non-noded intersection between LINESTRING (1.35685e+06 6.22968e+06, 1.35685e+06 6.22968e+06) and LINESTRING (1.35684e+06 6.22967e+06, 1.35685e+06 6.2297e+06) at 1.35685e+06 6.22968e+06
ERREUR: GEOS Intersection() threw an error!
********** Erreur **********
ERREUR: GEOS Intersection() threw an error!
État SQL :XX000
Merci d'avance
Hors ligne
#4 Wed 05 October 2011 12:34
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: calcul d'intersection postgis
Merci Nicolas pour la réponse mais, la machine me renvoie ce message :
NOTICE: TopologyException: found non-noded intersection between LINESTRING (1.35685e+06 6.22968e+06, 1.35685e+06 6.22968e+06) and LINESTRING (1.35684e+06 6.22967e+06, 1.35685e+06 6.2297e+06) at 1.35685e+06 6.22968e+06
ERREUR: GEOS Intersection() threw an error!
********** Erreur **********
ERREUR: GEOS Intersection() threw an error!
État SQL :XX000
Merci d'avance
Certaines données doivent etre invalides:
select st_isvalidreason(geom) from parcelle where not st_isvalid(geom)
select st_isvalidreason(geom) from ebc where not st_isvalid(geom)
Si ca se confirme, il faudra nettoyer les données (snapToGrid, st_buffer(geom, 0) par exemple.
Nicolas
En ligne
#5 Wed 05 October 2011 15:35
- Loublande
- Participant occasionnel
- Date d'inscription: 29 Oct 2008
- Messages: 38
Re: calcul d'intersection postgis
Re bonjour nicolas,
Effectivement, il ressort 37 erreurs (de type "Self-intersection[1.35408e+06 6.2305e+06]") pour 18000 polygones dans la tables parcelles et 1 erreur dans EBC. Je dois donc utiliser "snapToGrid, st_buffer(geom, 0)". Pouvez-vous me montrer un exemple de syntaxe ? Par ailleurs, à quoi corespond le paramètres "0" après geom ?
Merci d'avance.
Hors ligne
#6 Wed 05 October 2011 15:46
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: calcul d'intersection postgis
Re bonjour nicolas,
Effectivement, il ressort 37 erreurs (de type "Self-intersection[1.35408e+06 6.2305e+06]") pour 18000 polygones dans la tables parcelles et 1 erreur dans EBC. Je dois donc utiliser "snapToGrid, st_buffer(geom, 0)". Pouvez-vous me montrer un exemple de syntaxe ? Par ailleurs, à quoi corespond le paramètres "0" après geom ?
Merci d'avance.
En fait, il y a plusieurs facon de corriger des données qui ne sont pas valides au sens OGC. Le format Shapefile autorisant le stockage de géometries "bizarres", il arrive souvent apres chargement des shapefiles en base postgis que les polygones ne soient pas valides.
La methode snapToGrid réduit la précision des coordonnées en les "collant" sur une grille de taille donnée. Par exemple avec des données France métrique, il ne sert a rien de garder des chiffres apres la virgule. Ca n'a pas de sens au niveau geo (sauf si les données ont été numérisées avec une précision 10cm ou cm, mais c'est plutot rare ).
La methode buffer(geom, 0) arrive souvent a "nettoyer" des geometries invalides en reconstruisant le polygone et en virant les petites intersections. Le 0 veut dire: buffer de 0 m, soit la geometrie elle-meme.
Je vous recommande par ailleurs la lecture de la doc Postgis, qui contient deux chapitres d'introduction bien utiles pour comprendre le mécanisme de PostGIS.
Nicolas
En ligne
#7 Wed 05 October 2011 16:49
- Loublande
- Participant occasionnel
- Date d'inscription: 29 Oct 2008
- Messages: 38
Re: calcul d'intersection postgis
Re bonjour Nicolas,
Merci pour toutes ces informations.
Hors ligne