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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

Loublande a écrit:

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

Hors 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

Loublande a écrit:

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

Hors 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

Loublande a écrit:

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 smile ).

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

Hors 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

 

Pied de page des forums

Powered by FluxBB