代码之家  ›  专栏  ›  技术社区  ›  Radiaktive

MySQL Spatial-将点从EPSG 4326转换为25831

  •  0
  • Radiaktive  · 技术社区  · 7 年前

    我试图学习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" 并在select而不是insert中进行了尝试,但更改了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)
    

    我做错了什么?

    2 回复  |  直到 7 年前
        1
  •  0
  •   Evan Carroll    7 年前

    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
  •  0
  •   Radiaktive    7 年前

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