定义投影和范围

查看示例

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

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

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

01 MAP
02     IMAGETYPE "PNG24"
03     EXTENT -20042150 -20000000 20104978 20000000
04     SIZE 400 400
05     SHAPEPATH "/gdata"
06     SYMBOLSET "../symbols/symbols35.sym"
07     FONTSET "../fonts/fonts.list"
08     PROJECTION
09         "init=epsg:3857"
10     END
11     LAYER
12         NAME "states"
13         DATA "wcountry.shp"
14         STATUS OFF
15         TYPE POLYGON
16         PROJECTION
17             "init=epsg:4326"
18         END
19         CLASS
20             NAME "States"
21             EXPRESSION "land"
22             STYLE
23                 COLOR 232 232 232
24             END
25         END
26     END
27     LAYER
28         NAME "modis"
29         DATA "land_shallow_topo_8192.tif"
30         STATUS OFF
31         TYPE RASTER
32         PROCESSING "BANDS=1,2,3"
33         PROJECTION
34             "init=epsg:4326"
35         END
36     END
37     LAYER
38         NAME "states"
39         DATA "wcountry.shp"
40         STATUS OFF
41         TYPE LINE
42         PROJECTION
43             "init=epsg:4326"
44         END
45         CLASS
46             NAME "State Boundary"
47             STYLE
48                 SYMBOL "line5"
49                 COLOR 255 255 0
50                 SIZE 1
51             END
52         END
53     END
54 END

文件变动如下:

2    IMAGETYPE "PNG24"2    IMAGETYPE "PNG24"
n3    EXTENT -180 -90 180 90n3    EXTENT -20042150 -20000000 20104978 20000000
4    SIZE 600 3004    SIZE 400 400
5    SHAPEPATH "/gdata"5    SHAPEPATH "/gdata"
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        "init=epsg:3857"
10    END
11    LAYER
12        NAME "states"
13        DATA "wcountry.shp"
14        STATUS OFF
15        TYPE POLYGON
16        PROJECTION
17            "init=epsg:4326"
18        END
19        CLASS
20            NAME "States"
21            EXPRESSION "land"
22            STYLE
23                COLOR 232 232 232
24            END
25        END
26    END
9    LAYER27    LAYER
14        PROCESSING "BANDS=1,2,3"32        PROCESSING "BANDS=1,2,3"
n15        OFFSITE 71 74 65n33        PROJECTION
34            "init=epsg:4326"
35        END
16    END36    END
17    LAYER37    LAYER
n18        NAME "states_line"n38        NAME "states"
19        DATA "wcountry.shp"39        DATA "wcountry.shp"
21        TYPE LINE41        TYPE LINE
tt42        PROJECTION
43            "init=epsg:4326"
44        END
22        CLASS45        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 来作为辅助,可能更方便一些。

地图投影在线文档

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