Короче говоря,
- Каким должен быть тип данных широты и долготы?
- Какую команду SQL я должен вызвать, чтобы получить первые 100 ближайших ресторанов, например?
Деталь:
У меня есть 100-килограммовая запись с широтой и долготой. Я вижу, что MySQL на самом деле поддерживает тип данных с именем point. Должен ли я использовать это вместо этого?
Поддерживает ли MySQL систему хранения KDTree http://en.wikipedia.org/wiki/File:KDTree-animation.gif
Лучше ли использовать точечный тип данных, а не обычный тип данных с плавающей точкой для хранения широты и долготы?
В конце концов я хочу найти такие вещи, как, например, первые 100 ресторанов, наиболее близкие к пунктам 105,6, и в моей базе данных много бизнесов и пунктов. Очевидно, что вычисление расстояния один за другим для каждой записи и для каждой точки будет O (n) и, следовательно, отстой.
Обратите внимание, что мне известно о более простом решении, описанном в разделе «Как сделать приложение вроде Yelp». Эффективно извлекайте информацию о расстоянии из базы данных и внедряйте ее самостоятельно для начала. Это хороший ответ.
Тем не менее, я думаю, что есть один крем ответа на урожай, который должен превзойти это право? На самом деле, сохранение местоположения на основе широты и долготы и поиск ближайшего к нему материала - очень распространенная проблема, и я ожидаю, что у mysql для этого будет специальный шаблон проектирования. Это имеет это?
Где я могу узнать больше об этом? Спасибо.
Ответы:
Что касается шаблонов проектирования, вопрос о Yelp - довольно стандартный материал.
Для более сложного ответа вам, вероятно, понадобится геопространственное расстояние. Вот это увлекательная PowerPoint об этой теме (и здесь есть версия ПДФ , что хорошо). Тем не менее, математика довольно некрасивая.
С их слайда:
Более длинный, более подробный ответ о геопространственном расстоянии в переполнении стека .
Но вы все еще хотите ограничить результаты широтой и долготой.
В конечном счете, я бы использовал тип данных POINT и использовал бы широту / долготу. В настоящее время нет способа определить расстояние между двумя точками, поэтому вам все равно придется хранить широту / долготу для этого расчета.
Одна последняя ссылка: вы также можете проверить этот поток SO относительно ускорения запросов с использованием пространственных индексов.
источник
Точечные типы данных в порядке; Вы можете просто вызвать X (координаты) / Y (координаты), чтобы получить значения широты / долготы.
Например:
источник
Найдите 100 ресторанов, ближайших к какой-либо координате: см. Эффективный код в http://mysql.rjweb.org/doc.php/latlng. Он включает в себя хранимую функцию для вычисления расстояния "большого круга".
источник