2.10. 定义投影和范围

2.10.1. 查看示例

http://webgis.cn/cgi-bin/mapserv?map=/owg/mfa6.map&layer=topo&mode=map

这张地图显然是与前面所示地图不同的区域,看起来不一样。此地图使用另一个地图投影。

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

以下是 Mapfile 源文件 mfa6.map 在本例中使用:

 1MAP
 2    IMAGETYPE "PNG24"
 3    EXTENT -20042150 -7515806 20104978 7515807
 4    SIZE 350 260
 5    SHAPEPATH "/gdata"
 6    SYMBOLSET "../symbols/symbols35.sym"
 7    FONTSET "../fonts/fonts.list"
 8    PROJECTION
 9        "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
20END

文件的更改如下:

Open the file: diff_mfa6_mfa5.html

将注意到的第一件事是, MapFile是原始的 EXTENT ,被新的范围值取代,它看起来不像经度和纬度。此外,还添加了投影对象 PROJECTION ,并向 LAYER 添加了 PROJECTION 定义。

查看新空间范围的参数:

EXTENT 201621.496941 -294488.285333 1425518.020722 498254.511514

2.10.2. Mapfile的编写方式

投影可以在地图对象中定义,也可以在层对象中定义。可以在地图对象中定义投影(只能定义一次,但可以定义多个)此定义的投影是地图的输出投影,MapServer将使用此投影来呈现地图结果。中定义的投影 LAYER 对象是输入投影,即层对象对应的数据的投影。Layer对象中的投影定义可以与地图对象中的投影定义不同,MapServer将进行投影转换并重新投影到输出投影。如果 LAYER 对象中没有投影信息,MapServer将假定输入和输出投影是相同的。

在Mapfile中, PROJECTION 对象不是必需的。但是,如果想要支持OGC互操作性规范(WMS/WFS/WCS),则仍然需要在Mapfile中对其进行明确定义。

此定义仅在地图对象中定义一次,即成为输出投影-MapServer将在此投影中呈现地图。也可以使用投影对象层对象定义输入投影。可以在不同的层上投影MapServer将它们重新投影到输出投影。如果未定义投影层中的对象,则MapServer会假定输入投影与输出投影相同。除非创建支持OGC可互操作Web服务规范(WMS/WFS/WCS)的Mapfile,否则这不是所需的对象。

MapServer的预测有两种定义方式。传统的方法是通过Proj.4参数来定义它,例如下面定义的美国大陆的Lambert方位等面积投影。

这是输出投影定义:

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

另一种方法是使用EPSG代码。这些代码是由欧洲石油调查集团(EPSG)定义的标准投影代码(或空间参考标识符)。由MapServer中的以下EPSG代码定义,EPSG:2163 也表示(Lambert方位角等面积),效果相同:

PROJECTION
    "init=epsg:2163"
END

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

2.10.3. 用CS2CS计算投影坐标

投影坐标可以使用Qgis或其他地理信息系统软件包计算,也可以使用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中实际使用的定义不同。重新投影时,使用数据范围定义的地图可能与您预期的不同。通过考虑对射程进行缓冲,射程可以上下、左右扩展几公里(根据投影和具体应用的不同而不同)。需要多少扩容可以由QGIS等桌面GIS软件来辅助,这样可能会更方便。

2.10.4. 地图投影在线文档

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