Тип данных POINT в MySQL

Тип данных POINT в MySQL
Не так давно передо мной стояла задача о необходимости хранить географические координаты (долготу и широту) в БД. Для этих целей в 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 будут выглядеть вот так: mysql-point-data
И для того чтобы получить долготу и широту, придется воспользоваться вот таким SQL-запросом:
[sql] SELECT X( `coordinates` ) , Y( `coordinates` )
FROM `geo`
WHERE 1
LIMIT 1
[/sql]

Остался последний нюанс. Если у Вас возникают проблемы при экспортировании данных таблицы в которой присутствуют поля типа POINT, а именно, если после экспорта данных координаты не отображаются, то это означает, что Вы неправильно сделали экспорт. Наверняка Вы сделали экспорт в текст, затем скопировали его и вставили как SQL запрос. Нужно сделать экспорт в файл, а затем сделать импорт из этого файла.

Stas Kuryan

Web developer. Перфекционист в написании кода.

3 комментария

  1. Pingback:Zend Framework: работа с полем типа POINT в MySQL » Блог Stafox'a

  2. Эдуард     

    Спасибо!

    Если требуется выбрать все данные и при этом получить распакованные поля из POINT (чтобы не перечислять все поля в запросе), можно поле coordinates распаковать примерно так:
    SELECT *
    FROM `geo`
    WHERE 1
    LIMIT 1

    $uncoord = unpack(‘Lpadding/corder/Lgtype/dlatitude/dlongitude’, $query[‘coordinates’]);

    $xcoord = $uncoord[‘latitude’];
    $ycoord = $uncoord[‘longitude’];

  3. irmaseo.ru     

    Полезная информация, спасибо

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *