MS RFC 55:提高输出分辨率的控制

日期

2009/03/09

作者

丹尼尔·莫里塞特

联系

在mapgears.com的dmorissette

最后编辑

2009/10/06

状态

通过(2009/03/16)并实施。

版本

MAPServer 5.6

概述

MapServer通常用于生成与当前在Web界面中显示的地图对应的可打印地图。

打印的地图通常需要高于屏幕通常使用的默认每英寸72像素的分辨率(例如150或300 dpi)。通常,打印是通过设置map.resolution并为相同的映射范围请求较大的图像来完成的。将map.resolution设置为更高的值可确保对更大图像的图层minscaledenom/maxscaledenom进行正确评估,但有一件事丢失了:符号(线条宽度、符号和字体大小等)未经调整以反映分辨率的变化,结果是,符号看起来比在屏幕上看到的要小。恩。

这个RFC提出了一种机制来解决这个问题,当分辨率改变时自动缩放符号,这样地图就可以保持对每个分辨率的相同观察。

技术解决方案

如果未设置72,则将在mapobj中添加一个新的可选defresolution关键字,该关键字的默认值为72。解译是在映射文件中为其定义所有符号大小的引用或默认分辨率。

在渲染时,如果分辨率设置为不同于解译的值,则层定义中的符号将根据分辨率/解译对应的系数进行调整。更具体地说,这是通过将layer->scaleFactor值乘以msPrepareImage()中的分辨率/除霜率来完成的。

以下渲染参数将受到影响:

  • 尺寸(符号和标签)

  • 宽度(线)

从现在起,以前没有受到缩放影响的以下渲染参数也将被固定为遵循缩放:

  • 偏移(直线、点、多边形)

  • 图案(线条)

  • 间隙(线)

  • 大纲宽度(标签)

  • 阴影大小,背景阴影大小(标签)

  • 标签周围的缓冲区(碰撞)

  • MinFeatureSize,MinDistance(标签)

线条样式的outline width的情况有点不同:它忽略了scaleFactor,这样无论大小单位使用什么,都可以获得固定的轮廓宽度,但我们希望它遵循分辨率/除霜系数。在这种情况下,线条绘制代码需要有一个对传递给msdrawlinesymbol()的mapobj的引用,以便它可以访问分辨率和解算参数并执行正确的操作。

对于PixMap符号,只有在设置了大小时才会缩放。如果没有设置大小,则不会发生缩放。

使用实例

例1:

假设我们有一个映射文件,我们用它生成一个400x400像素的图像,在网络上使用,同时将解译和分辨率设置为72。

MAP
  ...
  RESOLUTION 72
  DEFRESOLUTION 72
  SIZE 400 400
  ...
END

为了产生300dpi图像用于打印,应用程序代码应请求1667 x 1667像素(400*300/72=1667)的图像,并将分辨率设置为300。MapServer将自动缩放所有符号大小,比例为300/72=4.1667。

在大多数应用程序中,用于打印的大小和分辨率的新值可能会作为URL参数传递或通过mapscript设置,但在本例中,以mapfile语法表示,我们将使用以下mapobj设置进行打印:

MAP
  ...
  RESOLUTION 300
  DEFRESOLUTION 72
  SIZE 1667 1667
  ...
END

例2:

应用程序正在使用为map.resolution=96和mapserver 5.x开发的mapfile。为了利用新功能,应该在mapfile中设置defresolution=96,并且在渲染时,设置resolution=300将导致所有符号都按300/96=3.125的系数缩放。

向后兼容性问题

将分辨率设置为72以外的值的现有应用程序或映射文件 without 设置除霜将以符号比例结束。在大多数情况下,这种行为变化更可能被视为一种特性,而不是一个bug,但如果这是一个现有应用程序的问题,那么修复方法就是简单地向映射文件添加一个解组,该解组与定义所有映射文件类和样式的分辨率相匹配。

上面列出的渲染参数如果在过去没有遵循缩放,将被固定为遵循缩放。

文件注释

除了记录新功能之外,还应在MapServer文档中的某个地方添加一条注释,说明在此更改之后,只有当分辨率设置为默认72或等于“解组”设置时,大小值才会反映有效大小(根据“大小单位”设置,默认为ms_像素)。

文件冲击

  • mapserver.h:mapobj中的新解冻成员

  • mapfile.c、maplexer.l等:new defresolution mapfile关键字

  • mapdraw.c:根据MSPrepareImage()中的需要调整scaleFactor

  • mapscript/php3/php_mapscript.c:公开新的除霜成员

票据ID

投票历史

于2009/03/16通过,由Danielm、Howardb、Stevew、Tamass、Periclesn和Assefay提供+1。