эффективно хранить геолокацию в MySQL - PullRequest
0 голосов
/ 12 июля 2011

прямо сейчас я храню long и lat как два десятичных индексированных поля в БД.
Мне интересно (без установки какого-либо движка Bizzare), если есть эффективный способ сделать это, поэтому индекс также поможет мне рассчитать расстояние. Пример запроса будет

достань мне все радиостанции в 10M от длинных X lat Y

Ответы [ 2 ]

0 голосов
/ 14 июля 2011

Вы хотите найти пространственный индекс или кривую заполнения пространства. Си уменьшает 2d сложность до 1d сложности. Это похоже на квадри и немного похоже на фрактал. Если вы не возражаете против формы и точного поиска, вы хотите удалить формулу harvesine, потому что вы можете просто искать плитку квадродерева. Конечно, вам нужна проекция Меркантора. Это, безусловно, самый быстрый метод. Я часто использую его с кривой Гильберта. Вы хотите найти блоговую кривую Гильберта для пространственного индекса Ника.

0 голосов
/ 13 июля 2011

Используйте тип данных float для широты и долготы.Что-то с более высокой точностью, скорее всего, чрезмерно инженерно.

Если ваши результаты не должны быть точными с точностью до метра или около того, тип данных с плавающей точкой имеет МНОГО точности для того, что вы пытаетесь сделать.Если вы работаете с разрешением менее метра, вам нужно будет узнать о проекциях (сфера-плоскость), таких как Универсальный поперечный Меркатор и Ламберт.

Когда вы начнете выполнять вычисления, имейте в виду, что одна минута (одна шестидесятая градуса) изменения широты (с севера на юг) составляет одну морскую милю.

Вотхорошая презентация от mySql о выполнении этого поиска.

http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

Оптимизация производительности заключается в создании индекса по широтам и, возможно, также по долготам, а затем выполните такой поиск(положительный radius)

where loctable.lat >=  (mylat-radius)
  and loctable.lat <=  (mylat+radius)
  and loctable.long >= (mylong-radius)
  and loctable.long <= (mylong+radius)
  and haversine_distance(mylat, mylong, loctable.lat, loctable.long) <= radius

Поиск ограничивающего прямоугольника.Этот ограничивающий прямоугольник имеет правильный размер по широте и, вероятно, слишком большой по долготе (если вы не возле экватора).Но это нормально, если поле слишком большое, потому что последняя строка избавляется от лишних совпадений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...