MySQL Spatial - Convert Point from EPSG 4326 to 25831

2.2k views Asked by At

I'm trying to learn how geospatial fields work in MySQL (5.7.20).

I have a table like:

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

I had inserted this info:

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));

When I run:

SELECT * FROM geom;

All I get is four rows with a BLOB field.

When I run:

SELECT ST_AsText(g) FROM geom;

I get the same as I had inserted:

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

And now I'm trying to convert the output coordenates from EPSG:4326 to EPSG:25831.

I found "MySQL Spatial - Convert from SRID 31287 to 4326" and tried it in a select instead of an insert but changing the 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;

And I get:

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

So the result from a ST_AsText(ST_GeomFromText(ST_AsText(g), 25831)) gets me the same coordinate as the inserted value.

What I am trying to get is the conversion from EPSG:4326 to EPSG:25831. Something like (or at least the coordinates):

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

What I'm doing wrong?

2

There are 2 answers

1
Evan Carroll On BEST ANSWER

MySQL doesn't have any SRID awareness. So this is simply impossible. To the extent that it supports anything SRID, it'll just reject calculations if the features have a different SRID.

What you want is PostGIS, which does this just fine with ST_Transform. As a bonus, you get a better database.

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

As @EvanCarroll answered, MySQL doesn't have SRID awareness (at the moment). But if you need it and are using PHP I've found a class to convert coordinates between SRID's proj4php (disclaimer: I'm no related with this project) and works perfect.