【问题标题】:MySQL Spatial - Convert Point from EPSG 4326 to 25831MySQL Spatial - 将点从 EPSG 4326 转换为 25831
【发布时间】:2017-11-28 11:38:00
【问题描述】:

我正在尝试了解地理空间字段在 MySQL (5.7.20) 中的工作原理。

我有一张这样的桌子:

CREATE TABLE `geom` (
  `g` geometry NOT NULL,
  SPATIAL KEY `g` (`g`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

我已插入此信息:

INSERT INTO geom VALUES (ST_PointFromText('POINT(2.427475 41.534244)', 4326));
INSERT INTO geom VALUES (ST_PointFromText('POINT(2.428602 41.533272)', 4326));
INSERT INTO geom VALUES (ST_PointFromText('POINT(2.430147 41.534075)', 4326));
INSERT INTO geom VALUES (ST_PointFromText('POINT(2.429321 41.535191)', 4326));

当我跑步时:

SELECT * FROM geom;

我得到的只是带有 BLOB 字段的四行。

当我跑步时:

SELECT ST_AsText(g) FROM geom;

我得到的和我插入的一样:

POINT(2.429321 41.535191)
POINT(2.430147 41.534075)
POINT(2.428602 41.533272)
POINT(2.427475 41.534244)

现在我正在尝试将输出坐标从 EPSG:4326 转换为 EPSG:25831。

我找到了"MySQL Spatial - Convert from SRID 31287 to 4326" ,并在选择而不是插入中尝试了它,但更改了 SRID:

SELECT ST_AsText(g), ST_SRID(g), ST_AsText(ST_GeomFromText(ST_AsText(g), 25831)), ST_SRID(ST_GeomFromText(ST_AsText(g), 25831)) FROM geom;

我得到:

ST_AsText(g)                ||  ST_SRID(g)  ||  ST_AsText(ST_GeomFromText(ST_AsText(g), 25831)) ||  ST_SRID(ST_GeomFromText(ST_AsText(g), 25831))
POINT(2.429321 41.535191)   ||  4326        ||  POINT(2.429321 41.535191)                       ||  25831
POINT(2.430147 41.534075)   ||  4326        ||  POINT(2.430147 41.534075)                       ||  25831
POINT(2.428602 41.533272)   ||  4326        ||  POINT(2.428602 41.533272)                       ||  25831
POINT(2.427475 41.534244)   ||  4326        ||  POINT(2.427475 41.534244)                       ||  25831

所以ST_AsText(ST_GeomFromText(ST_AsText(g), 25831)) 的结果得到了与插入值相同的坐标。

我想要得到的是从 EPSG:4326 到 EPSG:25831 的转换。类似于(或至少是坐标):

POINT(452240.56 4598224.20)
POINT(452333.86 4598115.66)
POINT(452463.33 4598203.96)
POINT(452395.25 4598328.31)

我做错了什么?

【问题讨论】:

    标签: mysql spatial coordinate-systems srid


    【解决方案1】:

    MySQL doesn't have any SRID awareness. 所以这根本不可能。在它支持任何 SRID 的范围内,如果特征具有不同的 SRID,它只会拒绝计算。

    您想要的是 PostGIS,它使用 ST_Transform 就可以做到这一点。作为奖励,您可以获得更好的数据库。

    SELECT ST_Transform(pt,31287)
    FROM ST_SetSRID(ST_MakePoint(2.430147,41.534075), 4326) AS pt;
    

    【讨论】:

      【解决方案2】:

      正如@EvanCarroll 回答的那样,MySQL 没有 SRID 意识(目前)。但是如果你需要它并且正在使用 PHP,我已经找到了一个类来转换 SRID 的 proj4php 之间的坐标(免责声明:我与这个项目无关)并且工作完美。

      【讨论】:

        猜你喜欢
        • 2021-08-28
        • 1970-01-01
        • 2014-04-27
        • 2021-11-10
        • 2021-08-09
        • 2016-09-28
        • 2017-10-14
        • 1970-01-01
        • 2015-12-25
        相关资源
        最近更新 更多