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.
SELECT PostGIS_Full_Version();
revient-il?Réponses:
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.
la source
L'indice est
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:
AFAIK, il est inutile d'utiliser st_overlaps et st_intersects dans la même phrase car ils sont assez similaires .
la source
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é.
la source
Essayez quelque chose comme ceci:
La source
la source
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:
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.
la source
J'ai eu ce problème une fois.
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
la source