MySQL: простой гео / пространственный запрос - PullRequest
1 голос
/ 02 февраля 2012

Я изучал, как наилучшим образом извлечь подмножества данных о местоположении из базы данных MySQL.В этом ответе были ссылки на многие обнадеживающие статьи, но ни в одной из них не было конкретных, простых примеров:

База данных: лучший способ производительности для запроса данных о географическом местоположении?


Допустим, у меня есть база данных с таблицей PLACES.МЕСТА может содержать миллионы записей.Каждая строка имеет типы столбцов LAT, LON и NAME.

Я хотел бы сформировать функциональный оператор из следующего полупсевдокода:

Select * from PLACES where distance((LAT, LON), (givenLat, givenLon)) < 100 meters;
return *[NAME];

Это довольно просто, но хотя яЯ широко использовал MySQL. Я никогда не использовал пространственные расширения.Я готов работать с ними, но я также готов написать пользовательские функции, если это будет быстрее.Вышеупомянутый запрос буквально то, что мне нужно произвести.Любые указатели помимо документов были бы очень полезны, спасибо.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2012

Сергей Беннер заслуживает благодарности за этот ответ (я просто хочу закрыть вопрос). Его комментарий выше ссылается на несколько выдающихся и функциональных ресурсов по теме. Я также обнаружил этот ресурс, который отлично работает, если вы работаете на iOS:

http://www.thismuchiknow.co.uk/?p=71

0 голосов
/ 05 февраля 2012

Хотя я не владею геопространственными расширениями mysql, я бы посоветовал вам прочитать эту презентацию http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL, поскольку в ней содержится интересное предложение о функции географического расстояния, которое я использовал вполне удовлетворительно.

SELECT destination.*,
3956 * 2 * ASIN(SQRT( POWER(SIN((orig.lat - dest.lat) *  pi()/180 / 2), 2) +COS(orig.lat * pi()/180) * COS(dest.lat * pi()/180) * POWER(SIN((orig.lon -dest.lon) * pi()/180 / 2), 2) ))
asdistanceFROM users destination, users originWHERE origin.id=userid
and destination.longitudebetween lon1 and lon2 and destination.latitudebetween lat1 and lat2 
...