将lat/lon文本列移动到"point"类型列中

can*_*boy 20 mysql point latitude-longitude

我的MySQL数据库中有一个名为的表house.

house表格中,有几个名为latitude和的文本列longitude.

我添加了一个名为新列coords的类型,point- http://dev.mysql.com/doc/refman/5.0/en/gis-class-point.html

如何将latitudelongitude值移动到新coords列中?

Qua*_*noi 36

假设您想要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);
Run Code Online (Sandbox Code Playgroud)

如果不这样做,则可以省略最后两个步骤.

更新:

在早期版本中MySQL,您需要Point使用WKT以下命令填充列:

UPDATE  mytable
SET     coords = GeomFromText(CONCAT('POINT (', lon, ' ', lat, ')'))
Run Code Online (Sandbox Code Playgroud)

  • @Quassnoi你的订单有误.它是'POINT(long,lat)`.请参阅http://dev.mysql.com/doc/refman/5.7/en/gis-class-point.html.在最近的MySQL版本中,GeomFromText也是多余的. (7认同)
  • @aroth确实很重要,至少从我的轶事经验来看。当我将点数据存储为“ lat,long”时,使用诸如ST_Contains和ST_Distance之类的函数会产生奇怪的结果。 (2认同)

小智 12

MySQL版本5.5.8

我的纬度和经度是float类型.要更新现有行...

UPDATE table_name SET coord = POINT(longitude_field, latitude_field);
Run Code Online (Sandbox Code Playgroud)

需要考虑的事项,如果你正在收集数据并需要分别保存纬度和经度,在各自的列中,我建议在你的表中添加一个触发器

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;
Run Code Online (Sandbox Code Playgroud)

我收集地理标记的社交媒体数据,我使用此方法向我的表添加几何.


Jos*_*ust 8

简明:

UPDATE myTable SET coords = GeometryFromText( CONCAT( 'POINT(', lon, ' ', lat, ')' ) );
Run Code Online (Sandbox Code Playgroud)

请注意,Quassnoi的答案是错误的,因为正确的输入格式是POINT(XY),或者是地球POINT(lon lat).

请注意,您可以通过X()和Y()函数显示点,如下例所示:

SELECT X( GeometryFromText( CONCAT( 'POINT(', 35, ' ', 60, ')' ) ) ) AS x, Y( GeometryFromText( CONCAT( 'POINT(', 35, ' ', 60, ')' ) ) ) AS y;
Run Code Online (Sandbox Code Playgroud)