У меня есть таблица PostGIS с двумя столбцами геометрии, оба определены в SRID 4326. Я могу без проблем вставить в таблицу следующий INSERT
оператор (где lng
и lat
значения передаются программно):
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
)
Но когда я запрашиваю пересечение, используя ST_Intersects, в зависимости от значения точки, которую я получаю ERROR: Operation on mixed SRID geometries
.
Например, этот запрос работает:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 46.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
И это ошибки:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 47.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
Обратите внимание, что это идентичные запросы, кроме значения долготы. Я экспериментировал с разными значениями, но не определил четкую точку перехода между запросами, которые работают и не работают.
Я думаю, что я в корне неправильно понимаю что-то. На данный момент я решил / исправил / обошел проблему, переформатировав запрос ST_GeomFromText
и явно указав SRID:
SELECT * FROM pad_meta where ST_Intersects(
ST_GeomFromText('POINT(-122.334172173172 47.602634395263560)', 4326), area
) ORDER BY created DESC;
Но я, честно говоря, не очень понимаю, в чем разница, или действительно ли это «решение».
Мой вопрос: почему я получаю сообщение об ошибке только для определенных значений, и как правильно отформатировать этот запрос?
Вот мое определение таблицы для справки:
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)
);
Я также проверил, что в geometry_columns есть только один тип SRID:
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
Помощь / совет приветствуется. Спасибо! (Примечание: я также видел этот вопрос , но, поскольку я уже явно определяю свои геометрические SRID при вставке в таблицу, кажется, что это не то, что происходит.)
SRID=4326
правильно ли ставить перед запросом (как вы сделали выше) правильный способ установить SRID для остальной части оператора? (в отличие от использованияST_GeomFromText
просто потому, что я не знал, как еще указать SRID ...?) Есть ли способ установить SRID по умолчанию для запросов? кажется довольно многословным, чтобы явно установить его каждый раз. еще раз спасибо!