Tengo una tabla PostGIS con dos columnas de geometría, ambas definidas con SRID 4326. Puedo insertar en la tabla sin problemas, utilizando la siguiente INSERT
instrucción (donde lng
y lat
son valores pasados mediante programación):
INSERT INTO pad_meta (
uuid, created, updated, name, origin, radius, area, expiry, creator
) VALUES (
$1, now(), now(), $2, ST_GeomFromText('POINT(lng, lat)', 4326), $3,
ST_Buffer(ST_GeomFromText('POINT(lng, lat)', 4326), $4), $5, $6
)
Pero cuando busco una intersección usando ST_Intersects, dependiendo del valor del punto que obtengo ERROR: Operation on mixed SRID geometries
.
Por ejemplo, esta consulta funciona:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 46.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
Y esto se equivoca:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 47.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
Tenga en cuenta que son consultas idénticas, excepto el valor de la longitud. He experimentado con diferentes valores, pero no identifiqué un punto de transición claro entre las consultas que funcionan y las que no.
Creo que fundamentalmente estoy malentendiendo algo. Por el momento, he resuelto / corregido / solucionado el problema volviendo a formatear la consulta para usarla ST_GeomFromText
y especificando explícitamente el SRID:
SELECT * FROM pad_meta where ST_Intersects(
ST_GeomFromText('POINT(-122.334172173172 47.602634395263560)', 4326), area
) ORDER BY created DESC;
Pero honestamente, realmente no entiendo cuál es la diferencia, o si esta es realmente "la" solución.
Mi pregunta es: ¿Por qué recibo un error solo para valores específicos y cuál es la forma correcta de formatear esta consulta?
Aquí está mi definición de tabla para referencia:
CREATE TABLE IF NOT EXISTS pad_meta (
uuid CHAR(32),
created TIMESTAMP,
updated TIMESTAMP,
name VARCHAR(128),
origin GEOMETRY(Point, 4326),
radius INTEGER,
area GEOMETRY(Polygon, 4326),
expiry TIMESTAMP,
creator CHAR(32),
PRIMARY KEY (uuid)
);
También he verificado que solo hay un tipo de SRID en geometry_columns:
SELECT f_table_name, f_geometry_column, srid FROM geometry_columns;
f_table_name | f_geometry_column | srid
--------------+-------------------+------
pad_meta | origin | 4326
pad_meta | area | 4326
Ayuda / consejos apreciados. ¡Gracias! (Nota: también he visto esta pregunta , pero dado que ya estoy definiendo explícitamente mis SRID de geometría al insertar en la tabla, parece que eso no es lo que está sucediendo).
SRID=4326
(como lo hizo anteriormente) la forma correcta de establecer el SRID para el resto de la declaración? (en lugar de usarST_GeomFromText
simplemente porque no sabía cómo especificar el SRID ...?) ¿hay alguna forma de establecer un SRID predeterminado para las consultas? parece bastante detallado establecerlo explícitamente cada vez. ¡gracias otra véz!geography
tipos, que siempre son 4326. Además, hay varias formas de especificar el SRID.Un par de observaciones que pueden ayudar: Una,
Point(Double, Double)
es una función nativa de PostgreSQL que está coaccionando a un tipo de datos PostGIS.ST_MakePoint(double x, double y)
creará la geometría adecuada. Además, en su pregunta parece referirse al segundo argumento como longitud. El orden correcto esx, y
, que corresponde aLongitude, Latitude
. Hacer que se inviertan puede devolver resultados inesperados sin lanzar ninguna excepción.Nada de esto explica realmente por qué su primer ejemplo funciona a veces y no a otros, pero espero que esto lo ayude a crear buenas consultas.
fuente