Почему Postgres (PostGis) не верно вычисляет вхождения точек в радиус?

Существует таблица с таким DDL:

CREATE TABLE buildings
(
    id INTEGER PRIMARY KEY NOT NULL,
    city VARCHAR(255) NOT NULL,
    street VARCHAR(255) NOT NULL,
    build_number DOUBLE PRECISION NOT NULL,
    location GEOMETRY(POINT,4326) // пробовал и GEOGRAPHY(POINT,4326)
);


В таблице 100 записей, каждое поле location имеет значение:

sprintf('SRID=4326;POINT(%s %s)', $faker->longitude(55, 55.08), $faker->latitude(82.93, 83.01));


То есть точки сосредоточены в одном месте не далеко от друг друга.

Теперь отображение точека на карте:
5e12612300ce48ccb028bbd4d0cf6908.jpg

Левая карта, это вывод всех точек. Права карта имеет вывод красной точки в радиусе которой будет происходить поиск.
Красная точка находится в координате
55.0502, 82.9615


Производим поиск с радиусом 500м. Запрос:
SELECT *
FROM "buildings"
WHERE ST_DWithin(location, ST_GeomFromText('POINT(55.0502 82.9615)'), 500, TRUE)


Результат:
b581aa07a68b43738d6aad7f9377be9d.jpg

Производим поиск с радиусом 1500м. Запрос:
SELECT *
FROM "buildings"
WHERE ST_DWithin(location, ST_GeomFromText('POINT(55.0502 82.9615)'), 1500, TRUE)


Результат:
6842dc1c4b2843b3abb92c75fb729658.jpg

Результат с обеими картами в меньшем маштабе.
819574e6dc8140cfad5ec98d8e0efe36.jpg
  • Вопрос задан
  • 1316 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вы используете ST_DWithin с четырьмя параметрами, это Geography-режим. Для него объекты должны иметь одинаковый SRID. Попробуйте убрать четвёртый параметр или создавать точку с явным указанием SRID
ST_GeomFromText('POINT(55.0502 82.9615)', 4326)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы