定义投影和范围

查看示例

这幅地图到前面展示的地图明显是一个地区,但看起来不太一样。这幅地图使用了另外一种地图投影。

在 Mapfile 的投影定义部分, 通过参数通过 Proj.4 库进行了投影的处理。对于关于PROJ.4库的更多信息,请访问 https://proj4.org/

下面是本例中用到的 Mapfile 源文件 xmfa6.map

01 MAP
02     IMAGETYPE "PNG24"
03     EXTENT 201621.496941 -294488.285333 1425518.020722 498254.511514
04     SIZE 400 300
05     SHAPEPATH "../data"
06     SYMBOLSET "../symbols/symbols35.sym"
07     FONTSET "../fonts/fonts.list"
08     PROJECTION
09         "proj=laea"
10         "ellps=clrk66"
11         "lat_0=45"
12         "lon_0=-100"
13     END
14     LAYER
15         NAME "states"
16         DATA "states_ugl"
17         STATUS OFF
18         TYPE POLYGON
19         PROJECTION
20             "init=epsg:4326"
21         END
22         CLASSITEM "CLASS"
23         CLASS
24             NAME "States"
25             EXPRESSION "land"
26             STYLE
27                 COLOR 232 232 232
28             END
29         END
30     END
31     LAYER
32         NAME "modis"
33         DATA "raster/mod09a12003161_ugl_ll_8bit.tif"
34         STATUS OFF
35         TYPE RASTER
36         PROCESSING "BANDS=1,2,3"
37         OFFSITE 71 74 65
38         PROJECTION
39             "init=epsg:4326"
40         END
41     END
42     LAYER
43         NAME "states"
44         DATA "states_ugl"
45         STATUS OFF
46         TYPE LINE
47         PROJECTION
48             "init=epsg:4326"
49         END
50         CLASSITEM "CLASS"
51         CLASS
52             NAME "State Boundary"
53             EXPRESSION "land"
54             STYLE
55                 SYMBOL "line5"
56                 COLOR 64 64 64
57                 SIZE 1
58             END
59         END
60     END
61     LAYER
62         NAME "states_label"
63         DATA "states_ugl"
64         STATUS OFF
65         TYPE POLYGON
66         PROJECTION
67             "init=epsg:4326"
68         END
69         CLASSITEM "CLASS"
70         LABELITEM "STATE"
71         CLASS
72             EXPRESSION "land"
73             STYLE
74                 COLOR -1 -1 -1
75             END
76             LABEL
77                 COLOR 132 31 31
78                 SHADOWCOLOR 218 218 218
79                 SHADOWSIZE 2 2
80                 TYPE TRUETYPE
81                 FONT "arial-bold"
82                 SIZE 12
83                 ANTIALIAS TRUE
84                 POSITION CL
85                 PARTIALS FALSE
86                 MINDISTANCE 300
87                 BUFFER 4
88             END
89         END
90     END
91 END

文件变动如下:

2    IMAGETYPE "PNG24"2    IMAGETYPE "PNG24"
n3    EXTENT -97.238976 41.619778 -82.122902 49.38562n3    EXTENT 201621.496941 -294488.285333 1425518.020722 498254.511514
4    SIZE 400 3004    SIZE 400 300
5    SHAPEPATH "../data"5    SHAPEPATH "../data"
n6    IMAGECOLOR 255 255 255n6    SYMBOLSET "../symbols/symbols35.sym"
7    FONTSET "../fonts/fonts.list"7    FONTSET "../fonts/fonts.list"
n8    SYMBOLSET "../symbols/symbols35.sym"n8    PROJECTION
9        "proj=laea"
10        "ellps=clrk66"
11        "lat_0=45"
12        "lon_0=-100"
13    END
9    LAYER14    LAYER
13        TYPE POLYGON18        TYPE POLYGON
nn19        PROJECTION
20            "init=epsg:4326"
21        END
14        CLASSITEM "CLASS"22        CLASSITEM "CLASS"
29        OFFSITE 71 74 6537        OFFSITE 71 74 65
nn38        PROJECTION
39            "init=epsg:4326"
40        END
30    END41    END
31    LAYER42    LAYER
n32        NAME "states_line"n43        NAME "states"
33        DATA "states_ugl"44        DATA "states_ugl"
35        TYPE LINE46        TYPE LINE
nn47        PROJECTION
48            "init=epsg:4326"
49        END
36        CLASSITEM "CLASS"50        CLASSITEM "CLASS"
51        TYPE POLYGON65        TYPE POLYGON
tt66        PROJECTION
67            "init=epsg:4326"
68        END
52        CLASSITEM "CLASS"69        CLASSITEM "CLASS"

