Mam tabelę PostGIS z dwiema kolumnami geometrii, obie zdefiniowane za pomocą SRID 4326. Mogę bez problemu wstawiać do tabeli, używając następującej INSERT
instrukcji (gdzie lng
i gdzie lat
wartości są przekazywane programowo):
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
)
Ale kiedy pytam o skrzyżowanie za pomocą ST_Intersects, w zależności od wartości punktu, który otrzymuję ERROR: Operation on mixed SRID geometries
.
Na przykład to zapytanie działa:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 46.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
A to błędy:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 47.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
Uwaga: są to identyczne zapytania, z wyjątkiem wartości długości geograficznej. Eksperymentowałem z różnymi wartościami, ale nie zidentyfikowałem wyraźnego punktu przejścia między zapytaniami, które działają i nie działają.
Myślę, że zasadniczo coś nie rozumiem. Na razie rozwiązałem / poprawiłem / ST_GeomFromText
obejrzałem ten problem, ponownie formatując zapytanie, aby użyć i jawnie określając SRID:
SELECT * FROM pad_meta where ST_Intersects(
ST_GeomFromText('POINT(-122.334172173172 47.602634395263560)', 4326), area
) ORDER BY created DESC;
Ale szczerze mówiąc, tak naprawdę nie rozumiem, na czym polega różnica lub czy to naprawdę „rozwiązanie”.
Moje pytanie brzmi: dlaczego pojawia się błąd tylko w przypadku określonych wartości i jaki jest właściwy sposób sformatowania tego zapytania?
Oto definicja mojej tabeli w celach informacyjnych:
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)
);
Zweryfikowałem również, że istnieje tylko jeden typ SRID w 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
Doceniona pomoc / porady. Dziękuję Ci! (Uwaga: widziałem również to pytanie , ale ponieważ już jawnie definiuję moje geometryczne identyfikatory SRID podczas wstawiania do tabeli, wygląda na to, że tak się nie dzieje.)
SRID=4326
(tak jak to zrobiłeś powyżej) to właściwy sposób ustawienia SRID dla reszty instrukcji? (w przeciwieństwie do używaniaST_GeomFromText
po prostu dlatego, że nie wiedziałem, jak inaczej określić SRID ...?) Czy istnieje sposób, aby ustawić domyślny SRID dla zapytań? Wydaje się, że za każdym razem jest to jawne. jeszcze raz dzięki!geography
typów, które zawsze wynoszą 4326. Ponadto istnieje kilka sposobów określania SRID.Kilka uwag, które mogą pomóc: Po pierwsze,
Point(Double, Double)
jest natywną funkcją PostgreSQL, którą wymuszasz na typ danych PostGIS.ST_MakePoint(double x, double y)
stworzy odpowiednią geometrię. Ponadto w swoim pytaniu wydajesz się odnosić do drugiego argumentu jako długości geograficznej. Właściwa kolejność tox, y
, co odpowiadaLongitude, Latitude
. Odwrócenie tych ustawień może zwrócić nieoczekiwane wyniki bez zgłaszania wyjątków.Nic z tego tak naprawdę nie wyjaśnia, dlaczego twój pierwszy przykład czasami działa, a nie inne, ale mam nadzieję, że pomoże to w tworzeniu dobrych zapytań.
źródło