将纬度/经度文本列移动到“点”类型列

Posted

技术标签:

【中文标题】将纬度/经度文本列移动到“点”类型列【英文标题】:Moving lat/lon text columns into a 'point' type column 【发布时间】:2011-08-11 00:06:31 【问题描述】:

我的 mysql 数据库中有一个名为 house 的表。

house 表中,有几个名为latitudelongitude 的文本列。

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

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

【问题讨论】:

【参考方案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 中,您需要使用WKT 填充Point 列:

UPDATE  mytable
SET     coords = GeomFromText(CONCAT('POINT (', lon, ' ', lat, ')'))

【讨论】:

第二个命令似乎没有将值移动到坐标中。我收到此错误:无法从您发送到 GEOMETRY 字段的数据中获取几何对象 @cannyboy:你使用的是哪个版本的MySQLlatlon可以是NULL吗? MySQL 5.0.45。纬度和经度文本列不为空。 @Quassnoi 您的订单有误。它是POINT(long, lat)。见dev.mysql.com/doc/refman/5.7/en/gis-class-point.html。 GeomFromText 在最近的 MySQL 版本中也是多余的。 @aroth 这确实很重要,至少从我的轶事经验来看。当我将点数据存储为lat, long 时,使用ST_ContainsST_Distance 等函数会产生奇怪的结果。【参考方案2】:

MySQL 5.5.8 版

我的纬度和经度是浮点型。要更新现有行...

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 的回答是错误的,因为正确的输入格式是 POINT(XY),或地球 POINT(lon lat)。

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

SELECT X( GeometryFromText( CONCAT( 'POINT(', 35, ' ', 60, ')' ) ) ) AS x, Y( GeometryFromText( CONCAT( 'POINT(', 35, ' ', 60, ')' ) ) ) AS y;

【讨论】:

你确定它是 lon-lat.. 网上的其他一切都说相反 @Jonathan 这是 POINT(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 查询,我在其中指出了纬度和经度点。就我而言,执行此操作的 SQL 字符串是:

UPDATE wp_wpgmza SET latlng = GeometryFromText( CONCAT( 'POINT(', 38.5775167, ' ', -121.4868583, ')' ) ) WHERE id = 63;

【讨论】:

以上是关于将纬度/经度文本列移动到“点”类型列的主要内容,如果未能解决你的问题,请参考以下文章

移动谷歌地图标记点时用纬度和经度更新数据库

使用连接表选择组 concat 或将数据移动到一种列文本数据类型

如何将纬度/经度对转换为 PostGIS 地理类型?

无法将 SSMS 中的列转换为数据类型地理

Scikit Learn 为 70 万个具有 2 列(纬度和经度)的数据点实施 DBSCAN 消耗 128GB+ RAM。如何解决这个内存问题?

从 TimezoneFinder() 创建新的“时区”列,将经度和纬度列作为 PySpark 中的输入