原文发布时间:2010-08-17
作者:乱马
对于FME进行坐标系变换,涉及两种不同的变换,一个是基准面(Datum)发生变换,另一个基准面不发生变换。本文对第一种变换进行描述。
对于基准面发生变换的坐标系变换,在FME Workbench中使用Reprojector函数,在该函数中要分别选择源数据坐标系和目标数据坐标系,确定后,即可进行坐标系的变换。
或者对于源数据和目标数据,分别设置坐标系,FME在进行数据转换的时候,就可以自动进行坐标系的变换。
但是如何设置一个用户自定义的坐标系,能在FME的坐标系仓库(Coordinate System Gallery)中选择,然后进行坐标系变换呢。
通常,定义一个坐标系是确定这个坐标系的几个参数----椭球体参数,基准面参数以及投影参数。对于FME的坐标系参数定义涉及两个文件,LocalCoordSysDefs.fme和MyCoordSysDefs.fme。这两个文件都位于FME安装目录下的子目录Reproject下。在LocalCoordSysDefs.fme文件中定义基本的参数----椭球体参数和基准面参数。在文件MyCoordSysDefs.fme中定义投影参数。
椭球体的定义:
ELLIPSOID_DEF <ellipsoidName> \
DESC_NM <descriptive name> \
SOURCE <source> \
E_RAD <equator radius> \
P_RAD <polar radius>
参数描述如下:
如果一个椭球体已经在FME里面预先定义了,在以后所有的用到的地方都可以引用,不必重新定义,比如KRASOV,或者XIAN80等。
基准面的定义:
DATUM_DEF <datumName> \
DESC_NM <descriptive name> \
SOURCE <source> \
ELLIPSOID <ellipsoid name> \
USE <use type> \
DELTA_X <x value> \
DELTA_Y <y value> \
DELTA_Z <z value> \
BWSCALE <bwscale> \
ROT_X <rotX> \
ROT_Y <rotY> \
ROT_Z <rotZ>
参数描述如下:
名称 | 类型 | 描述 | 是否为空 |
<datumName> | 字符串 | 基准面的名称 | No |
<descriptive name> | 字符串 | 基准面的描述 | Yes |
<source> | 字符串 | 椭球体来源(个人或者组织) | Yes |
<ellipsoid name> | 有效的椭球体名称 | 引用已定义的椭球体名称 | No |
<use type> | 3PARAMETER 4PARAMETER 6PARAMETER 7PARAMETER AGD66 AGD84 ATS77 BURSA CSRS DHDN GDA94 HPGN JGD2K MOLODENSKY MULREG NAD27 NAD83 NZGD2K NZGD49 WGS72 WGS84 | 基准面变换中使用的变换类型(变换公式)
| No |
<x value> | 浮点数 | 空间直角坐标系X轴与WGS-84基准面空间直角坐标系X轴的位移量。(单位:米) | No |
<y value> | 浮点数 | 空间直角坐标系Y轴与WGS-84基准面空间直角坐标系Y轴的位移量。(单位:米) | No |
<z value> | 浮点数 | 空间直角坐标系Z轴与WGS-84基准面空间直角坐标系Z轴的位移量。(单位:米) | No |
<bwscale> | 浮点数 | 7参数转换中的比率(BURSA类型)。(单位:PPM 百万分之) | 不是所有类型都需要 |
<rotX> | 浮点数 | 7参数转换中的X方向的旋转偏移(BURSA类型)。(单位:弧度) | 不是所有类型都需要 |
<rotY> | 浮点数 | 7参数转换中的Y方向的旋转偏移(BURSA类型)。(单位:弧度) | 不是所有类型都需要 |
<rotZ> | 浮点数 | 7参数转换中的Z方向的旋转偏移(BURSA类型)。(单位:弧度) | 不是所有类型都需要 |
当已知一个坐标系的基准面和WGS84基准面之间的变换关系,就可以利用上面形式,把一个坐标系定义出来。
下面是一个以7参数(布尔莎算法)为例的定义:
DATUM_DEF DHDN \
DESC_NM “Deutsches Hauptdreicknetz (DHDN)” \
SOURCE “German Government” \
ELLIPSOID BESSEL \
USE BURSA \
DELTA_X 582.00000000000 \
DELTA_Y 105.00000000000 \
DELTA_Z 414.00000000000 \
BWSCALE 8.3000000000000 \
ROT_X -1.0400000000000\
ROT_Y -0.35000000000000\
ROT_Z 3.0800000000000
如果一个基准面已经在FME里面预先定义了,在以后所有的用到的地方都可以引用,不必重新定义,比如WGS84、BEIJING、XIAN80等(注意,FME预定义的BEIJING、XIAN80定义不是准确的基准面定义,详见前面的博客)。
定义中要注意,在LocalCoordSysDefs.fme文件中最后一行是:
INCLUDE MyCoordSysDefs.fme
所有椭球体和基准面的定义,都要在这一行之前。
定义完以上两个参数,就可以在MyCoordSysDefs.fme中定义具体的坐标系参数(投影)了。
坐标系定义:
COORDINATE_SYSTEM_DEF <coordsysname> \
PROJ <projType> \
UNIT <unitName> \
DT_NAME <datumName>|EL_NAME <ellipName> \
[<parameter> <value>]+ \
[ DESC_NM <descriptive_name>] \
[GROUP <group_name>] \
[ QUAD <quadrant>] \
[ SOURCE <source>] \
[ZERO_X <zero_x>] \
[ZERO_Y <zero_y>]
参数描述如下:
名称 | 类型 | 描述 | 是否为空 |
<coordsysname> | 字符串 | 投影坐标系名称 | No |
<projType> | 字符串 | 投影类型(如TM,LL等。具体见FME帮助) | No |
<source> | 字符串 | 坐标系来源(个人或者组织) | Yes |
<unitName> | 字符串 | 坐标单位 | No |
<group_name> | 字符串 | 分组名称,可以在Gallery中进行分类 | Yes |
<datumName> | 字符串 | 基准面名称,引用已经定义的基准面名称 | Yes |
<ellipName> | 字符串 | 椭球体名称,引用已定义的名称。椭球体名称和基准面名称必须填写一个。 | Yes |
<parameter> <value> | 字符串+数字 | 参数+数字(1-24),表示具体参数定义,如中央度线等,取决于投影类型(具体参见FME帮助)。 | No |
<quadrant> | 整型 | 象限区代码 | Yes |
<zero_x> | 非负数 | 设定一个X最小值的非零值 | Yes |
<zero_y> | 非负数 | 设定一个Y最小值的非零值 | Yes |
其中注意的是,投影类型的参数要根据需要定义。下面是个例子:
COORDINATE_SYSTEM_DEF UTM12N83 \
PROJ TM \
UNIT METER \
DT_NAME NAD83 \
GROUP "Custom Group" \
PARM1 -111.0 \
SCL_RED 0.9996 \
ORG_LAT 0.0 \
X_OFF 500000.0 \
Y_OFF 0.0 \
MAP_SCL 1.0 \
ZERO_X 0.001 \
ZERO_Y 0.001
这个定义所选择的基准面为NAD83,投影方式采用的是TM(Transverse Mercator),参数包括:PARM1、ORG_LAT、SCL_RED、MAP_SCL、X_OFF、Y_OFF(具体投影类型和参数见FME随机帮助)。
简单总结一下,如果已知一个坐标系和WGS84坐标系的变换关系(比如7参数),那么就可以把这个坐标系定义到FME中,和其他已经定义的坐标系进行变换。
但是,经常性的一个问题是,我们已知2个非WGS84的坐标系的7参数关系,如何在FME定义,并实现转换呢。例如,我们知道某个投影带下的北京54和西安80的之间的7参数,该如何处理呢?
这里我们只要通过一个变通的定义方式,完成两组坐标系的定义即可。例如,从北京54到西安80的7参数是一组值:dx,dy,dz,rx,ry,rz,bs。先用这组参数定义北京54到WGS84的坐标系定义;然后再用0,0,0,0,0,0,1这样一组7参数,完成西安80到WGS84的坐标系定义。这个方法,不仅在实际中得到很好的应用,而且可以用坐标系变换的公式进行证明,具体证明过程就不详细介绍了。只不过,这样的定义方式,只能用于这两个坐标系之间,而不能用于和其他坐标系的变换。
来源:CSDN
作者:fmechina
链接:https://blog.csdn.net/fmechina/article/details/80896070