浅入浅出Oracle Spatial GeoRaster 10g影像数据管理(3)——空间参考(Georeferencing)

1.概要
    GeoRaster空间参考系(spatial reference system, SRS)是GeoRaster对象中元数据的一部分。空间参考(Georeferencing)是用来构建像素坐标系与真实世界的大地坐标系(或其它一些本地坐标系)之间双向的映射关系。
    Georeferencing不同于几何校正(geocorrection)、校准(rectification)和正射校准(orthorectification)。后面三种处理经常需要对原始影像进行采样,而经过处理的影像,其地理坐标可能会变,各维度的尺寸也可能会变。而Georeferencing只是通过在像素坐标与地理坐标之间建立一个映射关系,使得这两种坐标能够互转。这个映射关系一般以一个数学公式来表达,除了公式,还要提供足够的地面控制点坐标,或者是来自遥感系统的严格的坐标数据。除非要简化坐标变换,Georeferencing一般不会改变GeoRaster的像素数据和其它的元数据。
    GeoRaster目前支持对二维影像数据使用六参数仿射变换来实现坐标变换。仿射变换是函数拟合多项式模型的一种。如果对一幅影像提供了仿射变换并且在元数据中有效,那么这个GeoRaster对象就会被认为是有地理参考系的,其元数据中SRS节中的isReferenced值为TRUE,否则为FALSE。
    校准可以利用水平坐标实现,这样可以使栅格数据集中的像素都映射到投影地图坐标系中。经过校准之后,影像中的每个像素都被规整成规则的大小(地理范围),并且按照地理坐标空间中的东西向、南北向对齐。如果用于校准的是高程数据(DEM数据),那么这种校准就叫做正射校准(orthorectification),这是一种用来修正地形错位的特有校准方法。和前面的地理参考系类似,校准与正射校准也有自己对应的元数据:isRectified和isOrthorectified,有则为TRUE,无则为FALSE。

2.坐标变换公式
    在现在这个GeoRaster版本中,使用下面的六参数仿射变换公式实现从地理坐标系到像素坐标系的变换:
    row = a + b * x + c * y
    col = d + e * x + f * y………………………………(1)
其中各变量的含义如下:
row:像素在像素坐标系中的行坐标值;
col:像素在像素坐标系中的列坐标值;
x:地理坐标系中的东西向坐标值(比如经度);
y:地理坐标系中的南北向坐标值(比如维度);
a,b,c,d,e,f作为参数,存储在SRS的元数据中,公式中b*f-c*e不能等于0,只有这样才能保证线性方程组有唯一解。
    如果公式中b=0, f=0, c=-e且c和e都不为0,那么说明影像是经过校准的,原公式就退化成:
    row = a + c * y
    col = d - c * x
    这是坐标变换中最简单的一种情况。(译注:应该也是最常用的一个公式)

    在坐标变换中存在一个问题需要注意一下,就是像素点和实际的地理要素之间的对应关系。GeoRaster的元数据中有一个cellRepresentationType项,从字面上理解,它的意思就是像素所代表的地理要素类型,而在目前的版本中该项的值只能是UNDEFINED。也就是说,一个像素仅仅是一个标量值(或者是数组中的一个元素),而不能带有任何的形状信息。然而在进行坐标变换的时候,一个像素一般对应于实际地理空间上的一个面(正方形区域或者是矩形区域),或者对应于这个面中的一个点。在像素空间中,坐标都是以整数表达的行列号。这些整数坐标通过坐标变换可以被映射到真实的地理空间坐标系上,变成一个真正意义上的“点”的位置坐标。这个点的位置可能是像素所对应的地理区域的左上角,也可能是区域的中心点。这可以通过指定GeoRaster元数据中的modelCoordinateLocation项的值来确定。

    地理坐标的单位要与先前指定的SRID中定义的一致,而且其取值也应该落在正确的定义域内。比如要在一幅影像的像素坐标系与8307测量坐标系之间建立映射关系,那么地理坐标的取值单位就必须是十进制角度值,而且经度(x值)必须在[-180.0, 180.0]或[0.0, 360.0]中取值,纬度(y值)则必须在[-90.0, 90.0]中取值,这时就不能使用其它的单位(比如米)。

    前面给出的六参数变换公式是从地理空间到像素空间的变换,反方向的变换公式也很好写:
    x = A * col + B * row + C
    y = D * col + E * row + F………………………………(2)
    很容易看出来这里的A,B,C,D,E,F和前面的a,b,c,d,e,f之间是可以求出关系式的,其实后面这个变换公式就是前面公式的解(把x,y看成未知数),反过来也一样(把row,col看成未知数)。SDO_GEOR.georeference函数接受A,B,C,D,E,F为输入参数,并在内部自动转化为a,b,c,d,e,f参数。

    这里特别说明一下,ESRI的world file(就是那些tfw,jpgw等等)中用的就是公式(2),它里面那六个参数依次分别对应A,B,D,E,C,F。到我看到这份文档的时候,我才算基本搞清楚了ESRI的xxw坐标文件的含义。这鬼东西让我迷茫过好一阵,主要就是搞不清楚里面为什么会有6个参数,怎么算怎么觉得要不了那么多。没想到最后还是看了Oracle的文档才弄明白的。关于ESRI的world file,我当时写过一篇《tiff/tfw, jpg/jpgw坐标文件的格式》,但那时其实还是在探索中。后来又陆续看到过兔八哥的《Tif World文件tfw解释》,3echo的《tfw坐标信息文件》等文章(呵呵,原来大家都在研究),感觉当时指点过我的懒狮对此应该比较清楚,但可惜的是我却没有找到他关于这方面的专门论述(难道真的“懒”?;-))

    在像素空间中,对于一幅影像中的一个像素p,如果已知其所在影像的左上角坐标(ULTCoordinate)(row0,col0)和p在影像中的行、列位置(m,n),则可以由公式(3)得到它的像素坐标。
    row = row0 + m
    col = col0 + n………………………………(3)
    需要说明的是,左上角坐标(row0,col0)未必恰好是(0,0),这要视具体情况而定,但在大多数的应用中,它就是(0,0),这样,原公式就退化成
    row = m
    col = n
    另外,m和n也都是从0开始计算的(第一行的行号是0,第一列的列号也是0)。

p.s.这次的文章的主题就是georeferencing,但对于这个词,我却译不好,在标题中暂且译成了“空间参考”,而在文章中很多地方就直接使用了原文georeferencing,还有些地方的“坐标变换”也是译自georeferencing这个词。大家如果知道正确的译法,望能指点,感激不尽~~~

p.s.这次的相对好翻译,好理解一些,原文也不长,但下次的《索引结构》就不太容易了,而且5月有4门考试,还有若干繁杂事情,所以第4篇可能会晚些才能出来。

posted on 2006-05-07 11:25  合金枪头  阅读(1777)  评论(7编辑  收藏  举报