Сохранение значений широты и долготы в MySQL с использованием типа пространственной точки

Используемые технологии: MySQL 5.1 и PHP 5.3

Я просто разрабатываю новую базу данных для сайта, который пишу. Я ищу лучший способ хранения значений Lat и Lng.

Раньше я использовал DECIMAL и использовал PHP / MySQL select в форме:

SQRT(POW(69.1 * (fld_lat - ( $lat )), 2) + POW(69.1 * (($lon) - fld_lon) * COS(fld_lat / 57.3 ), 2 )) AS distance

, чтобы найти ближайшие совпадающие места.

Начав читать больше о новых технологиях, мне интересно, следует ли мне использовать Spatial Расширения. http://dev.mysql.com/doc/refman/5.1/en/geometry-property-functions.html

Однако на местах информации довольно мало, и возник вопрос о том, как хранить данные. Могу ли я теперь использовать POINT как тип данных вместо DECIMAL?

Кроме того, после сохранения в качестве POINT легко ли просто получить из него значения Lat Lng на случай, если я захочу нанести его на карту, или я должен дополнительно снова сохранить широту и длину как DECIMALS?

Я знаю, что мне следует использовать PostGIS, поскольку в большинстве сообщений здесь говорится, что я просто не хочу изучать новую БД!

Продолжение

Я был играть с новым типом ТОЧКИ. Мне удалось добавить значения Lat Lng, используя следующее:

INSERT INTO spatialTable (placeName, geoPoint) VALUES( "London School of Economics", GeomFromText( 'POINT(51.514 -0.1167)' ));

Затем я могу получить значения Lat и Lng обратно из базы данных, используя:

SELECT X(geoPoint), Y(geoPoint) FROM spatialTable;

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

SELECT
 placeName,
 ROUND(GLength(
  LineStringFromWKB(
   LineString(
    geoPoint, 
    GeomFromText('POINT(52.5177, -0.0968)')
  )
  )
))
AS distance
FROM spatialTable
ORDER BY distance ASC;

В этом примере geoPoint - это ТОЧКА, введенная в базу данных с помощью INSERT выше.

GeomFromText (' POINT (52.5177, -0.0968) ' - это значение Lat Lng, от которого я хочу вычислить расстояние.

Дополнительные сведения

Я довольно глупо вставил ROUND часть SQL, не особо задумываясь Вытаскивая это, я получаю:

SELECT
placeName,
(GLength(
LineStringFromWKB(
  LineString(
    geoPoint, 
    GeomFromText('POINT(51.5177 -0.0968)')
  )
 )
))
AS distance
FROM spatialTable
ORDER BY distance ASC

Что, кажется, дает мне правильные расстояния, которые мне нужны.

Полагаю, единственное, на что сейчас нужно ответить, - это какие-либо мысли о том, усложняю ли я себе жизнь, используя Spatial сейчас, или готовлюсь к будущему ...

36
задан bateman_ap 15 February 2011 в 17:42
поделиться