Так, є кращий спосіб. Потрібно використовувати просторовий індекс . Ці індекси організовують метадані про геометрії, щоб дуже швидко фільтрувати далекі геометрії, економлячи багато циклів процесора, уникаючи описаних вами обчислень. Вам не слід заважати впроваджувати один, оскільки всі основні реляційні бази даних надають тип просторової геометрії та індекси для їх використання.
Що ви хочете розглянути, це запити "в межах відстані" (запити щодо геометрії на певній відстані від якоїсь іншої геометрії). Це дуже стандартні та дуже вирішені проблеми, які можливі у всіх вищезазначених базах даних (та вбудованих у декілька):
- PostGIS:
ST_DWithin
- SQL Server:
STDistance
(Не ясно, що підтримується використання індексу у версії 3D-географії цієї функції)
- Oracle:
SDO_WITHIN_DISTANCE
(Це прямо не говорить про те, що це призведе до використання індексу. Я повторно перевіряю план запитів. Можливо, вам потрібно буде застосувати, SDO_FILTER
щоб отримати його для використання індексу.)
- MySQL: Я все ще з'ясовував це.
Обхід для запуску використання індексу
У гіршому випадку, коли у вас виникають проблеми з отриманням системою використання просторового індексу з цими запитами, ви можете додати додатковий фільтр. Ви повинні створити квадратне обмежувальне поле зі сторонами довжиною 2 * (відстань пошуку), орієнтованим у точці пошуку, і порівняти обмежувальні поля геометрії таблиці з цим, перш ніж перевірити фактичну відстань. Ось що робить PostGIS ST_DWithin
вище всередині все одно.
Відстань у ГІС
Хоча просторові індекси є фантастичним і абсолютно правильним рішенням вашої проблеми, обчислення відстані може логічно ускладнитися. Зокрема, вам потрібно потурбуватися про те, в якому проекції (в основному всі параметри системи координат) зберігаються ваші дані. Більшість двовимірних проекцій (такі речі, як кутові системи координат, як різні лати / довгі проекції) значно спотворюють довжину. Наприклад, проекція Web Mercator (використовувана Google, Bing та всіма іншими основними постачальниками базових карт) все більше розширює області та відстані, оскільки місце розташування стає далі від екватора . Можливо, я помиляюся, оскільки офіційно не навчаюся в ГІС, але найкраще, що я бачив для 2D-проекцій, - це деякі конкретні, які обіцяють правильні відстані відєдина, постійна точка у всьому світі. (Ні, для кожного запиту не практично використовувати різну проекцію; це зробить ваші індекси марними.)
Суть полягає в тому, що вам потрібно переконатися, що ваша математика є точною. Найпростіший спосіб зробити це з точки зору розвитку - використовувати кутові проекції (їх часто називають «географічними») і функції, які підтримують виконання математики за допомогою сфероїдної моделі, але ці обчислення трохи дорожчі, ніж 2D-аналоги а деякі БД можуть не підтримувати їх індексацію. Якщо ви можете отримати прийнятну ефективність, використовуючи їх, мабуть, це шлях. Іншим поширеним варіантом є регіональні прогнози (наприклад, зони UTM), які дають відстані та області досить близькі до виправлення, якщо ваші дані обмежені певною частиною світу. Що найкраще для вашої програми залежатиме від ваших конкретних вимог,
Це застосовується, навіть якщо ви не використовуєте вбудовані в просторові індекси. Ваші дані мають певні прогнози незалежно від того, яку технологію чи техніку ви використовуєте або використовуєте в майбутньому, і це вже впливає на будь-які запити та обчислення, які ви робите.