这幅地图到前面展示的地图明显是一个地区,但看起来不太一样。这幅地图使用了另外一种地图投影。
在 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" | ||
n | 3 | EXTENT -180 -90 180 90 | n | 3 | EXTENT -20042150 -7515806 20104978 7515807 |
4 | SIZE 600 300 | 4 | SIZE 350 260 | ||
5 | SHAPEPATH "/gdata" | 5 | SHAPEPATH "/gdata" | ||
n | 6 | IMAGECOLOR 255 255 255 | n | 6 | SYMBOLSET "../symbols/symbols35.sym" |
7 | FONTSET "../fonts/fonts.list" | 7 | FONTSET "../fonts/fonts.list" | ||
n | 8 | SYMBOLSET "../symbols/symbols35.sym" | n | 8 | PROJECTION |
9 | "init=epsg:3857" | ||||
10 | END | ||||
9 | LAYER | 11 | LAYER | ||
13 | TYPE RASTER | 15 | TYPE RASTER | ||
t | 14 | PROCESSING "BANDS=1,2,3" | t | 16 | PROJECTION |
15 | OFFSITE 71 74 65 | 17 | "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 | END | 18 | END |
首先会注意到,MapFile 是原来的 EXTENT
被替换成新的范围值,看起来不像是经度、纬度。此外,增加了一个投影对象 PROJECTION
,并在 LAYER
中也添加了 PROJECTION
定义。
看一下新的空间范围的参数:
EXTENT 201621.496941 -294488.285333 1425518.020722 498254.511514
可以在 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/ PSG
或 C:/PROJ/NAD/EPSG
(/ms4w/proj/nad
MS4W)。此外,检查出的EPSG网站
http://www.epsg.org
。
可以使用 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 来作为辅助,可能更方便一些。
如果您需要了解更多关于地图投影的信息,请看看下面的一些链接: