#mysql #latitude-longitude #point
#mysql #широта-долгота #точка
Вопрос:
У меня есть таблица в моей базе данных MySQL под названием house
.
В house
таблице есть пара текстовых столбцов, называемых latitude
и longitude
.
Я добавил новый столбец с именем coords
, типа point
— http://dev.mysql.com/doc/refman/5.0/en/gis-class-point.html
Как бы мне переместить значения latitude
и longitude
в новый coords
столбец?
Комментарии:
1. Этот вопрос и некоторые ответы становятся устаревшими — в InnoDB теперь есть SPATIAL и ST_DISTANCE_SPHERE().
Ответ №1:
Предполагая, что вам нужен SPATIAL
индекс для этого столбца:
ALTER TABLE mytable ADD coords Point;
UPDATE mytable
SET coords = Point(lon, lat);
ALTER TABLE mytable MODIFY coords POINT NOT NULL;
CREATE SPATIAL INDEX sx_mytable_coords ON mytable(coords);
Если вы этого не сделаете, вы можете пропустить последние два шага.
Обновить:
В более ранних версиях MySQL
вам нужно было бы заполнять Point
столбцы с помощью WKT
:
UPDATE mytable
SET coords = GeomFromText(CONCAT('POINT (', lon, ' ', lat, ')'))
Комментарии:
1. Вторая команда, похоже, не переводит значения в координаты. Я получаю эту ошибку: не удается получить объект geometry из данных, которые вы отправляете в поле GEOMETRY
2. @cannyboy: какую версию
MySQL
вы используете? Можетlat
иlon
бытьNULL
?3. MySQL 5.0.45. текстовые столбцы широты и долготы не равны нулю.
4. @Quassnoi У вас неправильный порядок. Это
POINT(long, lat)
. Смотрите dev.mysql.com/doc/refman/5.7/en/gis-class-point.html . GeomFromText также является избыточным в последних версиях MySQL.5. @aroth Это имеет значение, по крайней мере, исходя из моего личного опыта. Работа с такими функциями, как
ST_Contains
иST_Distance
, привела к нечетным результатам, когда я сохранил точечные данные какlat, long
.
Ответ №2:
Версия MySQL 5.5.8
Мои широта и долгота имеют тип float. Для обновления существующих строк…
UPDATE table_name SET coord = POINT(longitude_field, latitude_field);
Что следует учитывать, если вы собираете данные и вам нужно сохранить широту и долготу отдельно, в соответствующих столбцах, я предлагаю добавить триггер в вашу таблицу
CREATE DEFINER=`username`@`localhost` TRIGGER `table_name`.`create_point_geom`
BEFORE INSERT ON database_name.table_name FOR EACH ROW
BEGIN
SET NEW.coord = POINT(NEW.longitude, NEW.latitude);
END;
Я собираю данные социальных сетей с географическими тегами и использую этот метод для добавления геометрии в свои таблицы.
Ответ №3:
Кратко:
UPDATE myTable SET coords = GeometryFromText( CONCAT( 'POINT(', lon, ' ', lat, ')' ) );
Обратите внимание, что ответ от Quassnoi содержит ошибку, поскольку правильный формат ввода — ТОЧКА (X Y), или в терминах ТОЧКИ земли (lon lat).
Обратите внимание, что вы можете отображать точки с помощью функций X () и Y (), подобных следующему примеру:
SELECT X( GeometryFromText( CONCAT( 'POINT(', 35, ' ', 60, ')' ) ) ) AS x, Y( GeometryFromText( CONCAT( 'POINT(', 35, ' ', 60, ')' ) ) ) AS y;
Комментарии:
1. Вы уверены, что это lon-lat .. все остальное в сети говорит об обратном
2. @Jonathan Это ТОЧКА (x, y). Посмотрите это доказательство
SELECT X( POINT( 3, 2 ) ) AS x
, вы получите обратно 3.
Ответ №4:
НАКОНЕЦ-ТО! Я смог исправить эти ошибки:
#3037 - Invalid GIS data provided to function st_geometryfromtext.
#1416 - Cannot get geometry object from data you send to the GEOMETRY field
Выполнив пользовательский SQL-запрос, в котором я указал точки lat и long. В моем случае строка SQL, которая это сделала, была:
UPDATE wp_wpgmza SET latlng = GeometryFromText( CONCAT( 'POINT(', 38.5775167, ' ', -121.4868583, ')' ) ) WHERE id = 63;