Ho una tabella PostGIS con due colonne geometriche, entrambe definite con SRID 4326. Posso inserirla nella tabella senza problemi, usando la seguente INSERT
istruzione (dove lng
e lat
sono i valori passati a livello di programmazione):
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
)
Ma quando chiedo un'intersezione usando ST_Intersects, a seconda del valore del punto che ottengo ERROR: Operation on mixed SRID geometries
.
Ad esempio, questa query funziona:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 46.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
E questo errore fuori:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 47.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
Si noti che sono query identiche ad eccezione del valore della longitudine. Ho sperimentato valori diversi, ma non ho identificato un chiaro punto di transizione tra le query che funzionano e non lo fanno.
Penso di aver sostanzialmente frainteso qualcosa. Per il momento, ho risolto / corretto / risolto il problema riformattando la query da utilizzare ST_GeomFromText
e specificando esplicitamente l'SRID:
SELECT * FROM pad_meta where ST_Intersects(
ST_GeomFromText('POINT(-122.334172173172 47.602634395263560)', 4326), area
) ORDER BY created DESC;
Ma sinceramente non capisco davvero quale sia la differenza, o se questa sia veramente la "soluzione".
La mia domanda è: perché visualizzo un errore solo per valori specifici e qual è il modo corretto di formattare questa query?
Ecco la mia definizione di tabella per riferimento:
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)
);
Ho anche verificato che esiste un solo tipo di SRID nelle geometrie_colonne:
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
Aiuto / consiglio apprezzato. Grazie! (Nota: ho anche visto questa domanda , ma poiché sto già definendo esplicitamente i miei SRID geometrici durante l'inserimento nella tabella, sembra che non sia ciò che sta accadendo.)
SRID=4326
(come hai fatto sopra) il modo giusto di impostare l'SRID per il resto dell'istruzione? (al contrario di usareST_GeomFromText
semplicemente perché non sapevo come specificare il SRID ...?) esiste un modo per impostare un SRID predefinito per le query? sembra piuttosto prolisso impostarlo esplicitamente ogni volta. ancora grazie!