定义投影和范围

查看示例

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

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

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

01 MAP
02     IMAGETYPE "PNG24"
03     EXTENT -20042150 -7515806 20104978 7515807
04     SIZE 350 260
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 "topo"
13         DATA "land_shallow_topo_8192.tif"
14         STATUS OFF
15         TYPE RASTER
16         PROJECTION
17             "init=epsg:4326"
18         END
19     END
20 END

文件变动如下:

2    IMAGETYPE "PNG24"2    IMAGETYPE "PNG24"
n3    EXTENT -180 -90 180 90n3    EXTENT -20042150 -7515806 20104978 7515807
4    SIZE 600 3004    SIZE 350 260
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
9    LAYER11    LAYER
13        TYPE RASTER15        TYPE RASTER
t14        PROCESSING "BANDS=1,2,3"t16        PROJECTION
15        OFFSITE 71 74 6517            "init=epsg:4326"
16    END
17    LAYER
18        NAME "states_line"
19        DATA "wcountry.shp"
20        STATUS OFF
21        TYPE LINE
22        CLASS
23            NAME "State Boundary"
24            STYLE
25                SYMBOL "line5"
26                COLOR 255 255 0
27                SIZE 1
28            END
29        END18        END

首先会注意到,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 来作为辅助,可能更方便一些。

地图投影在线文档

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