Преобразуй оба объекта к geography (Geography(ST_Transform(geom, srid))), передай их первыми двумя аргументами в ST_DWithin , третим аргументом передай радиус в метрах.
SELECT place_id FROM placex WHERE ST_DWithin((Geography(ST_Transform(ST_Point(30.3014939,50.5485867), 4326))), (Geography(ST_Transform(ST_Point(30.3014939,50.5485867), 4326)))), 10000);
У тебя в исходном сообщении написано, что ты ищешь объекты из столбца, которые находятся на расстоянии от определённой точки. А у тебя в запросе для каждой строки проверяется, что точка находится на расстоянии не больше 10000 метров от самой себя. Вот, я отформатировал твой запрос:
SELECT place_id
FROM placex
WHERE ST_DWithin(
Geography(ST_Transform(ST_Point(30.3014939,50.5485867), 4326)), -- почему это...
Geography(ST_Transform(ST_Point(30.3014939,50.5485867), 4326)), -- равняется вот этому?
10000);
Тебе нужно одним аргументом передать объект из твоего столбца, а вторым — твою «определённую запись».
Одним запросом получи координаты точки, с который ты будешь сравнивать эти объекты. Вторым запросом уже сравнивай объекты. При этом одним параметром ST_DWithin передавай координаты точки, а другим — координаты объекта.
чет теперь мне кажется что ты не хочешь напрячься.
в моем примере точки две:
одна --- это та, вокруг которой ты ищещь, пусть будет твоя
select lat, lon FROM placex WHERE place_id=100033;
остальное --- все точки из базули.
select * from placex p where ST_Distance(ST_Point((select lat FROM placex WHERE place_id=100033), (select lon FROM placex WHERE place_id=100033)) :: GEOGRAPHY, ST_Point(p.lat, p.lon) :: GEOGRAPHY) < 100;
SELECT * FROM placex p WHERE ST_Distance(ST_Point((SELECT ST_X(geometry) FROM placex WHERE place_id=100033), (SELECT ST_Y(geometry) FROM placex WHERE place_id=100033)) :: GEOGRAPHY, ST_Point(ST_X(p.geometry), ST_Y(p.geometry)) :: GEOGRAPHY) < 100;
Аааа, геоданные их храниение и поиск выборок всяких, теперь понял. Ну там карту хранить и найти например объекты в пределе радиуса города там. Хотя всё равно необычно это. Я никогда даже не прикасался к геоданным, хотя получить список объектов из базы по расстоянию от другого объекта звучит удобно.
Хотя что мешает сделать всё это без подобных наворотов? К позиции прибавить радиус и найти всё что не превышает это значение и по итогу искать надо диапазон от-до. Изи. Нахер тут что-то отдельное кроме как «потому что можем» я так и не понял =)
Хотя что мешает сделать всё это без подобных наворотов? К позиции прибавить радиус и найти всё что не превышает это значение и по итогу искать надо диапазон от-до
Если даже не брать в расчёт эффективность хранения и выборки spatial-данных, то потому, что твоя реализация алгоритма может быть неточной или вообще давать неправильные результаты. Если мы говорим о координатах на поверхности Земли, то стоит учесть, что Земля — не плоскость и даже не сфера. Есть большое количество (моя версия PostGIS поддерживает 5757) координатных систем, каждая из которых представляет собой отдельную (неточную) модель поверхности земли с разными единицами измерения (например, в одной системе расстояние может измеряться в метрах, в другой — в градусах). GIS-система позволяет тебе работать в координатах конкретной системы и преобразовывать координаты из одной системы в другую.
Кроме того, в PostGIS ты можешь работать не только с точками, но и с более сложными объектами, например, с полигонами.