¿Cómo usar ST_Intersection?

15

Aquí hay un breve resumen de lo que estoy tratando de hacer: tengo 3 tablas en Postgres, 'a' y 'b', cada una tiene una columna de Polígono y 'c' tiene una columna de Puntos. Lo que estoy tratando de hacer aquí es obtener las intersecciones de las geometrías entre 'a', 'b' y 'c', y mostrar dichas geometrías en una capa vectorial de OpenLayers.

Ya sé cómo mostrar cualquier tipo de geometría desde 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 ambas columnas de geometría, y aparece 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 traté de expresar la geometría resultante como texto usando ST_AsText como este:

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

pero me envió 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 muestro 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é lo 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 valor válido para verificar que solo se están evaluando los polígonos válidos, pero indica que el error está en la intersección ST (a, b), tanto a, byc tienen el mismo SRID, así que estoy realmente confundido, perdón si Estoy pidiendo demasiado, pero soy bastante nuevo con PostGIS, así que espero no molestarte mucho. Gracias.

    
pregunta Uriel 21.07.2011 - 01:44

6 respuestas

8

Mi conjetura sería que falla si la intersección devuelve NULL. Por lo tanto, debe agregar una cláusula where que compruebe si realmente hay una intersección antes de intentar crear el WKT.

    
respondido por el underdark 21.07.2011 - 08:25
4

Realizo pruebas entre diferentes capas de polígonos y falló si hay al menos una geometría no válida en una de las capas. ¿Verificaste la validez de tus polígonos usando ST_isvalid (the_geom)? Puede ser la clave.

    
respondido por el Fabien Ancelin 21.07.2011 - 02:18
4

La pista es

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.

Como el mensaje de error dice que no puedes usar st_intersection de esa manera. Resumiendo las otras respuestas, debe usar algo como esto:

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 no tiene sentido usar st_overlaps y st_intersects en la misma oración que son bastante similares .

    
respondido por el Francisco Puga 05.11.2011 - 14:10
2

Prueba algo como esto:

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)
    ;

Fuente

    
respondido por el CaptDragon 21.07.2011 - 16:16
1

Intenté excluir las geometrías no válidas pero no funcionó, así que al final tuve que eliminar todas las geometrías no válidas y luego usar esto:

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';

Como puede ver, omití la parte ST_Intersection (a, b), y esto 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í.

    
respondido por el Uriel 21.07.2011 - 21:30
0

Tuve este problema una vez.

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

Pude resolver este error usando este método.
- Utilice QGIS
- Añadir capa vectorial desde su base de datos
- Tome el punto del mensaje de error y búsquelo en QGIS
"QuickWKT" (complemento) puede usarse para encontrarlo
- Entonces verás el problema en línea.
- Activar el modo de edición
- Seleccione "herramienta de nodo" para mostrar el nodo verde (problema de nodo)
- Alejar el nodo del nodo superpuesto
- Guardar cambios

    
respondido por el rut 07.03.2014 - 10:47

Lea otras preguntas en las etiquetas