Существует таблица с таким 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));
То есть точки сосредоточены в одном месте не далеко от друг друга.
Теперь отображение точека на карте:
Левая карта, это вывод всех точек. Права карта имеет вывод красной точки в радиусе которой будет происходить поиск.
Красная точка находится в координате
55.0502, 82.9615
Производим поиск с радиусом 500м. Запрос:
SELECT *
FROM "buildings"
WHERE ST_DWithin(location, ST_GeomFromText('POINT(55.0502 82.9615)'), 500, TRUE)
Результат:
Производим поиск с радиусом 1500м. Запрос:
SELECT *
FROM "buildings"
WHERE ST_DWithin(location, ST_GeomFromText('POINT(55.0502 82.9615)'), 1500, TRUE)
Результат:
Результат с обеими картами в меньшем маштабе.