Comment utiliser ST_Intersection?

15

Voici un bref résumé de ce que j'essaie de faire: j'ai 3 tables dans Postgres, «a» et «b», chacune a une colonne Polygone et «c» a une colonne Point. Ce que j'essaie de faire ici, c'est d'obtenir les intersections de géométries entre 'a', 'b' et 'c', et d'afficher ces géométries sur une couche vectorielle OpenLayers.

Je sais déjà comment afficher tout type de géométrie à partir d'une chaîne dans OpenLayers, mais j'ai des problèmes avec la fonction ST_Intersection de PostGIS, je fais ceci:

SELECT ST_Intersection(a.geom, b.geom) as inter from a, b;

où a.geom et b.geom sont les deux colonnes de géométrie, et je reçois ce message d'erreur:

NOTICE:  TopologyException: found non-noded intersection between 515172 2.14408e+06, 497067 2.13373e+06 and 501321 2.13546e+06, 471202 2.14843e+06 500621 2.13576e+06 
ERROR:  GEOS Intersection() threw an error!

J'ai également essayé d'exprimer la géométrie résultante sous forme de texte en utilisant ST_AsText comme ceci:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as inter from a, b;

mais il m'envoie ce message d'erreur:

HINT: No function matches the given name and argument types. You might need to add explicit type casts.

Je ne sais pas ce que je fais mal, je veux juste que le WKT des Polygones l'affiche sur OpenLayers, voici comment j'affiche une géométrie à partir d'un WKT:

                    var in_options = {
                        'internalProjection': new OpenLayers.Projection("EPSG:4326"),
                        'externalProjection': new OpenLayers.Projection("EPSG:4326")
                    }; 

                    var fea= new OpenLayers.Format.WKT(in_options).read(data); //data is the string with the WKT
                    vectorLayer.addFeatures([fea]); //this piece of code works great
                    map.zoomToExtent(bounds);

MISE À JOUR: J'ai essayé le suivant:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab FROM a INNER JOIN b ON 
ST_Intersection(a,b) WHERE ST_Overlaps(a.geom, b.geom) 
AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

mais je reçois le message d'erreur suivant:

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

J'ai ajouté isvalid pour vérifier que seuls les polygones valides sont en cours d'évaluation, mais cela indique que l'erreur se trouve dans ST_Intersection (a, b), a, b et c ont le même SRID, donc je suis vraiment confus, désolé si je suis demander trop, mais je suis assez nouveau avec PostGIS donc j'espère que je ne vous dérange pas beaucoup. Merci.

Uriel
la source
1
Que SELECT PostGIS_Full_Version();revient-il?
Mike T
POSTGIS = "1.4.0" GEOS = "3.1.0-CAPI-1.5.0" PROJ = "Rel. 4.7.1, 23 septembre 2009" USE_STATS
Uriel

Réponses:

8

Je suppose qu'il échoue si l'intersection renvoie NULL. Vous devez donc ajouter une clause where pour vérifier s'il existe réellement une intersection avant d'essayer de créer le WKT.

obscur
la source
J'ai essayé ceci: SELECT ST_Intersection (a.geom, b.geom) as intersect_ab FROM a INNER JOIN b ON ST_Intersection (a, b) WHERE ST_Overlaps (a.geom, b.geom) AND ST_isvalid (a.geom) = 't 'AND ST_isvalid (b.geom) =' t '; mais il a renvoyé la même erreur: ** ERREUR: la fonction st_intersection (a, b) n'existe pas. CONSEIL: Aucune fonction ne correspond au nom et aux types d'arguments donnés. Vous devrez peut-être ajouter des transtypages de types explicites. ** Je suis vraiment coincé à celui-ci, si vous pouvez m'aider, je l'apprécierai vraiment.
Uriel
Essayez résumé (a.geom) et résumé (b.geom) pour rechercher les valeurs.
underdark
résumé -------------------------- Polygone [BS] avec 1 anneau anneaux 0 a 4 points Polygone [BS] avec 1 anneau anneaux 0 a 5 points points Polygon [BS] avec 1 anneaux anneau 0 a 10 points
Uriel
Oui, ça devrait être ST_Intersection (a.geom, b.geom) pas ST_Intersection (a, b)
underdark
6

