Да, есть лучший способ. Вам нужно использовать пространственный индекс . Эти индексы организуют метаданные о геометриях, чтобы очень быстро отфильтровывать удаленные геометрии, сохраняя много циклов ЦП, избегая описанных вами вычислений. Вы не должны беспокоиться о его реализации самостоятельно, так как все основные реляционные базы данных предоставляют тип пространственной геометрии и индексы, соответствующие им.
То, на что вы хотите обратить внимание, это запросы «на расстоянии» (запросы на геометрию на определенном расстоянии от некоторой другой геометрии). Это очень стандартная и очень решаемая проблема, которая возможна во всех вышеупомянутых базах данных (и встроена в несколько):
- PostGIS:
ST_DWithin
- SQL Server:
STDistance
(непонятно, поддерживается ли использование индекса для версии 3D-географии этой функции)
- Oracle:
SDO_WITHIN_DISTANCE
(Это явно не говорит о том, что это вызовет использование индекса. Я бы дважды проверил план запроса. Возможно, вам придется применить a, SDO_FILTER
чтобы заставить его использовать индекс.)
- MySQL: все еще выясняю это.
Обходной путь для запуска использования индекса
В худшем случае, когда у вас возникнут проблемы с тем, чтобы система использовала пространственный индекс с этими запросами, вы можете добавить дополнительный фильтр. Вы бы создали квадратную ограничивающую рамку со сторонами длины 2 * (расстояние поиска), центрированными в вашей точке поиска, и сравнили ограничивающие прямоугольники геометрии таблицы с этим перед проверкой фактического расстояния. Это то, что PostGIS ST_DWithin
выше делает внутренне в любом случае.
Расстояние в ГИС
В то время как пространственные индексы являются фантастическим и абсолютно правильным решением вашей проблемы, расчет расстояния может оказаться логически сложным. В частности, вам нужно беспокоиться о том, в какой проекции (в основном все параметры системы координат) хранятся ваши данные. Большинство 2D проекций (кроме угловых систем координат, таких как различные широты / долготы) значительно искажают длину. Например, проекция Web Mercator (используемая Google, Bing и всеми другими крупными поставщиками базовых карт) расширяет области и расстояния по мере удаления от экватора . Я могу ошибаться, так как я не получил официального образования в области ГИС, но лучшее, что я видел для 2D-проекций, это некоторые конкретные, которые обещают правильные расстояния отединая, постоянная точка во всем мире. (Нет, непрактично использовать разные проекции для каждого запроса; это сделало бы ваши индексы бесполезными.)
Суть в том, что вам нужно убедиться, что ваша математика точна. Самым простым способом сделать это с точки зрения разработки является использование угловых проекций (их часто называют «географическими») и функций, которые поддерживают выполнение математических операций с использованием сфероидальной модели, но эти вычисления немного дороже, чем в 2D-аналогах. и некоторые БД могут не поддерживать их индексацию. Если вы можете получить приемлемую производительность, используя их, тем не менее, это, вероятно, путь. Другим распространенным вариантом являются региональные проекции (например, зоны UTM), в которых расстояния и площади достаточно близки к корректным, если ваши данные ограничены определенной частью мира. Что лучше для вашего приложения, будет зависеть от ваших конкретных требований,
Это применимо, даже если вы не используете встроенные пространственные индексы. Ваши данные имеют некоторый прогноз независимо от того, какую технологию или технику вы используете в будущем или будете использовать в будущем, и это уже влияет на любые ваши запросы и вычисления.