Как использовать геопространственные расширения MySQL со сферической геометрией - PullRequest
5 голосов
/ 08 января 2011

Я хотел бы хранить тысячи точек широты / долготы в базе данных MySQL. Мне удалось настроить таблицы и добавить данные с использованием геопространственных расширений, где столбец 'координата' - это точка (широта, долгота).

Проблема:

Я хочу быстро найти 'N' ближайших записей к широте 'X' градусов и долготе 'Y' градусов. Поскольку функция Distance () еще не была реализована, я использовал функцию GLength () для вычисления расстояния между (X, Y) и каждой из записей, сортировки по возрастанию расстояния и ограничения на результаты «N». Проблема в том, что это не вычисление кратчайшего расстояния со сферической геометрией. Это означает, что если Y = 179,9 градуса, список ближайших записей будет включать только долготы, начинающиеся с 179,9 и уменьшающиеся, даже если существуют более близкие записи с долготами, увеличивающимися с -179,9.

Как обычно обрабатывать разрыв по долготе при работе со сферическими геометриями в базах данных? Для этого должно быть простое решение, но я просто должен искать неправильную вещь, потому что я не нашел ничего полезного.

Должен ли я просто забыть функцию GLength () и создать свою собственную функцию для вычисления углового разделения? Если я сделаю это, все еще будет быстро и использовать преимущества геопространственных расширений?

Спасибо!

Josh


UPDATE:

Это именно то, что я описываю выше. Однако это только для SQL Server. Очевидно, что SQL Server имеет типы данных Geometry и Geography. География делает именно то, что мне нужно. Есть ли что-то похожее в MySQL?

1 Ответ

4 голосов
/ 09 января 2011

Как обычно обрабатывать разрыв по долготе при работе со сферическими геометриями в базах данных?

Не многие люди используют MySQL для этого, потому что его геопространственные расширения на самом деле не работают.

Из документов: " Все вычисления выполняются с учетом евклидовой (плоской) геометрии. "

Решение обычно состоит в том, чтобы бросить свой собственный .

Кроме того, вы можете подделать его - если ваши расстояния меньше 500 миль или около того, тогда вы можете рассматривать широту и долготу как прямоугольные координаты и просто использовать евклидову формулу расстояния (sqrt(a^2 + b^2)).

...