【问题标题】:Convert latitude/longitude fields into Geospatial Points将纬度/经度字段转换为地理空间点
【发布时间】:2014-02-06 22:51:49
【问题描述】:

我有一个带有纬度、经度和坐标列的表格。有超过 500,000 行。当前每一行的坐标字段都是空的。我需要做的是将纬度和经度转换为地理空间 POINT() 并将其放在坐标列中。这可能吗?

我知道POINTs可以这样插入:

INSERT INTO `myTable` (`coordinates`) VALUES (GeomFromText('POINT(50.2 51.6)'));

我基本上需要这样做,但通过从每一行中提取 latitudelongitude 的值。

【问题讨论】:

  • 纬度是50.2,经度是51.6吗?
  • @ganders 不,这只是一个例子。 FLOAT(10,6)类型有500,000个不同的经纬度点
  • 我要问的是,50.2 是否映射到纬度列,而 51.6 是否映射到经度列? (正如你所说,有 500,000 个条目)
  • @ganders 是的,这是正确的(对不起),纬度 - 经度
  • 你用的是什么版本的Mysql?

标签: mysql sql geospatial


【解决方案1】:

这是一个较老的问题,但我指出所有答案都是错误的(至少在 2019 年)纬度和经度必须与答案相反

改为:POINT(latitude,longitude)

必须是: POINT(longitude,latitude)

在Mysql 5.6及以后可以使用:

Update myTable
Set coordinates = POINT(longitude, latitude);

如果我们尝试类似:

SELECT ST_Distance_Sphere(
    POINT(13.1500000,99.9666700), 
    POINT(48.861105, 120.335337)
);

出现错误:

ERROR 1210 (HY000):st_distance_sphere 的参数不正确

因为我在答案POINT(latitude,longitude)中使用过like

但是如果我们尝试POINT(longitude,latitude):

SELECT ST_Distance_Sphere(
    POINT(99.9666700, 13.1500000), 
    POINT(120.335337, 48.861105)
);

结果是:

+--------------------------------------------+
| ST_Distance_Sphere(
        POINT(99.9666700, 13.1500000),
        POINT(120.335337, 48.861105)
    ) |
+--------------------------------------------+
|                                                                                      4389299.754585881 |
+--------------------------------------------+
1 row in set (0.00 sec)

【讨论】:

    【解决方案2】:

    一个 GeomFromText 需要一个字符串,你需要很多连接

    INSERT INTO myTable (coordinates)  
       SELECT GeomFromText(CONCAT('POINT(',ot.latitude, ' ', ot.longitude,')'))
        FROM otherTable ot;
    

    如果是将现有表的 latitudelongitude 列更新到新列 coordinates 中,请执行以下操作:

    UPDATE  myTable 
     SET coordinates =  GeomFromText(CONCAT('POINT(',latitude, ' ', longitude,')'));
    

    【讨论】:

    • 如果所有列都在同一个表中,使用“UPDATE”不是更好吗?
    • @jskidd3 如果纬度和经度在同一个表中,是的,进行更新。我不确定他们是不是。
    • 抱歉我的错,你能更新你的 SQL 来代表这个吗?
    • "您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,了解在第 2 行的 'longitude,')'))' 附近使用的正确语法"(对于更新查询)
    • @jskidd3 我正在以下表结构上进行测试,但没有收到您看到的 sql 错误:CREATE TABLE myTable2 (latitude float unsigned NOT NULL, @987654328 @float DEFAULT NULL,coordinatesgeometry DEFAULT NULL)
    【解决方案3】:

    这样的东西有用吗?

    Update myTable
    Set coordinates = GeomFromText('POINT(' + latitude + ' ' + longitude + ')')
    

    这是假设您的坐标列与您的纬度和经度存在于同一个表中。

    (记住这是 SqlServer/Tsql 语法)...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 2022-12-21
      相关资源
      最近更新 更多