LINUX.ORG.RU

формула окружности

хотя наверное в постгресе должно быть что-то готовое для этого

Harald ★★★★★
()

Считай расстояние между объектами, фильтруй те, расстояние которых до определённой записи меньше радиуса.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Хорошо, есть

POINT(30.3014939 50.5485867)
у одних типов записи и
POLYGON((30.431628 50.5140005,30.4316649 50.5139354,30.431736 50.5138812,30.431844 50.5138451,30.4320116 50.5138794,30.4325061 50.5141974,30.4325141 50.5142959,30.4324919 50.5143673,30.432418 50.514398,30.4323242 50.5144197,30.4322219 50.5144233,30.4321367 50.5143854,30.4316848 50.5140691,30.431628 50.5140005))

у других, я не понимаю, как применить это к T_DWithin или ST_PointInsideCircle.

serg002 ★★★
() автор топика
Ответ на: комментарий от serg002

Преобразуй оба объекта к geography (Geography(ST_Transform(geom, srid))), передай их первыми двумя аргументами в ST_DWithin , третим аргументом передай радиус в метрах.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

Что-то не получается

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);

serg002 ★★★
() автор топика
Ответ на: комментарий от Rastafarra

Выбирает все place_id из таблицы т.е не работает

SELECT  place_id from placex WHERE ST_Distance(ST_Point(30.3014939, 50.5485867) :: GEOGRAPHY, ST_Point(30.3014939, 50.5485867) :: GEOGRAPHY) < 1;
SELECT  place_id from placex WHERE ST_Distance(ST_Point(50.5485867,30.3014939) :: GEOGRAPHY, ST_Point(50.5485867,30.3014939) :: GEOGRAPHY) < 1;

serg002 ★★★
() автор топика
Ответ на: комментарий от serg002

Что-то не получается

У тебя первые два аргумента ST_DWithin — две одинаковые точки, и 100 метров из исходного поста каким-то образом превратились в 10000 метров.

theNamelessOne ★★★★★
()
Ответ на: комментарий от serg002

У тебя в исходном сообщении написано, что ты ищешь объекты из столбца, которые находятся на расстоянии от определённой точки. А у тебя в запросе для каждой строки проверяется, что точка находится на расстоянии не больше 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);

Тебе нужно одним аргументом передать объект из твоего столбца, а вторым — твою «определённую запись».

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

Что означает объект, если два аргумента - geometry

Synopsis
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);

boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters);

boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);

serg002 ★★★
() автор топика
Ответ на: комментарий от theNamelessOne

У объекта есть point т.е объект == точка. Мне нужно выбрать id объектов из таблицы placex, которые находятся в радиусе этого объекта

serg002 ★★★
() автор топика
Ответ на: комментарий от Anoxemian

радиус есть вокруг этой точки

serg002 ★★★
() автор топика
Ответ на: комментарий от serg002

Что означает объект, если два аргумента - geometry

Тут всё написано, читай внимательно.

theNamelessOne ★★★★★
()
Ответ на: комментарий от serg002

Одним запросом получи координаты точки, с который ты будешь сравнивать эти объекты. Вторым запросом уже сравнивай объекты. При этом одним параметром ST_DWithin передавай координаты точки, а другим — координаты объекта.

theNamelessOne ★★★★★
()
Ответ на: комментарий от serg002

чет теперь мне кажется что ты не хочешь напрячься.

в моем примере точки две:

одна --- это та, вокруг которой ты ищещь, пусть будет твоя

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;

типа. и пофиг на два селекта ))

Rastafarra ★★★★
()
Ответ на: комментарий от Rastafarra

Не получается

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;

serg002 ★★★
() автор топика
Ответ на: комментарий от serg002

Потом проверь скорость работы на 100 000 000 записей :)

HIS
()
Ответ на: комментарий от LINUX-ORG-RU

Дык данные же, в Postgres есть бинарные JSON всякие еще. Ты только SQLite видел? %) Геофункционал даже в ЛИНТЕР есть.

Deleted
()
Ответ на: комментарий от Deleted

Аааа, геоданные их храниение и поиск выборок всяких, теперь понял. Ну там карту хранить и найти например объекты в пределе радиуса города там. Хотя всё равно необычно это. Я никогда даже не прикасался к геоданным, хотя получить список объектов из базы по расстоянию от другого объекта звучит удобно.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Хотя что мешает сделать всё это без подобных наворотов? К позиции прибавить радиус и найти всё что не превышает это значение и по итогу искать надо диапазон от-до. Изи. Нахер тут что-то отдельное кроме как «потому что можем» я так и не понял =)

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Ды. Да и зачем велосипедить.

Deleted
()
Ответ на: комментарий от LINUX-ORG-RU

Наверняка.

Я 7 лет назад про это не знал, когда помогал оптимизировать запрос сотруднику и рисовали на гугл карте наши точки приёма платежей в окне сайта.

HIS
()
Ответ на: комментарий от serg002

т.е не работает

Не работает у тебя голова. Одна из точек должна быть из таблицы, балда. Примерно так

SELECT place_id FROM placex WHERE ST_Distance(ST_Point(30.3014939, 50.5485867) :: GEOGRAPHY, placex.location) < 1;

Ну или как там у тебя называется. Если точка тоже из таблицы и нужно по номеру

SELECT place_id FROM placex WHERE ST_Distance((SELECT location FROM placex WHERE place_id = 100500), placex.location) < 1;

no-such-file ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Хотя что мешает сделать всё это без подобных наворотов? К позиции прибавить радиус и найти всё что не превышает это значение и по итогу искать надо диапазон от-до

Если даже не брать в расчёт эффективность хранения и выборки spatial-данных, то потому, что твоя реализация алгоритма может быть неточной или вообще давать неправильные результаты. Если мы говорим о координатах на поверхности Земли, то стоит учесть, что Земля — не плоскость и даже не сфера. Есть большое количество (моя версия PostGIS поддерживает 5757) координатных систем, каждая из которых представляет собой отдельную (неточную) модель поверхности земли с разными единицами измерения (например, в одной системе расстояние может измеряться в метрах, в другой — в градусах). GIS-система позволяет тебе работать в координатах конкретной системы и преобразовывать координаты из одной системы в другую.

Кроме того, в PostGIS ты можешь работать не только с точками, но и с более сложными объектами, например, с полигонами.

theNamelessOne ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.