【问题标题】:Convert lat/lng pairs using GeomFromText('POINT(1 1)') and insert in another column使用 GeomFromText('POINT(1 1)') 转换 lat/lng 对并插入另一列
【发布时间】:2011-08-18 22:54:51
【问题描述】:

在我之前的问题Search for range Latitude/Longitude coordinates我的解决方案是创建下表。

mysql> select * from spatial_table where MBRContains(GeomFromText('LINESTRING(9 9, 11 11)'), my_spots);
+------+---------------------------------+
| id   | my_spots    | my_polygons       |
+------+-------------+-------------------+
|    1 |  $@      $@     $@      $@      |
+------+-------------+-------------------+

现在我需要将下表中现有的 lat/lng 对转换并移动到 spatial_table。我将如何构建我的查询来实现这一点?我目前正在使用下面的查询来插入。

mysql> insert into spatial_table values (1, GeomFromText('POINT(1 1)'), GeomFromText('POLYGON((1 1, 2 2, 0 2, 1 1))'));
Query OK, 1 row affected (0.00 sec)

mysql> insert into spatial_table values (1, GeomFromText('POINT(10 10)'), GeomFromText('POLYGON((10 10, 20 20, 0 20, 10 10))') );
Query OK, 1 row affected (0.00 sec)

现有表:

+-------------+---------+--------+-----------+----- ------+-------------+--------------+
| location_id | country | region |  city     | latitude   | longitude   |     name     |
+=============|=========|========|===========|============|=============|==============|
|   316625    |   US    |   CA   | Santa Cruz|  37.044799 | -122.102096 |  Rio Theatre |
+-------------+---------+--------+-----------+------------+-------------+--------------+    

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这是成功的秘诀 :) 我原来的表:

    mysql> describe gls;
    +-------------+--------------+------+-----+---------+-------+
    | Field       | Type         | Null | Key | Default | Extra |
    +-------------+--------------+------+-----+---------+-------+
    | location_id | int(255)     | NO   | PRI | 0       |       |
    | country     | varchar(255) | NO   |     |         |       |
    | region      | varchar(255) | NO   |     |         |       |
    | city        | varchar(255) | NO   |     |         |       |
    | latitude    | float(13,10) | NO   |     |         |       |
    | longitude   | float(13,10) | NO   |     |         |       |
    +-------------+--------------+------+-----+---------+-------+
    8 rows in set (0.00 sec)
    

    第 1 步:添加新的 POINT 列

    mysql> alter table gls add my_point point;
    Query OK, 247748 rows affected (4.77 sec)
    Records: 247748  Duplicates: 0  Warnings: 0
    

    第 2 步:使用 lat/lng 字段中的值更新 my_point。

    UPDATE gls SET my_point = PointFromText(CONCAT('POINT(',gls.longitude,' ',gls.latitude,')'));
    

    第 3 步:检查

    mysql> select aswkt(my_point) from gls where city='Santa Cruz';
    +--------------------------------------+
    | aswkt(my_point)                      |
    +--------------------------------------+
    | POINT(-122.1020965576 37.0447998047) |
    | POINT(-66.25 -12.2833003998)         |
    | POINT(-2.3499999046 42.6666984558)   |
    +--------------------------------------+
    

    【讨论】:

    【解决方案2】:

    假设你有一张这样的桌子:

    mysql> select * from spatial_table;
    +------+---------------------------+-----------------------------------------------------------------------------------+---------+--------+
    | id   | my_spots                  | my_polygons                                                                       | lon     | lat    |
    +------+---------------------------+-----------------------------------------------------------------------------------+---------+--------+
    |    1 |              ??      ??   |                    ??      ??       @       @               @      ??      ??     | -122.11 | -37.11 |
    |    1 |              $@      $@ |                    $@      $@      4@      4@              4@      $@      $@ | -122.11 | -37.11 |
    +------+---------------------------+-----------------------------------------------------------------------------------+---------+--------+
    2 rows in set (0.00 sec)
    

    如果你想用 lon lat 值创建一个几何列(仅作为点,其他类型几何的语法略有不同),你可以这样做:

    mysql> alter table spatial_table add column (go_slugs geometry);
    

    这是一种几何类型,如果都是单个位置,您可以将列类型设为point。然后只需更新新列:

    mysql> update spatial_table set go_slugs = point(lon, lat);
    

    使用 aswkt 函数获取人类可读数据以确认这是正确的:

    mysql> select aswkt(go_slugs) from spatial_table;
    +-----------------------------------------------+
    | aswkt(go_slugs)                               |
    +-----------------------------------------------+
    | POINT(-122.11000061035156 -37.11000061035156) |
    | POINT(-122.11000061035156 -37.11000061035156) |
    | POINT(-123.4000015258789 37.79999923706055)   |
    +-----------------------------------------------+
    3 rows in set (0.00 sec)
    

    【讨论】:

    • 谢谢。您的指导为我开辟了许多新的道路。正是我加入 SO 的原因。有时很难清楚地表达我的需求,我非常感谢其他人能够理解我的问题。
    • 这可以完美地使用来自 MySQL 的数据在地理服务器中显示图层。谢谢!
    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    相关资源
    最近更新 更多