Дефект ступенчатости линий в картографических сервисах
Графический конвейер, используемый в ArcMap, основан на технологии Microsoft's Graphics Device Interface (GDI). Одним из недостатков данной технологии является то, что графика может быть представлена только целочисленными координатами. В геометрии реального мира редко встречаются целые числа, поэтому координаты будут неизбежно округляться в меньшую или в большую стороны при прорисовке карты с помощью графического конвейера. Это можно наблюдать при экспорте в векторные форматы, например, в PDF — при близком рассмотрении линии векторов имеют эффект "лесенки".
В графическом конвейере, используемом в слоях базовой карты и картографических сервисах, могут использоваться действительные нецелочисленные значения геометрий и выполняется отображение с точностью меньше пикселя, что дает высокую точность для векторных форматов. Однако, когда эти пространственные объекты рисуются в растровых форматах, таких как PNG или BMP, геометрические координаты снова округляются при пиксельном отображении с необходимым разрешением. При низких разрешениях это может привести к возникновению ступенчатых контуров при отображении многослойных линейных символов, таких как линии с обрамлением.
Картографические сервисы обладают функциональной способностью сглаживания для устранения этого недостатка, но существуют случаи, когда сглаживание не будет наиболее оптимальным решением. Например, использование сглаживания может снизить производительность картографического сервиса. В зависимости от требований сервиса это может оказаться неприемлемым. Вместе с этим, для целевых форматов, использующих 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, с помощью следующей формулы выясните, как следует изменить ширину:
- NewWidthInPoints = (WidthInPixels + 0,5), где NewWidthInPoints – новая ширина в точках.
- Теперь округлите NewWidthInPoints до ближайшего целочисленного значения, которое не больше NewWidthInPoints.
- Окончательная ширина линии должна быть равна (RoundedNewWidthInPoints * 72)/TargetResolution, где RoundedNewWidthInPoints – новая округленная ширина в точках, TargetResolution – целевое разрешение.
Так, например, если необходимо разрешение 44 dpi, а ширина линии символа составляет 2,60, то необходимо выполнить следующие вычисления:
- WidthInPixels = (2,60 * 44)/72,0
- WidthInPixels равна 1,5888888, что больше 1,5, поэтому:
- NewWidthInPoints = (1,588888 + 0,5) = 2,10
- Округляем значение и получаем NewWidthInPoints = 2,0
- Окончательная ширина линии должна быть равна (2,0 * 72)/44 = 3,27 точек
Вот другой пример. Если необходимо разрешение 120 dpi, а новая ширина линии символа составляет 2,60, то необходимо выполнить следующие вычисления:
- WidthInPixels = (2,60 * 120)/72
- WidthInPixels равна 4,33333, что больше 1,5, поэтому:
- NewWidthInPoints = (4,33333 + 0,5) = 4,83
- NewWidthInPoints округляется до ближайшего целого числа 4,0.
- Окончательная ширина линии должна быть равна (4,0 * 72)/120 = 2,4 точек