Не так давно передо мной стояла задача о необходимости хранить географические координаты (долготу и широту) в БД. Для этих целей в MySQL есть замечательный тип данных — POINT. Он представляет собой структуру из нескольких полей.
Кроме того, к этому типу можно (и даже нужно) применять встроенные функции. Именно эти функции определяют, какие данные необходимо хранить: точку или линию, а может даже множество точек или множество линий. Разберем пример. Есть небольшая таблица в реляционной БД, назовем ее geo. И имеет она следующую структуру
[sql] `id` int(11) NOT NULL AUTO_INCREMENT,
`place_name` varchar(40) NOT NULL,
`coordinates` point NOT NULL
[/sql]
Для того чтобы создать такую таблицу, воспользуйтесь следующим SQL-запросом:
[sql] CREATE TABLE IF NOT EXISTS `geo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`place_name` varchar(40) NOT NULL,
`coordinates` point NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
[/sql]
Для того чтобы вставить строку в таблицу, воспользуемся конструкцией INSERT
[sql] INSERT INTO `geo` (`place_name`, `coordinates`) VALUES (‘Apremont’, PointFromText(‘POINT(49.2343503980067 2.52738212494082)’));
[/sql]
У этого типа есть один недостаток: данные нельзя просмотреть. Например в phpMyAdmin данные поля coordinates будут выглядеть вот так:
И для того чтобы получить долготу и широту, придется воспользоваться вот таким SQL-запросом:
[sql] SELECT X( `coordinates` ) , Y( `coordinates` )
FROM `geo`
WHERE 1
LIMIT 1
[/sql]
Остался последний нюанс. Если у Вас возникают проблемы при экспортировании данных таблицы в которой присутствуют поля типа POINT, а именно, если после экспорта данных координаты не отображаются, то это означает, что Вы неправильно сделали экспорт. Наверняка Вы сделали экспорт в текст, затем скопировали его и вставили как SQL запрос. Нужно сделать экспорт в файл, а затем сделать импорт из этого файла.
Pingback:Zend Framework: работа с полем типа POINT в MySQL » Блог Stafox'a
Спасибо!
Если требуется выбрать все данные и при этом получить распакованные поля из POINT (чтобы не перечислять все поля в запросе), можно поле coordinates распаковать примерно так:
SELECT *
FROM `geo`
WHERE 1
LIMIT 1
$uncoord = unpack(‘Lpadding/corder/Lgtype/dlatitude/dlongitude’, $query[‘coordinates’]);
$xcoord = $uncoord[‘latitude’];
$ycoord = $uncoord[‘longitude’];
Полезная информация, спасибо