L'indice est

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

Comme l'indique le message d'erreur, vous ne pouvez pas utiliser st_intersection de cette manière. En résumant les autres réponses, vous devez utiliser quelque chose comme ceci:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab 
FROM a INNER JOIN b ON ST_Intersects(a.geom,b.geom)
WHERE ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

AFAIK, il est inutile d'utiliser st_overlaps et st_intersects dans la même phrase car ils sont assez similaires .

Francisco Puga
la source
4

Je teste entre différentes couches de polygones et cela a échoué s'il y a au moins une géométrie invalide dans l'une des couches. Avez-vous vérifié la validité de vos polygones à l'aide de ST_isvalid (the_geom)? C'est peut-être la clé.

Fabien Ancelin
la source
J'ai essayé ceci: SELECT ST_Intersection (a.geom, b.geom) as intersect_ab FROM a INNER JOIN b ON ST_Intersection (a, b) WHERE ST_Overlaps (a.geom, b.geom) AND ST_isvalid (a.geom) = 't 'AND ST_isvalid (b.geom) =' t '; mais il a renvoyé la même erreur: ** ERREUR: la fonction st_intersection (a, b) n'existe pas. CONSEIL: Aucune fonction ne correspond au nom et aux types d'arguments donnés. Vous devrez peut-être ajouter des transtypages de types explicites. ** Je suis vraiment perdu de savoir pourquoi cela ne fonctionne pas
Uriel
2

Essayez quelque chose comme ceci:

SELECT  ST_Intersection(a.geom, b.geom) As intersect_ab
    FROM a INNER JOIN b ON ST_Intersection(a,b)
    WHERE ST_Overlaps(a.geom, b.geom)
    ;

La source

CaptDragon
la source
J'ai essayé cela aussi, mais il renvoie le même message d'erreur: CONSEIL: Aucune fonction ne correspond au nom et aux types d'arguments donnés. Vous devrez peut-être ajouter des transtypages de types explicites.
Uriel
Et si vous utilisez "INNER JOIN b ON ST_Intersection (a.geom, b.geom)"?
CaptDragon
Il indique: ERREUR: l'argument de JOIN / ON doit être de type booléen, pas de type geometry.
Uriel
shizer ... il doit y avoir quelque chose de mal avec les données ou quelque chose parce que ce type de requête fonctionne pour moi.
CaptDragon
J'ai ajouté AND ST_isvalid (a.geom) = 't' AND ST_isvalid (b.geom) = 't'; à la fin pour évaluer uniquement les géométries valides, mais cela me dit que l'erreur se trouve dans cette st_intersection (a, b)
Uriel
1

J'ai essayé d'exclure les géométries invalides mais cela n'a pas fonctionné, donc à la fin j'ai dû supprimer toutes les géométries invalides et ensuite utiliser ceci:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as intersect_ab FROM a,b 
WHERE ST_Overlaps(a.geom, b.geom) AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

Comme vous pouvez le voir, j'ai omis la partie ST_Intersection (a, b), et cela a très bien fonctionné, je suis un peu triste parce que je n'ai pas pu trouver un moyen d'exclure toute géométrie invalide de ma sélection, de toute façon merci à tout le monde de m'aider là dehors.

Uriel
la source
0

J'ai eu ce problème une fois.

<pre>NOTICE:  TopologyException: found non-noded intersection between xxx, xxxx and xxx, xxx  ERROR:  GEOS Intersection() threw an error!</pre>

J'ai pu résoudre cette erreur en utilisant cette méthode.
- Utilisez QGIS
- Ajoutez une couche vectorielle à partir de votre base de données
- Prenez le point du message d'erreur et recherchez-le dans QGIS
   "QuickWKT" (plugin) peut être utilisé pour le trouver
- Ensuite, vous verrez le problème de ligne
- Activez le mode d'édition
- Sélectionnez "outil de nœud" pour afficher le nœud vert (problème de nœud)
- Éloignez le nœud du nœud qui se chevauchent
- Enregistrez les modifications

Ruthe
la source