Процесс обобщения данных включает в себя множество повторяющихся трудоемких процедур, поэтому является подходящим объектом для автоматизации. Однако субъективный характер генерализации делает ее достаточно сложной для автоматизации. Человеческий мозг приспособлен для расстановки приоритетов и принятия обоснованных решений. Гораздо сложнее научить компьютер производить подобные действия с помощью наборов отдельных команд.
Среда геообработки ArcGIS отлично подходит для разработки структуры генерализации, так как может управлять преобразованием данных с помощью отдельных шагов, определяемых специальными переменными, обусловленными масштабом, типом данных и продуктом. Эти шаги могут составлять логическую цепочку действий или могут быть связаны в единый скрипт. Задачи можно с легкостью повторять для различных групп объектов или с использованием различных параметров, скомбинированных множеством способов. Рабочие процессы могут быть автоматизированы целиком, либо они могут быть поделены на более мелкие подпроцессы, между которыми может иметь место редактирование и проверка вручную.
Включение задач генерализации в картографические рабочие процессы
Процесс создания карты в более мелком масштабе, чем тот, для которого предназначены данные, начинается с понимания масштаба выходной карты, требований к ее отображению, в т.ч. к символам отображения, а также основного предназначения создаваемой карты. Далее операции выполняются таким образом, чтобы уменьшить общее количество объектов, не нанося при этом ущерб связности и качеству данных. Затем уменьшается индивидуальная сложность объектов путем удаления вершин и других деталей объектов. Также может использоваться упрощение с использованием атрибутов объектов, осуществляемое путем объединения близких друг к другу категорий объектов для их показа одинаковыми символами. Как только начинается авторская работа по созданию карты и данные отображаются с использованием требуемых символов в требуемом масштабе, могут быть обнаружены, а затем и решены графические конфликты отображения данных.
На представленной схеме показана обобщенная версия процесса генерализации данных, а также определены некоторые ключевые инструменты из набора инструментов Картография (Cartography), которые помогут вам в процессе осуществления генерализации данных при переходе их отображения в более мелких масштабах.
Необходимо понимать, что большая часть инструментов геообработки в качестве выходных обычно создают новые данные, которые затем могут быть использованы в качестве входных следующими инструментами. Картографы, напротив, обычно используют рабочий процесс, характеризующийся постепенным улучшением слоев объектов, уже добавленных к документу карты. Поскольку используемые символы, свойства слоев и взаимоотношения маскирования уже определены, предпочтительно осуществлять урегулирование конфликтов и операции генерализации таким образом, чтобы не потерять эту установленную информацию. По этой причине некоторые инструменты из набора инструментов Картография изменяют исходные данные в слоях, отображаемых с помощью символов, вместо того чтобы создавать новые данные. Этот подход является наиболее удобным и функциональным в случае его использования совместно с картографическими представлениями.
Использование представлений в процессах генерализации
Представления являются опцией классов объектов базы геоданных, которая может поддерживать альтернативный способ отображения геометрии объектов. Классы пространственных объектов могут иметь несколько представлений, связанных с ними, чем поддерживается многократное отображение одних и тех же данных. Представления имеют важное значение для процесса генерализации, но необходимо понимать, что каждый класс пространственных объектов создается для определенного масштаба (или небольшого диапазона масштабов), независимо от количества связанных с ним представлений. Поэтому существует заблуждение, что, поскольку можно использовать представления для нескольких отображений набора объектов, то представления можно также использовать для отображения одних и тех же объектов в различных масштабах. Небольшие изменения масштаба могут быть выполнены путем внесения незначительных изменений в геометрию некоторых объектов или даже путем их скрытия. Однако сохраняются отношения типа один-к-одному, т.е. несмотря на то что каждый объект может иметь несколько способов отображения, объекты не могут быть объединены в новые объекты. Например, набор отдельных строений не может быть показан как застроенная территория только с использованием показа представлений. Для полной, настоящей поддержки картографирования в нескольких масштабах объекты должны быть надлежащим образом обработаны, чтобы обеспечить их необходимую плотность и детализацию и предотвратить конфликты отображения объектов с помощью символов. Инструменты из групп Генерализация и Конфликты графики могут помочь выполнить эту задачу.
Более подробно о решении конфликтов и генерализации
Представления характеризуются одним из двух типов поведения при редактировании. Настройка редактирования – это свойство представления, которое устанавливается, когда представление создается для класса пространственных объектов.
- Сохранять изменения геометрии как замещающие представления – настройка по умолчанию. Это означает, что изменения в геометрии объектов будут храниться в отдельном поле BLOB атрибутивной таблицы класса пространственных объектов и являются доступными только для текущего представления. Основная геометрия объекта, хранящаяся в поле Shape, остается без изменений.
- Изменять геометрию соответствующих объектов – С этой опцией изменения геометрии будут отражаться в поле ShapeShape класса пространственных объектов, что отразится на всех представлениях, связанных с классом пространственных объектов.
Некоторые инструменты генерализации изменяют входные слои; новые наборы данных в этом случае не создаются. Это называется входные/выходные расчетные данные. Настоятельно рекомендуется для слоев с представлениями использовать опцию Сохранять изменения геометрии как замещающие представления, особенно при работе с инструментами устранения конфликтов графики (Решить конфликты дорог, Распространить сдвиг и Решить конфликты зданий), поскольку эти инструменты изменяют геометрию объектов входных слоев. Эта опция позволяет изменения объектов, которые осуществляются подобными инструментами, сохранять в качестве замещений в представлениях, исходная геометрия при этом остается без изменений. Преимуществом такой работы является то, что исходная геометрия объектов легко доступна (она хранится в поле Shape) для визуальной оценки, и к ней можно вернуться в том случае, если результаты обработки вас не устроили.
Представления также целесообразно использовать при генерализации данных большого диапазона масштабов. В идеале, возможным является осуществление с помощью генерализации значительных уменьшений масштаба, однако на практике, как правило, для обработки все-таки необходимы промежуточные масштабы. Подготовка данных для их отображения в промежуточных масштабах в целях такого масштабного перехода может преувеличивать неточности, поскольку могут приниматься различные решения по итогам анализа изображения. Рассмотрим, например, объект A, перемещенный, чтобы разместить объект B на крупномасштабной карте. На карте меньшего масштаба объект B отсутствует, и не существует простого способа определить, что объект A был смещен или установить, откуда он перемещен. В этом случае ненужная неточность распространяется на следующий меньший масштаб. Замещение представления в данном случае помогает, поскольку вы можете быстро и легко определить исходное положение объекта и вернуться к нему в случае необходимости.
Построение инструментов генерализации в цепочки в ModelBuilder
Инструменты генерализации могут использовать несколько входных слоев, то есть список из одного или нескольких классов объектов. Многие инструменты геообработки принимают множество значений (например, инструмент Объединить); но инструменты генерализации отличаются тем, что они поддерживают также множественные выходные данные. В связи с этим вам необходимо знать некоторые методы работы с ModelBuilder, чтобы создать нужную вам модель. Эти методы описываются ниже.
Цепочки инструментов с несколькими значениями входных и выходных данных
Инструменты Проредить дорожную сеть, Решить конфликты дорог и Решить конфликты зданий выводят несколько выходных данных. Это означает, что только инструменты, поддерживающие несколько входных значений, могут непосредственно использовать выходные данные этих инструментов. Например, если три слоя используются в качестве входных для инструмента Проредить дорожную сеть, и вы хотите использовать эти три слоя в качестве входных для инструмента Решить конфликты дорог после того, как дороги прорежены, вы можете использовать выходные данные инструмента Проредить дорожную сеть непосредственно для инструмента Решить конфликты дорог.
Можно использовать инструмент Собрать значения, чтобы добавить больше слоев к многозначному параметру. В примере ниже показано добавление ещё двух слоёв к выходным данным инструмента Проредить дорожную сеть для создания входных данных для инструмента Решить конфликты дорог.
Использование в цепочке инструментов нескольких выходных слоев в качестве одного входного
Для последовательного использования инструментов, выводящих множество выходных данных, и инструмента, принимающего единичные входные данные, можно использовать инструмент Геометрическое соединение для слияния нескольких классов объектов. Примером такого рабочего процесса может быть геометрическое соединение нескольких входных слоев дорог, обработанных с помощью инструмента Проредить дорожную сеть, для использования их в качестве входных данных инструмента Слияние фрагментов дорог, поддерживающего один входной слой.
Индивидуальная обработка нескольких входных слоев
В некоторых случаях может оказаться необходимым индивидуальная передача в качестве входного для следующего инструмента каких-либо из нескольких выходных слоев, полученных предыдущим инструментом обработки. Это может произойти в том случае, если вы не хотите обрабатывать следующим инструментом все полученные предыдущим выходные данные или если вам требуется установить специфические параметры для каждого входного слоя с целью его обработки следующим инструментом. Например, инструмент Решить конфликты зданий позволяет полностью контролировать способ, с помощью которого каждый входной слой определяется как барьер. В подобных случаях используйте один и тот же набор слоев в качестве входного для обоих инструментов, а выходные данные первого инструмента установите в качестве предварительного условия выполнения второго инструмента. Это обеспечит корректный порядок обработки, как показано ниже. Этот подход применим только в том случае, если первый инструмент, к примеру, инструмент Решить конфликты дорог, изменяет данные входные слои, а не создает новые выходные слои.
Более подробно об использовании предварительных условий в ModelBuilder
Ниже приводится пример, где три слоя, содержащие данные транспортировки, используются в качестве входных в обоих инструментах. Это является возможным в связи с тем, что эти слои изменяются инструментом Решить конфликты дорог (Resolve Road Conflicts); новые выходные классы пространственных объектов при этом не создаются. Выходные данные инструмента Решить конфликты дорог используются в качестве предварительного условия обработки с использованием инструмента Решить конфликты зданий; это позволит обеспечить тот факт, что инструмент Решить конфликты дорог закончит работу до начала процессы обработки данных инструментом Решить конфликты зданий.
Входные данные, отображаемые с помощью символов
Для последовательного использования инструментов, принимающих только отображаемые символами слои, необходимо использовать инструменты Создать векторный слой и Применить символы слоя, чтобы подготовить выходной слой для последовательной обработки в среде ModelBuilder и в среде написания скриптов.
Пример скрипта Python, осуществляющего подготовку данных для их отображения в более мелком масштабе
Пример рабочего процесса набора инструментов Картография (автономный скрипт )
Этот автономный скрипт представляет пример рабочего процесса с использованием ряда инструментов из набора инструментов Картография для генерализации данных в масштабе 1:25 000 и разрешения графических конфликтов для отображения в масштабе 1:50 000.
# Name: cartography_workflow_script.py
# Description: Process features in order to resolve graphic conflicts when
# changing scales from 25K to 50K.
#
# Tools used = Aggregate Polygons, Align Marker To Stroke Or Fill, Apply
# Symbology From Layer, Create Overpass, Create Underpass, Calculate
# Line Caps, Eliminate Polygon Part, Make Feature Layer, Merge
# Divided Roads, Propagate Displacement, Resolve Building Conflicts
# Resolve Road Conflicts, Select, Select Layer By Attribute, Set
# Representation Control Point At Intersect, Set Representation
# Control Point By Angle, Simplify Building,Simplify Line, Simplify
# Polygon, Smooth Line, Smooth Polygon, Thin Road Network
# Minimum ArcGIS version = 10
# Author: ESRI
#
# The geodatabase used in this workflow is assumed to be in c:\data
# - please replace this path to your machine specific folder.
# Import system modules
import arcpy, sys, os
from arcpy import env
# Start the processing
env.workspace = "C:/data/cartography.gdb"
# The data was captured at a scale of 1:24000, and this workflow will produce
# data appropriate for a scale of 1:50000.
# Most of the geoprocessing tools in this workflow require a reference scale
env.referenceScale = "50000"
env.cartographicCoordinateSystem = ""
###############
# HYDROGRAPHY #
###############
# A subset of linear features (rivers/streams) will be processed
# for simplification and smoothing
# A subset of polygonal features (reservoirs/lakes) will be procesed
# for simplification and smoothing
# The workspace is set to the hydrography feature dataset
env.workspace = "C:/data/cartography.gdb/hydrography"
# Linear hydrographic features
arcpy.MakeFeatureLayer_management("streamnetwork", "streamlayer", "", "", "")
# A selection is made for features which are rivers/streams
arcpy.SelectLayerByAttribute_management("streamlayer", "NEW_SELECTION",
'"FCsubtype" = 1')
# In order to reduce the complexity from the streams, vertices are removed using
# the Simplify Line tool
arcpy.SimplifyLine_cartography("streamlayer", "streams_simplified",
"BEND_SIMPLIFY", "100 meters", "RESOLVE_ERRORS")
# In order to reduce the amount or severity of sharp angles, Smooth Line is used
# to improve the shape of the streams
arcpy.SmoothLine_cartography("streams_simplified", "streams",
"BEZIER_INTERPOLATION", "#", "0", 'FLAG_ERRORS')
# Some of the processed features are intermittent rivers or streams and are
# symbolized as dashed lines. When symbolized with representations, the dashes
# can be centered around corners to improve the look of the features. The corners
# are identified as vertices which will be flagged as representation control
# points. Representation symbology is applied to a feature layer in order to be
# processed for control points.
# To place dashes at corners, representation symbology needs to be used by
# the feature layer.
arcpy.MakeFeatureLayer_management("streams", "streamslayer", "", "", "")
# Representation symbology is applied to a feature layer in order to be
# processed for control points.
arcpy.ApplySymbologyFromLayer_management("streamslayer",
"C:/data/stream_symbols.lyr")
# The dashes in the stream symbol will be placed at control points created
# anywhere an angle is less than (or equal to) 130 degrees.
arcpy.SetRepresentationControlPointByAngle_cartography("streamslayer", "130")
# Polygonal hydrographic features
# A selection is made to create a new feature class for reservoirs.
arcpy.Select_analysis("openwater", "reservoirs", '"FCsubtype" = 4')
# A selection is made to create a separate feature class for processing in order
# to generate lakes.
arcpy.Select_analysis("openwater", "water_select", '"FCsubtype" <> 4')
# In order to reduce the complexity from the lakes, vertices are removed using
# the Simplify Line tool.
arcpy.SimplifyPolygon_cartography("water_select", "water_simplified",
"BEND_SIMPLIFY", "100 meters", "0",
"RESOLVE_ERRORS")
# In order to reduce the amount (or severity) of sharp angles, Smooth Line is
# used to improve the shape of the lakes.
arcpy.SmoothPolygon_cartography("water_simplified", "lakes",
"BEZIER_INTERPOLATION", "0", "", "FLAG_ERRORS")
#############
# RAILROADS #
#############
# Set the workspace to the transportation feature dataset
env.workspace = "C:/data/cartography.gdb/transportation"
# In order to reduce the complexity from the railroads, vertices are removed
# using the Simplify Line tool.
arcpy.SimplifyLine_cartography("railnetwork", "rail_simplified",
"BEND_SIMPLIFY", "100 meters", "RESOLVE_ERRORS")
# The Merge Divided Roads tool requires symbolized features, so pre-made
# symbology is provided to the feature layer.
arcpy.MakeFeatureLayer_management("rail_simplified", "railwaylayer", "", "", "")
# In this workflow, the symbology being applied is Representations
arcpy.ApplySymbologyFromLayer_management("railwaylayer",
"C:/data/rail_symbols.lyr")
# The Merge Divided Roads tool will be used to generates single line railroad
# features in place of multiple divided railroad lanes.
arcpy.MergeDividedRoads_cartography("railwaylayer", "level", "25 Meters",
"railways")
# To place markers at corners, representation symbology needs to be used by
# the feature layer.
arcpy.MakeFeatureLayer_management("railways", "railwayslayer", "", "", "")
# Representation symbology is applied to a feature layer in order to be
# processed for control points.
arcpy.ApplySymbologyFromLayer_management("railwayslayer",
"C:/data/rail_symbols.lyr")
# The tick marks in railroad symbol (markers) will be placed at control points
# created anywhere an angle is less than (or equal to) 130 degrees.
arcpy.SetRepresentationControlPointByAngle_cartography("railwayslayer", "130")
###########
# LANDUSE #
###########
# Set the workspace to the landuse feature dataset
env.workspace = "C:/data/cartography.gdb/landuse"
# The polygons which represent landcover have holes in them where buildings are
# located. The holes need to be removed so they will not appear after buildings
# have moved. In this example, any hole which is less than 50 percent of the
# feature's area will be removed.
arcpy.EliminatePolygonPart_management("cultural", "urban_area", "PERCENT", "0",
"50", "CONTAINED_ONLY")
##############
# BOUNDARIES #
##############
# The boundary features have dashed outlines which are not in phase with each
# other on shared edges between features. To make the dashed outlines in phase
# with each other, representation control points are added wherever features
# share coincident vertices. The control points are then added to the features
# symbolized with Representations.
arcpy.SetRepresentationControlPointAtIntersect_cartography
("C:/data/boundaries.lyr", "C:/data/boundaries.lyr")
#########
# ROADS #
#########
# Set the workspace to the transportation feature dataset
env.workspace = "C:/data/cartography.gdb/transportation"
# Linear features
# Roads which are dead ends (or cul-de-sacs) should have their Line ending
# property set to BUTT.
arcpy.CalculateLineCaps_cartography("C:/data/road_symbols.lyr", "BUTT",
"CASED_LINE_DANGLE")
# Thin Road Network identifies a subset of road segments that can be removed from
# the display to create a simplified road network that retains the connectivity
# and general character of the input collection. Features are flagged for removal
# when their attribute value in the "invisible" field equals one. A layer
# definition query can be used to display the resulting simplified feature class.
arcpy.ThinRoadNetwork_cartography("roadnetwork", "500 meters", "invisible",
"level")
# The Merge Divided Roads tool will be used to generates single line road
# features in place of multiple divided road lanes.
arcpy.MergeDividedRoads_cartography("C:/data/road_symbols.lyr", "level",
"25 meters", "roads")
# The Resolve Road Conflicts tool requires symbolized features, so pre-made
# symbology is provided to the feature layer.
arcpy.MakeFeatureLayer_management("roads", "roadslayer", "", "", "")
# In this workflow, the symbology being applied is Representations
arcpy.ApplySymbologyFromLayer_management("roadslayer",
"C:/data/road_symbols.lyr")
# The Resolve Road Conflicts tool does not produce output road layers but instead
# alters the source feature classes of the input road layers. The Resolve Road
# Conflicts tool adjusts line features to ensure that they are graphically
# distinguishable when symbolized at output scale.
arcpy.ResolveRoadConflicts_cartography
("roadslayer", "level", "C:/data/cartography.gdb/buildings/displacement")
# The dashes in the road symbols will be placed at control points created
# anywhere an angle is less than (or equal to) 130 degrees.
arcpy.SetRepresentationControlPointByAngle_cartography("roadslayer", "130")
# Create bridges
# The Create Overpass tool will create a bridge for the roads and a mask for the
# streams wherever a road goes over a steam.
arcpy.CreateOverpass_cartography("roadslayer", "streamslayer", "2 points",
"1 points", "over_mask_fc", "over_mask_rc",
'"BridgeCategory" = 1', "bridges",
"ANGLED", "1 points")
# Create tunnels
# The Create Overpass tool will create a tunnel for the railroads and a mask for
# the railroads wherever a railroad goes under a road.
arcpy.CreateUnderpass_cartography("roadslayer", "railwayslayer", "2 points",
"1 points", "under_mask_fc", "under_mask_rc",
'"RelationshipToSurface" = 3', "tunnels",
"ANGLED", "1 points")
#############
# BUILDINGS #
#############
# Set the workspace to the buildings feature dataset
env.workspace = "C:/data/cartography.gdb/buildings"
# Point features
# When the road features were adjusted by the Resolve Road Conflicts tool, the
# spatial relationship with nearby buildings was affected. A displacement feature
# class was created by that tool in order to record the change applied to the
# roads. This information can be used by the Propagate Displacement tool to apply
# the same change to the point buildings.
# The road displacement is propagated to the point buildings
arcpy.PropagateDisplacement_cartography("point_bldg", "displacement", "AUTO")
# Point buildings will be rotated against nearby linear roads
# The Align Markers To Stroke Or Fill tool can do this with features symbolized
# with Representations.
# A feature layer is made for point buildings
arcpy.MakeFeatureLayer_management("point_bldg", "bldglayer", "", "", "")
# The symbology is switched to Representations
arcpy.ApplySymbologyFromLayer_management("bldglayer", "C:/data/bldg_symbols.lyr")
# The Align Marker to Stroke Or Fill tool is used to align point buildings to
# face road features within 5 points of the buildings
arcpy.AlignMarkerToStrokeOrFill_cartography("bldglayer", "roadslayer",
"5 points", "PERPENDICULAR")
# Polgyonal features
# When the road features were adjusted by the Resolve Road Conflicts tool, the
# spatial relationship with nearby buildings was affected. A displacement
# feature class was created by that tool in order to record the change applied
# to the roads. This information can be used by the Propagate Displacement tool
# to apply the same change to the polygonal buildings.
# The road displacement is propagated to polygon buildings
arcpy.PropagateDisplacement_cartography("footprints", "displacement", "SOLID")
# A selection is made to create a feature class with buildings larger than
# a minimum size
# The small buildings are not appropriate at the new map scale of 1:50,000
arcpy.Select_analysis("footprints", "buildings_select", '"Shape_Area" > 100')
# There is a need to create better spacing between polygon buildings and combine
# them when they share edges or are very close together
# The Aggregate Polygons tool is used to accomplish this task
arcpy.AggregatePolygons_cartography("buildings_select", "large_buildings",
"20 meters", "", "", "ORTHOGONAL")
# In order to reduce the complexity of the buildings, indentations, extensions
# and extra vertices are removed using the Simplify Building tool.
# Buildings require less visible detail at the new scale of 1:50,000.
arcpy.SimplifyBuilding_cartography("large_buildings", "area_bldg", "20 meters",
"0 unknown", "CHECK_CONFLICTS")
# All buildings require further improvements to achieve better spacing between
# themselves and other nearby features. At the new scale of 1:50,000 the
# symbolized buildings may overlap other features and create a visually congested
# map. To improve the visual congestion, the Resolve Building Conflicts tool is
# used. Buildings are improved in the context of their surrounding features.
# These features are considered barriers to buildings. The Resolve Building
# Conflicts tool requires symbolized features and has several options available
# to improve the buildings. Options include: moving or resizing the buildings,
# orienting or snapping the buildings to nearby features, as well as making the
# buildings invisible. Buildings from multiple feature classes can be used as
# inputs to the tool. Barriers from multiple feature classes can be used as
# inputs to the tool. For each barrier, the option is available to specify a snap
# or orient action for the buildings when they are within a specified distance.
# For each barrier, the option is available to specify a minimum distance for
# buildings to maintain between them.
# A feature layer is made for the polygon buildings
arcpy.MakeFeatureLayer_management("area_bldg", "footprintlayer", "", "", "")
# The symbology is switched to Representations
arcpy.ApplySymbologyFromLayer_management("footprintlayer",
"C:/data/footprint_symbols.lyr")
# The Resolve Building Conflicts tool is run with point and polygon buildings
# against roads, streams and railroads. The buildings will be moved away from
# streams and railroads until they reach a minimum distance. The buildings
# within a maximum distance from the roads will be rotated. Further movement
# and rotation may still be required by the tool in order to resolve any
# remaining graphic conflict.
arcpy.ResolveBuildingConflicts_cartography("footprintlayer; bldglayer", "invisible",
"'roadslayer' 'true' '5 meters';'streamslayer' 'false' '5 meters';'railwayslayer' 'false' '10 meters'",
"10 meters", "20 meters", "level")