Автоматизирование урегулирования конфликтов и процессов генерализации с процессами геообработки

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

Среда геообработки ArcGIS отлично подходит для разработки структуры генерализации, так как может управлять преобразованием данных с помощью отдельных шагов, определяемых специальными переменными, обусловленными масштабом, типом данных и продуктом. Эти шаги могут составлять логическую цепочку действий или могут быть связаны в единый скрипт. Задачи можно с легкостью повторять для различных групп объектов или с использованием различных параметров, скомбинированных множеством способов. Рабочие процессы могут быть автоматизированы целиком, либо они могут быть поделены на более мелкие подпроцессы, между которыми может иметь место редактирование и проверка вручную.

Включение задач генерализации в картографические рабочие процессы

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

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

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

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

Построение инструментов генерализации в цепочки в 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
#              Control Point At Intersect, Set Control Point By Angle, Simplify 
#              Building, Simplify Line, Simplify Polygon, Smooth Line, Smooth 
#              Polygon, Thin Road Network
# Minimum ArcGIS Pro version = 2.1
#
# 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

# Start the processing
arcpy.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
arcpy.env.referenceScale = "50000"
arcpy.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 processed
# for simplification and smoothing

# The workspace is set to the hydrography feature dataset
arcpy.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. 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 control points. Symbology from an existing layer containing
# dashed line symbols is then applied. 

# A new feature layer is created from the streams data to be used as input 
# when setting control points. 
arcpy.MakeFeatureLayer_management("streams", "streamslayer", "", "", "")

# Dashed line symbology from an existing layer is applied to the new streams 
# feature layer 
arcpy.ApplySymbologyFromLayer_management("streamslayer",
                                         "C:/data/stream_symbols.lyrx")

# 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.SetControlPointByAngle_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
arcpy.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 a feature layer
# is created using the simplified rail features, and then pre-made symbology is 
# applied from an existing feature layer.

# A feature layer is created from the simplified rail features. 
arcpy.MakeFeatureLayer_management("rail_simplified", "railwaylayer", "", "", "")

# Apply the symbology from an existing layer
arcpy.ApplySymbologyFromLayer_management("railwaylayer",
                                         "C:/data/rail_symbols.lyrx")

# 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")

# Symbolized features are required when adding control points, so a new feature
# layer is created from the output of the MergeDivvidedRoads tool.
arcpy.MakeFeatureLayer_management("railways", "railwayslayer", "", "", "")

# Pre-made railway symbology from an existing layer is applied to the 
# new railway feature layer.
arcpy.ApplySymbologyFromLayer_management("railwayslayer", 
                                         "C:/data/rail_symbols.lyrx")

# 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.SetControlPointByAngle_cartography("railwayslayer", "130")


###########
# LANDUSE #
###########

# Set the workspace to the landuse feature dataset
arcpy.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, control points are added wherever features 
# share coincident vertices.
arcpy.SetControlPointAtIntersect_cartography("C:/data/boundaries.lyrx", 
                                             "C:/data/boundaries.lyrx")


#########
# ROADS #
#########

# Set the workspace to the transportation feature dataset
arcpy.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.lyrx", "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.lyrx", "level",
                                    "25 meters", "roads")

# The Resolve Road Conflicts tool requires symbolized features, so a feature
# layer is created from the roads features so that pre-made
# symbology can the be applied to the new roads feature layer.
arcpy.MakeFeatureLayer_management("roads", "roadslayer", "", "", "")

# Pre-made symbology from an existing layer is applied to the roads feature 
# layer.
arcpy.ApplySymbologyFromLayer_management("roadslayer",
                                         "C:/data/road_symbols.lyrx")

# 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.SetControlPointByAngle_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
arcpy.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 symbolized features.

# A feature layer is made for point buildings
arcpy.MakeFeatureLayer_management("point_bldg", "bldglayer", "", "", "")

# Symbology is applied from an existing layer.
arcpy.ApplySymbologyFromLayer_management("bldglayer", 
                                         "C:/data/bldg_symbols.lyrx")

# 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", "", "", "")

# Pre-made symbology is applied from an existing layer.
arcpy.ApplySymbologyFromLayer_management("footprintlayer",
                                         "C:/data/footprint_symbols.lyrx")

# 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")

Связанные разделы