4 votos

¿Por qué sólo una de las siguientes consultas arroja un error?

Hay 2 consultas SQL:

SELECT wkb_geometry FROM building_polygon WHERE ST_Contains(wkb_geometry, ST_GeomFromText('POINT (29.4 60.1)'));
SELECT wkb_geometry FROM building_polygon WHERE ST_Contains(wkb_geometry, ST_GeomFromText('POINT (30.32670 59.92843)'));

La primera consulta funciona bien pero devuelve 0 filas. Pero la segunda consulta arroja un error Operation on mixed SRID geometries . No hay problema en señalar el SRID para la segunda consulta, pero no me queda claro por qué la primera consulta no devuelve el mismo error. ¿Es el comportamiento esperado?

4voto

hernan43 Puntos 566

Respuesta corta:

Siempre se define el SRID con geometrías. Por lo tanto, utilice uno de estos para hacer su punto:

  • ST_GeomFromText('POINT (29.4 60.1)', 4326)
  • 'SRID=4326;POINT(29.4 60.1)'::geometry
  • ST_SetSRID(ST_MakePoint(29.4, 60.1), 4326)

Si la geometría de entrada no tiene un SRID, entonces es indefinido (ya sea -1 o 0, cambiado en la versión 2.0).

Respuesta larga

La definición de ST_Contains utiliza la sentencia SQL en dos geometrías de entrada ( $1 y $2 ):

SELECT $1 && $2 AND _ST_Contains($1,$2)

que primero hace una búsqueda en el cuadro delimitador (índice) con el && operador. Esta primera parte de la consulta no requiere el SRID, por lo que si se encuentran cero resultados con los recuadros delimitadores, entonces la segunda y más costosa consulta no es necesaria. Sin embargo, si hay coincidencias con los recuadros delimitadores, entonces _ST_Contains se llama para ver si las geometrías reales cumplen los requisitos de "Contiene". Esta función comprueba si los SRID coinciden.

La primera consulta no tenía coincidencias de caja delimitadora con && Así que _ST_Contains no fue llamado.

La segunda consulta tenía coincidencias de caja delimitadora, pero detectó un error con _ST_Contains .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X