Используйте тип данных 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
Поиск ограничивающего прямоугольника.Этот ограничивающий прямоугольник имеет правильный размер по широте и, вероятно, слишком большой по долготе (если вы не возле экватора).Но это нормально, если поле слишком большое, потому что последняя строка избавляется от лишних совпадений.