我正在尝试了解地理空间字段在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)
我做错了什么?
答案 0 :(得分:0)
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;
答案 1 :(得分:0)
正如@EvanCarroll所回答的,MySQL并没有SRID意识(目前)。但是如果你需要它并使用PHP,我发现了一个类来转换SRID' s proj4php之间的坐标(免责声明:我与这个项目没有关系)并且工作得很完美。