将纬度/经度文本列移动到“点”类型列
Posted
技术标签:
【中文标题】将纬度/经度文本列移动到“点”类型列【英文标题】:Moving lat/lon text columns into a 'point' type column 【发布时间】:2011-08-11 00:06:31 【问题描述】:我的 mysql 数据库中有一个名为 house
的表。
在house
表中,有几个名为latitude
和longitude
的文本列。
我添加了一个名为coords
的新列,类型为point
- http://dev.mysql.com/doc/refman/5.0/en/gis-class-point.html
如何将latitude
和longitude
值移动到新的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:你使用的是哪个版本的MySQL
? lat
和lon
可以是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_Contains
和ST_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 或将数据移动到一种列文本数据类型
Scikit Learn 为 70 万个具有 2 列(纬度和经度)的数据点实施 DBSCAN 消耗 128GB+ RAM。如何解决这个内存问题?