Skip To Content

地图服务中的线锯齿

ArcMap 中所使用的图形管线以 Microsoft 的图形设备接口 (GDI) 技术为基础。该技术的一个局限性是:只能用整数坐标来表示图形。由于真实几何的坐标通常不会以整数形式出现,因此采用此类图形管线绘制坐标时,会对坐标进行四舍五入处理。这种现象经常会在矢量导出格式(如 PDF 格式)中看到 - 仔细观察矢量线时,您会发现矢量线呈现阶梯形状。

底图图层和地图服务所使用的图形管线可以对几何采用真实的非整数坐标,并且可以用亚像素精度进行渲染,从而提高这些矢量格式的精度。然而,在将这些要素绘制为栅格格式(如 PNG 或 BMP)时,必须重新对几何坐标进行四舍五入,才能以要求的分辨率按像素进行渲染。在低分辨率下,这可能会导致多图层线符号(例如,下管线的道路符号)出现锯齿。

ArcMap 中的线锯齿以及地图服务中的线锯齿
经过更精确的渲染后所产生的锯齿的示例(左图:地图服务,右图:ArcMap)

地图服务可以使用抗锯齿来减弱锯齿效果,但是在有些情况下使用抗锯齿并不是最佳选择。例如,使用抗锯齿会降低地图服务的性能。根据服务要求,这可能是不可接受的。此外,如果目标格式使用 8 位调色板(例如 PNG 8 或 GIF 格式),使用抗锯齿可能不是很有效,因为渲染连续的颜色渐进需要进行抖动控制。请注意,抗锯齿对于底图图层的绘制不可用。

锯齿绘制和抗锯齿绘制之间的比较
抗锯齿可以在很大程度上改进线的外观,但会降低性能(左图:没有抗锯齿效果;右图:最佳抗锯齿效果)。

要在不使用抗锯齿的情况下弱化锯齿效果,可使用准备 窗口中的分析器,该分析器将会检测出可能存在锯齿问题的多图层线符号。

分析器给出两种解决方案。第一种解决方案是将此图层标记为在转换时自动调整线的粗细。将地图文档共享为地图服务时,启用了此方案的图层的线宽度将自动进行更改以确保始终以 96 dpi 或更高值来渲染线宽度。地图文档中的符号大小将保持不变。对于多数用户来说,该解决方案足以满足应用要求。检查预览 窗口以确保经过修正的线的外观符合您的预期要求。请注意,底图图层不会显示到分析器中,因为系统会为底图图层默认选择自动调整。

修正前后的线锯齿
左图:在地图服务中渲染的高速公路符号的初始线宽度;右图:修正后的线外观。请注意,在修正后的版本中,下管线不再显示为虚线。

另一种解决方案是手动更改多图层线符号的结构以使线粗细看起来更适合。使用该解决方案,也可以进行转换以与目标 dpi 而非 96 dpi(例如,72 dpi)结合使用。

设计适合特定分辨率 (dpi) 的线

要确定适合特定分辨率的线粗细,可将多图层线符号中每个符号的大小都输入到以下公式中。如上所述,目标分辨率的值应该反映使用该符号时所需的最小分辨率。

宽度(像素)= (线宽度(磅)* 目标分辨率 (dpi))/72

如果宽度(像素)小于 1.5,则不应改变宽度。

如果宽度(像素)大于或等于 1.5,请使用以下公式来确定编辑后的宽度:

  1. 新宽度(磅)= (宽度(像素)+ 0.5)
  2. 现在,将新宽度(磅)四舍五入为不大于新宽度(磅)的最近整数值。
  3. 最后的线宽度应该为 (四舍五入后的新宽度(磅)* 72)/目标分辨率。

所以,如果所需分辨率为 44 dpi,且线符号的宽度为 2.60,则将执行以下数学计算:

  1. 宽度(像素)= (2.60 * 44)/72.0
  2. 宽度(像素)为 1.5888888,它大于 1.5,所以继续执行以下计算:
  3. 新宽度(磅)= (1.588888 + 0.5) = 2.10
  4. 向下取整,得到的新宽度(磅)= 2.0
  5. 最后的线宽度应该为 (2.0 * 72)/44 = 3.27 磅

再举一个例子,如果所需分辨率为 120 dpi,而新的线符号的宽度为 2.60,则将执行以下数学计算:

  1. 宽度(像素)= (2.60 * 120)/72
  2. 宽度(像素)为 4.33333,它大于 1.5,所以继续执行以下计算:
  3. 新宽度(磅)= (4.33333 + 0.5) = 4.83
  4. 新宽度(磅)将向下舍入为最近的整数 4.0。
  5. 最后的线宽度应该为 (4.0 * 72)/120 = 2.4 磅