Ich besitze eine PostGIS-Tabelle mit zwei Geometriespalten, die beide mit der SRID 4326 definiert wurden. Mit der folgenden INSERT
Anweisung kann ich problemlos in die Tabelle einfügen (wobei lng
und lat
werden Werte programmgesteuert übergeben):
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
)
Aber wenn ich mit ST_Intersects nach einer Kreuzung frage, hängt das vom Wert des Punktes ab, den ich erhalte ERROR: Operation on mixed SRID geometries
.
Diese Abfrage funktioniert beispielsweise wie folgt:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 46.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
Und diese Fehler raus:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 47.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
Beachten Sie, dass es sich mit Ausnahme des Längengrads um identische Abfragen handelt. Ich habe mit verschiedenen Werten experimentiert, aber keinen klaren Übergangspunkt zwischen den funktionierenden und den nicht funktionierenden Abfragen festgestellt.
Ich glaube, ich verstehe etwas grundlegend falsch. Im Moment habe ich das Problem gelöst / korrigiert / umgangen, indem ich die zu verwendende Abfrage neu formatiert ST_GeomFromText
und die SRID explizit angegeben habe:
SELECT * FROM pad_meta where ST_Intersects(
ST_GeomFromText('POINT(-122.334172173172 47.602634395263560)', 4326), area
) ORDER BY created DESC;
Aber ich verstehe ehrlich gesagt nicht wirklich, was der Unterschied ist oder ob dies wirklich "die" Lösung ist.
Meine Frage lautet: Warum wird nur für bestimmte Werte ein Fehler angezeigt, und wie kann diese Abfrage ordnungsgemäß formatiert werden?
Hier ist meine Tabellendefinition als Referenz:
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)
);
Ich habe auch überprüft, dass es nur einen Typ von SRID in den geometry_columns gibt:
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
Hilfe / Ratschläge erwünscht. Vielen Dank! (Hinweis: Ich habe diese Frage auch gesehen , aber da ich meine Geometrie-SRIDs bereits beim Einfügen in die Tabelle explizit definiere, scheint dies nicht der Fall zu sein.)
SRID=4326
(wie oben beschrieben) das richtige Präfix vorangestellt , um die SRID für den Rest der Anweisung festzulegen? (im Gegensatz zur Verwendung vonST_GeomFromText
einfach, weil ich nicht wusste, wie ich die SRID angeben soll ...?) Gibt es eine Möglichkeit, eine Standard-SRID für Abfragen festzulegen? scheint ziemlich ausführlich zu sein, es jedes Mal explizit festzulegen. noch einmal Danke!geography
Typen vorzuschlagen , die immer 4326 sind. Außerdem gibt es verschiedene Möglichkeiten , die SRID anzugeben.Einige Beobachtungen, die helfen können: Eine
Point(Double, Double)
ist eine native PostgreSQL-Funktion, die Sie für einen PostGIS-Datentyp verwenden.ST_MakePoint(double x, double y)
erstellt die richtige Geometrie. Außerdem scheinen Sie in Ihrer Frage das zweite Argument als Längengrad zu bezeichnen. Die richtige Reihenfolge istx, y
, was entsprichtLongitude, Latitude
. Wenn diese umgekehrt werden, können unerwartete Ergebnisse zurückgegeben werden, ohne dass Ausnahmen auftreten.Nichts davon erklärt wirklich, warum Ihr erstes Beispiel manchmal funktioniert und nicht andere, aber dies wird Ihnen hoffentlich dabei helfen, gute Abfragen zu erstellen.
quelle