2

我正在使用 mapserver 创建一个将与 google map 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 秒。

有人知道为什么 mapserver 渲染这么慢吗?有解决方法吗?

4

3 回答 3

2

shp2img 和 mapserv 请求之间有几个区别:

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

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

于 2009-07-22T10:57:22.910 回答
1

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

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

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

EG 来自我的 OpenLayers 代码 (900913):

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

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

于 2011-12-02T13:42:35.467 回答
0

我有一些建议,但没有硬性答案,我没有做太多的地图服务器配置,但我和有的人一起工作过。

  1. 您可以对地图服务器进行很多优化,我会检查邮件列表。
  2. 使地图文件尽可能小,因为地图服务器打开和解析地图文件可能很耗时。
  3. 提前创建所有图块,然后使用 mapserver 获取文件。动态平铺不是很快。
于 2009-04-30T19:04:32.443 回答