我正在使用地图服务器创建一个将与谷歌地图 API 一起显示的地图。我遇到了性能问题。

我的地图都是 shapefile 格式。

我运行测试以获得渲染地图的时间。

使用 shp2img 工具渲染地图时,使用命令行

shp2img -i gif -m C:\myfolder\mymapfile.map -o C:\myfolder\test.gif -all_debug 5 -map_debug 5

我从日志文件中获取以下指标:

[Thu Apr 30 13:50:19 2009].148000 msLoadMap(): 0.000s
[Thu Apr 30 13:50:19 2009].180000 msDrawMap(): Layer 0 (PWorld2), 0.032s
[Thu Apr 30 13:50:19 2009].180000 msDrawMap(): Drawing Label Cache, 0.000s
[Thu Apr 30 13:50:19 2009].180000 msDrawMap() total time: 0.032s
[Thu Apr 30 13:50:19 2009].195000 msSaveImage() total time: 0.015s
[Thu Apr 30 13:50:19 2009].195000 msFreeMap(): freeing map at 01595E18.
[Thu Apr 30 13:50:19 2009].195000 freeLayer(): freeing layer at 0159CD00.
[Thu Apr 30 13:50:19 2009].195000 shp2img total time: 0.047s

当通过mapserver渲染同一张地图时,使用

http://localhost/cgi-bin/mapserv.exe?mymapfile.map&layers=&mode=tile&tilemode=gmap&tile=1+1+2

日志文件给出了这个:

[Thu Apr 30 13:51:50 2009].664000 CGI Request 1 on process 3520
[Thu Apr 30 13:51:50 2009].664000 msTileSetExtent (-10013744.792915, 8348.961808) (-5009.377085, 10010405.208192)
[Thu Apr 30 13:51:51 2009].23000 msDrawMap(): Layer 0 (PWorld2), 0.359s
[Thu Apr 30 13:51:51 2009].23000 msDrawMap(): Drawing Label Cache, 0.000s
[Thu Apr 30 13:51:51 2009].23000 msDrawMap() total time: 0.359s
[Thu Apr 30 13:51:51 2009].23000 msSaveImage() total time: 0.000s
[Thu Apr 30 13:51:51 2009].23000 mapserv request processing time (loadmap not incl.): 0.359s
[Thu Apr 30 13:51:51 2009].23000 msFreeMap(): freeing map at 01598690.

对于相同的地图,shp2img工具渲染地图的速度比mapserver快10倍。当添加更多图层并使用谷歌地图的平铺模式时,可能长达 10 秒。

有人知道为什么地图服务器渲染这么慢吗?有解决方法吗?

有帮助吗?

解决方案

shp2img和mapserv请求之间存在一些差异:

1)shp2img创建单个图像,mapserv请求生成切片。这意味着它可能必须为samen边界框而不是1渲染9个tile。这会产生开销。尝试渲染时不设置tile选项并再次运行测试。

2)mapserv中的cgi请求开销很小 3)当shp2img直接写入磁盘时,Mapserv正在通过http推送映像。 4)您没有在mapserv请求中指定图层,这意味着mapserv会查找图层。

其他提示

您可以阅读以下内容:http://mapserver.org/optimization/index.html

  • 最重要的一点是删除 EPSG 文件中未使用的投影。例如。在 RedHat 6 /usr/share/proj/epsg 下我有 3 个预测。
  • 删除未使用的字体
  • Mapfile 解析器从上到下读取文件,因此将最常用的图层放在文件的顶部(EPSG 解析器以相同的方式工作)

形状文件“应该”具有相同的调用者投影,否则 Mapserver 必须动态重新投影它们。

例如。来自我的 OpenLayers 代码 (900913):

var options = {
    projection: new OpenLayers.Projection('EPSG:900913'), //aka  EPSG:3785
    displayProjection: new OpenLayers.Projection('EPSG:4326'), //geographic 

我所有的形状文件都是基于 900913 投影的。

我有一些建议,但没有硬答案,我没有做太多的mapserver配置,但我和那些有过的人一起工作。

  1. 你可以对mapserver做很多优化,我会查看邮件列表。
  2. 使mapfile尽可能小,因为打开和解析mapfile对于mapserver来说可能非常耗时。
  3. 提前创建所有图块,只需使用mapserver获取文件即可。在飞行中平铺的速度不是很快。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top