首先会注意到,MapFile 是原来的 EXTENT 被替换成新的范围值,看起来不像是经度、纬度。此外,增加了一个投影对象 PROJECTION ,并在 LAYER 中也添加了 PROJECTION 定义。

看一下新的空间范围的参数:

EXTENT 201621.496941 -294488.285333 1425518.020722 498254.511514

Mapfile中的写法

可以在 MAP 对象,以及 LAYER 对象中进行投影的定义。在 MAP 对象中可以定义投影(只能定义一次,但可以定义多个),这个定义的投影是地图的输出投影,MapServer 将会通过这个投影来渲染地图结果。在 LAYER 对象中定义的投影是输入投影,也就是图层对象对应的数据的投影。图层对象中投影的定义可以与地图对象中的不同,MapServer 会进行投影转换,重新投影到输出投影。如果 LAYER 对象中没有投影信息,MapServer 会假设输入投影与输出投影是一致的。

在 Mapfile 中,PROJECTION 对象并不是必需的。但是如果要支持 OGC 互操作规范(WMS/WFS/WCS)的话,还是需要在 Mapfile 中明确定义的。

只在地图对象定义一次,这个定义 成为你的输出投影 - MapServer将在这个投影中 呈现您的地图。您也可以使用投影对象层对象 定义输入投影。可以在不同的图层 投影 - MapServer将它们重新投影到你的输出投影。如果没有定义投影层内的对象,MapServer假设 输入投影输出投影一样。这不是 所需的对象,除非你创建的地图文件,支持一个 OGC互操作的Web服务规范(WMS/ WFS/ WCS)。

MapServer的投影定义两种方式。传统的方式是通过 Proj.4 参数来定义,比如下面定义的美国大陆 兰勃特方位等积(Lambert Azimuthal Equal-Area)投影。

这是输出投影定义:

PROJECTION
    "proj=laea"
    "ellps=clrk66"
    "lat_0=45"
    "lon_0=-100"
END

另一种方法是使用EPSG代码。这些代码是欧洲石油调查组织(EPSG)所定义的标准投影代码(或空间参考标识符)。 在 MapServer 中通过 下面的 EPSG 代码定义,下面的 EPSG:2163 同样表示 (Lambert Azimuthal Equal-Area),效果是一样的:

PROJECTION
    "init=epsg:2163"
END

如果您想了解更多关于EPSG代码,看看 的 /usr/ROJ/ PSGC:/PROJ/NAD/EPSG/ms4w/proj/nad MS4W)。此外,检查出的EPSG网站 http://www.epsg.org

通过 cs2cs 计算投影坐标

可以使用 QGIS 或其他一些GIS软件包计算出投影后的坐标值,或者可以使用PROJ.4 的 cs2cs 工具。下面的命令是可以用来重新投影的原始范围值:

cs2cs +proj=latlong +datum=WGS84 +to +proj=laea +ellps=clrk66 +lat_0=45 +lon_0=-100

键入命令后,输入西南部坐标对(左下坐标),用空格隔开: -97.54 1.619778

cs2cs 实用程序返回的结果为:

208398.01       -372335.44  0.000

接着,键入东北坐标对(右上角坐标),同样用空格隔开: `-82.122902 49.38562 ,返回以下值:

1285308.08      632638.93   0.000

cs2cs 返回三元值。可以忽略第三个值0.000,这意味着代表海拔高度(我们不使用)。

现在,可以在 Mapfile 中定义在这个投影下地图的范围:

EXTENT 208398.01 -372335.44 1285308.08 632638.93

注意此处的定义,与实际在 Mapfile 中用的是不一样的。 当重新投影时,使用数据的范围定义的地图结果可能与预期的不一样。通过可以考虑把范围进行“缓冲”,在上下左右把范围外扩几千米(这个根据投影与具体的应用而不同)。需要外扩多少,可以通过桌面 GIS 软件如 QGIS 来作为辅助,可能更方便一些。

地图投影在线文档

如果您需要了解更多关于地图投影的信息,请看看下面的一些链接:

  • http://www.colorado.edu/geography/gcraft/notes/mapproj/mapproj_f.html
  • http://www.geography.hunter.cuny.edu/mp/
  • http://www.nationalatlas.gov/articles/mapping/a_projections.html
  • http://en.wikipedia.org/wiki/Map_projection
  • http://erg.usgs.gov/isb/pubs/MapProjections/projections.html