如何在MySQL/SQL Server中将XY坐标转换为经纬度(附Oracle示例)
我在Oracle中有一个带XY坐标的点几何对象:
"MDSYS"."SDO_GEOMETRY"(2001,2400000,"MDSYS"."SDO_POINT_TYPE"(8452842.1981,4443992.9047,NULL),NULL,NULL)
用下面的语句可以把它转换成WGS84经纬度格式:
SELECT SDO_CS.TRANSFORM("MDSYS"."SDO_GEOMETRY"(2001,2400000,"MDSYS"."SDO_POINT_TYPE"(8452842.1981,4443992.9047,NULL),NULL,NULL), 4326) FROM DUAL
转换结果为:
"MDSYS"."SDO_GEOMETRY"(2001,4326,"MDSYS"."SDO_POINT_TYPE"(44.4467355804591,40.1282575487861,NULL),NULL,NULL)
现在需要在MySQL或SQL Server中对相同的XY坐标(8452842.1981,4443992.9047)执行经纬度转换,对应的投影参数翻译为中文如下:
投影坐标系["亚美尼亚GK-8 (ARM-DAT)",
地理坐标系 [ "ARM大地坐标系",
基准面["ARM-DAT(EPSG编码2400001)",
椭球体["克拉索夫斯基1940(EPSG编码7024)", 6378245.0, 298.3],
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
本初子午线 [ "格林尼治", 0.000000 ],
单位["十进制度", 0.0174532925199433]],
投影方式["横轴墨卡托"],
参数 ["原点纬度", 0.0],
参数 ["中央经线", 45.0],
参数 ["比例因子", 1.0],
参数 ["东伪偏移", 8500000.0],
参数 ["北伪偏移", 0.0],
单位["米", 1.0]]
MySQL转换方法
MySQL的ST_Transform函数支持自定义投影参数,因为ARM-DAT(EPSG:2400000)不在默认内置SRID列表里,直接用PROJ.4格式的投影字符串即可:
SELECT ST_AsText( ST_Transform( ST_GeomFromText('POINT(8452842.1981 4443992.9047)', 0), '+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +units=m +no_defs', 4326 ) ) AS wgs84_point;
执行后会得到结果:POINT(44.4467355804591 40.1282575487861)
SQL Server转换方法
SQL Server需要先注册自定义空间参考,再执行转换:
- 注册自定义SRID(用和Oracle一致的2400000):
INSERT INTO sys.spatial_reference_systems ( spatial_reference_id, authority_name, authority_key, well_known_text, unit_of_measure, unit_conversion_factor ) VALUES ( 2400000, 'EPSG', '2400000', 'PROJCS["Armenia GK-8 (ARM-DAT)",GEOGCS["ARM-Geodetic",DATUM["ARM-DAT (EPSG ID 2400001)",SPHEROID["Krassowsky 1940 (EPSG ID 7024)",6378245.0,298.3],0.0,0.0,0.0,0.0,0.0,0.0,1.0],PRIMEM["Greenwich",0.000000],UNIT["Decimal Degree",0.0174532925199433]],PROJECTION["Transverse Mercator"],PARAMETER["Latitude_Of_Origin",0.0],PARAMETER["Central_Meridian",45.0],PARAMETER["Scale_Factor",1.0],PARAMETER["False_Easting",8500000.0],PARAMETER["False_Northing",0.0],UNIT["Meter",1.0]]', 'Meter', 1.0 );
- 执行坐标转换:
SELECT geometry::STGeomFromText('POINT(8452842.1981 4443992.9047)', 2400000) .STTransform(4326) .ToString() AS wgs84_point;
执行后会得到结果:POINT (44.4467355804591 40.1282575487861)
内容的提问来源于stack exchange,提问作者Tigran Shahnazaryan

