Как реализовать проверку вхождения в окружность в PostgreSQL?
Здравствуйте!
Есть PostgreSQL 9.4, там таблица с колонкой типа Circle. В ней круги где xy это географические координаты.
Необходимо находить все строки где точка будет входить в этот Circle.
Все предельно просто, но не могу понять, как задавать радиус для Circle если изначально он у меня в метрах.
Гуглил, везде примеры на Postgis с мощными решениями которые учитывают кривизну земли и тп. У меня радиусы будут в пределах нескольких километров, поэтому такой мощи не надо, охото все решить средствами из коробки без установки плагинов.
furyon если радиус в метрах - то и координаты в метрах. Если радиус в сантиметрах, то и координаты в сантиметрах.
"xy это географические координаты"
Ну рискну предположить, что под "географическими координатами" вы имеете в виду WGS84. Вот формула для нахождения расстояния между двумя точками на сфере (раз вам высокая точность не нужна, достаточно будет предположить, что Земля - это сфера): https://en.wikipedia.org/wiki/Haversine_formula Радиус Земли возьмите равным 6 371 000 м.
Станислав Макаров: хм.., неужели для такой тривиальной задачи нет решения проще, lat long у меня из яндекс карт. Думал есть чтото нативное, пытаюь разобраться с earthdistance в postgres, может это то что мне надо?
furyon для вашей тривиальной задачи нет простого решения, потому что ваша задача не такая уж тривиальная. Вернее, она тривиальная, но никак не простая. Я не случайно сказал "рискну предположить" про WGS84. Например, если бы вы получали данные от ГЛОНАСС, то (вы не поверите), там используется другая система координат с другими (!) параметрами земного эллипсоида.
Т.к. людям обычно нужна определенная точность в расчетах, очевидно, никто не посчитал нужным "захардкодить" в постгрес одну-единственную систему координат, чтобы ей пользоваться. Поэтому вам и нужно считать самостоятельно. Вот в PostGIS достаточно функций для работы с географическими координатами, но большинство из них так или иначе учитывают систему координат.
Станислав Макаров: спасибо за ответы, пока что решился поставить "earthdistance", вроде заработало, но я совсем не представляю как это по скорости будет. Выглядит примерно вот так: earth_box(ll_to_earth(lat, long), radius) @> ll_to_earth($lat, $long)