J'ai une table PostGIS avec deux colonnes de géométrie, toutes deux définies avec SRID 4326. Je peux insérer dans la table sans problème, en utilisant l' INSERT
instruction suivante (où lng
et lat
sont les valeurs transmises par programme):
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
)
Mais quand je demande une intersection en utilisant ST_Intersects, selon la valeur du point que j'obtiens ERROR: Operation on mixed SRID geometries
.
Par exemple, cette requête fonctionne:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 46.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
Et cela se trompe:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 47.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
Notez que ce sont des requêtes identiques à l'exception de la valeur de la longitude. J'ai expérimenté différentes valeurs, mais je n'ai pas identifié de point de transition clair entre les requêtes qui fonctionnent et ne fonctionnent pas.
Je pense que je comprends fondamentalement quelque chose. Pour le moment, j'ai résolu / corrigé / contourné le problème en reformatant la requête à utiliser ST_GeomFromText
et en spécifiant explicitement le SRID:
SELECT * FROM pad_meta where ST_Intersects(
ST_GeomFromText('POINT(-122.334172173172 47.602634395263560)', 4326), area
) ORDER BY created DESC;
Mais honnêtement, je ne comprends pas vraiment quelle est la différence, ou si c'est vraiment "la" solution.
Ma question est: pourquoi est-ce que j'obtiens une erreur uniquement pour des valeurs spécifiques, et quelle est la bonne façon de formater cette requête?
Voici ma définition de table pour référence:
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)
);
J'ai également vérifié qu'il n'y a qu'un seul type de SRID dans les 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
Aide / conseils appréciés. Je vous remercie! (Remarque: j'ai également vu cette question , mais comme je définis déjà explicitement mes SRID de géométrie lors de l'insertion dans la table, il semble que ce n'est pas ce qui se passe.)
SRID=4326
(comme vous l'avez fait ci-dessus) la bonne façon de définir le SRID pour le reste de l'instruction? (par opposition à l'utilisationST_GeomFromText
simplement parce que je ne savais pas comment spécifier le SRID ...?) existe-t-il un moyen de définir un SRID par défaut pour les requêtes? semble assez verbeux pour le définir explicitement à chaque fois. Merci encore!geography
types, qui sont toujours 4326. En outre, il existe plusieurs façons de spécifier le SRID.Quelques observations qui peuvent vous aider: Premièrement, il
Point(Double, Double)
s'agit d'une fonction PostgreSQL native que vous contraignez à un type de données PostGIS.ST_MakePoint(double x, double y)
créera une géométrie appropriée. De plus, dans votre question, vous semblez faire référence au deuxième argument en tant que longitude. L'ordre correct estx, y
, ce qui correspond àLongitude, Latitude
. Les inverser peut renvoyer des résultats inattendus sans lever d'exceptions.Rien de tout cela n'explique vraiment pourquoi votre premier exemple fonctionne parfois et pas d'autres, mais j'espère que cela vous aidera à créer de bonnes requêtes.
la source