Aquí hay un resumen rápido sobre lo que estoy tratando de hacer: tengo 3 tablas en Postgres, 'a' y 'b', cada una tiene una columna Polígono y 'c' tiene una columna Punto. Lo que estoy tratando de hacer aquí es obtener las intersecciones de geometrías entre 'a', 'b' y 'c', y mostrar esas geometrías en una capa vectorial de OpenLayers.
Ya sé cómo mostrar cualquier tipo de geometría de una Cadena en OpenLayers, pero tengo problemas con la función ST_Intersection de PostGIS, estoy haciendo esto:
SELECT ST_Intersection(a.geom, b.geom) as inter from a, b;
donde a.geom y b.geom son las dos columnas de geometría, y recibo este mensaje de error:
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!
También intenté expresar la geometría resultante como texto usando ST_AsText así:
SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as inter from a, b;
pero me envía este mensaje de error:
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
No sé qué estoy haciendo mal, solo quiero que el WKT de los polígonos lo muestre en OpenLayers, así es como visualizo una geometría de 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);
ACTUALIZACIÓN: probé el siguiente:
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';
pero recibo el siguiente mensaje de error:
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.
Agregué el válido para verificar que solo se están evaluando polígonos válidos, pero indica que el error está en la intersección ST_ (Intersección, a, b), tanto a, byc tienen el mismo SRID, así que estoy realmente confundido, lo siento si estoy preguntando demasiado, pero soy bastante nuevo con PostGIS, así que espero no molestarte mucho. Gracias.
SELECT PostGIS_Full_Version();
devuelve?Respuestas:
Supongo que fallará si la intersección devuelve NULL. Por lo tanto, debe agregar una cláusula where para verificar si realmente hay una intersección antes de intentar crear el WKT.
fuente
La pista es
Como dice el mensaje de error, no puede usar st_intersection de esa manera. Resumiendo las otras respuestas, debe usar algo como esto:
AFAIK no tiene sentido usar st_overlaps y st_intersects en la misma oración, ya que son bastante similares .
fuente
Probé entre diferentes capas de polígonos y falló si hay al menos una geometría no válida en una de las capas. ¿Verificó la validez de sus polígonos usando ST_isvalid (the_geom)? Puede ser la clave.
fuente
Intenta algo como esto:
Fuente
fuente
Traté de excluir las geometrías inválidas pero no funcionó, así que al final tuve que eliminar todas las geometrías inválidas y luego usar esto:
Como puede ver, omití la parte ST_Intersection (a, b), y funcionó muy bien, estoy un poco triste porque no pude encontrar una manera de excluir cualquier geometría no válida de mi selección, de todos modos gracias a todos por ayudarme aquí afuera.
fuente
Tuve este problema una vez.
Pude resolver este error usando este método.
- Use QGIS
- Agregue una capa vectorial de su base de datos
- Tome el punto del mensaje de error y búsquelo en QGIS
"QuickWKT" (complemento) se puede usar para encontrarlo
- Luego verá la cadena lineal problemática
- Active el modo de edición
- Seleccione "herramienta de nodo" para mostrar el nodo verde (problema de nodo)
- Aleje el nodo del nodo superpuesto
- Guarde los cambios
fuente