Дефект ступенчатости линий в картографических сервисах

Графический конвейер, используемый в ArcMap, основан на технологии Microsoft's Graphics Device Interface (GDI). Одним из недостатков данной технологии является то, что графика может быть представлена только целочисленными координатами. В геометрии реального мира редко встречаются целые числа, поэтому координаты будут неизбежно округляться в меньшую или в большую стороны при прорисовке карты с помощью графического конвейера. Это можно наблюдать при экспорте в векторные форматы, например, в PDF — при близком рассмотрении линии векторов имеют эффект "лесенки".

В графическом конвейере, используемом в слоях базовой карты и картографических сервисах, могут использоваться действительные нецелочисленные значения геометрий и выполняется отображение с точностью меньше пикселя, что дает высокую точность для векторных форматов. Однако, когда эти пространственные объекты рисуются в растровых форматах, таких как PNG или BMP, геометрические координаты снова округляются при пиксельном отображении с необходимым разрешением. При низких разрешениях это может привести к возникновению ступенчатых контуров при отображении многослойных линейных символов, таких как линии с обрамлением.

Ступенчатость линий в ArcMap и в картографическом сервисе
Пример ступенчатости изображения в связи с использованием высокоточного отображения (слева: картографический сервис, справа: ArcMap)

Картографические сервисы обладают функциональной способностью сглаживания для устранения этого недостатка, но существуют случаи, когда сглаживание не будет наиболее оптимальным решением. Например, использование сглаживания может снизить производительность картографического сервиса. В зависимости от требований сервиса это может оказаться неприемлемым. Вместе с этим, для целевых форматов, использующих 8-битовую палитру (например форматы PNG 8 или GIF), механизм сглаживания может быть не столь эффективен из-за использования механизма передачи полутонов, необходимого для плавного перехода цвета. Обратите внимание, что сглаживание недоступно во время прорисовки слоя базовой карты.

Сравнение изображения с дефектом ступенчатости и изображения с использованием механизма сглаживания
С помощью механизма сглаживания можно существенно улучшить изображение линии, хотя и ценой снижения быстродействия (слева: без сглаживания; справа: оптимальное сглаживание).

Чтобы устранить эту проблему без использования механизма сглаживания, в окне Подготовка (Prepare) есть анализатор, с помощью которого можно выявить многослойные линейные символы, которые потенциально имеют эту проблему.

Анализатор предлагает два решения: Первое – это пометить слой для автоматической коррекции размеров линий при конвертировании. Когда документ карты поступает в совместное пользование в виде картографического сервиса, ширина линий слоев, для которых включена эта опция, автоматически изменяется таким образом, что они отображаются с единым разрешением в 96 dpi. Размер символов в документе карты остается без изменений. Для большинства пользователей этого достаточно. Посмотрите документ в окне Предварительный просмотр (Preview) и убедитесь, что откорректированное изображение соответствует вашим ожиданиям. Обратите внимание, что этот анализатор не доступен для слоев базовых карт, так как в этом случае автоматическая коррекция включена постоянно.

Сглаживание линии до и после исправления
Слева: исходная ширина линии символа скоростного шоссе, отображенная в картографическом сервисе; справа: после коррекции. Учтите, что линии больше не отображаются пунктиром в исправленной версии.

Альтернативным решением может быть изменение структуры многослойного линейного символа вручную для достижения необходимого размера линий. Это также позволяет перейти к использованию иного разрешения и не использовать разрешение в 96 dpi (а использовать, например, 72 dpi).

Проектирование линий под определенное разрешений (dpi)

Для определения необходимых размеров линии для определенного разрешения, подставьте значения размеров символов в многослойном линейном символе в следующую формулу. Как говорилось раньше, значение целевого разрешения (TargetResolution) должно отражать необходимое минимальное разрешение, которое будет использоваться при отображении символа.

WidthInPixels = (LineWidth в точках * TargetResolution в dpi)/72, где WidthInPixels – ширина в пикселях, LineWidth – длина линии, TargetResolution – целевое разрешение.

Если WidthInPixels меньше 1,5, ширину не следует менять.

Если WidthInPixels равна или больше 1,5, с помощью следующей формулы выясните, как следует изменить ширину:

  1. NewWidthInPoints = (WidthInPixels + 0,5), где NewWidthInPoints – новая ширина в точках.
  2. Теперь округлите NewWidthInPoints до ближайшего целочисленного значения, которое не больше NewWidthInPoints.
  3. Окончательная ширина линии должна быть равна (RoundedNewWidthInPoints * 72)/TargetResolution, где RoundedNewWidthInPoints – новая округленная ширина в точках, TargetResolution – целевое разрешение.

Так, например, если необходимо разрешение 44 dpi, а ширина линии символа составляет 2,60, то необходимо выполнить следующие вычисления:

  1. WidthInPixels = (2,60 * 44)/72,0
  2. WidthInPixels равна 1,5888888, что больше 1,5, поэтому:
  3. NewWidthInPoints = (1,588888 + 0,5) = 2,10
  4. Округляем значение и получаем NewWidthInPoints = 2,0
  5. Окончательная ширина линии должна быть равна (2,0 * 72)/44 = 3,27 точек

Вот другой пример. Если необходимо разрешение 120 dpi, а новая ширина линии символа составляет 2,60, то необходимо выполнить следующие вычисления:

  1. WidthInPixels = (2,60 * 120)/72
  2. WidthInPixels равна 4,33333, что больше 1,5, поэтому:
  3. NewWidthInPoints = (4,33333 + 0,5) = 4,83
  4. NewWidthInPoints округляется до ближайшего целого числа 4,0.
  5. Окончательная ширина линии должна быть равна (4,0 * 72)/120 = 2,4 точек
9/11/2013