Не так давно передо мной стояла задача о необходимости хранить географические координаты (долготу и широту) в БД. Для этих целей в MySQL есть замечательный тип данных — POINT. Он представляет собой структуру из нескольких полей.
Кроме того, к этому типу можно (и даже нужно) применять встроенные функции. Именно эти функции определяют, какие данные необходимо хранить: точку или линию, а может даже множество точек или множество линий. Разберем пример. Есть небольшая таблица в реляционной БД, назовем ее geo. И имеет она следующую структуру
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `place_name` varchar(40) NOT NULL,
- `coordinates` point NOT NULL
Для того чтобы создать такую таблицу, воспользуйтесь следующим 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
Для того чтобы вставить строку в таблицу, воспользуемся конструкцией INSERT
- INSERT INTO `geo` (`place_name`, `coordinates`) VALUES (‘Apremont’, PointFromText(‘POINT(49.2343503980067 2.52738212494082)’));
У этого типа есть один недостаток: данные нельзя просмотреть. Например в phpMyAdmin данные поля coordinates будут выглядеть вот так:
И для того чтобы получить долготу и широту, придется воспользоваться вот таким SQL-запросом:
- SELECT X( `coordinates` ) , Y( `coordinates` )
- FROM `geo`
- WHERE 1
- LIMIT 1
Остался последний нюанс. Если у Вас возникают проблемы при экспортировании данных таблицы в которой присутствуют поля типа POINT, а именно, если после экспорта данных координаты не отображаются, то это означает, что Вы неправильно сделали экспорт. Наверняка Вы сделали экспорт в текст, затем скопировали его и вставили как SQL запрос. Нужно сделать экспорт в файл, а затем сделать импорт из этого файла.