La generalización de los datos involucra varias tareas intensivas repetitivas, convirtiéndose en una candidata ideal para la automatización. Sin embargo, la naturaleza contextual y subjetiva de la generalización hace que resulte difícil automatizarla. El cerebro humano es un experto a la hora de establecer un orden de prioridades y hacer concesiones contextuales simultáneamente. Es mucho más difícil ordenar a una PC que realice esta tarea con una serie de comandos discretos.
El entorno de geoprocesamiento en ArcGIS es apto para establecer un marco de generalización, ya que puede administrar la transformación de los datos en diferentes pasos aislados dirigidos por variables específicas de datos, escala y producto. Estos pasos se pueden encadenar de manera lógica o repetirse en bucle en scripts o modelos para crear un flujo de trabajo complejo que se pueda aplicar a un rango de datos para producir bases de datos con varias escalas para la visualización de impresión o de pantalla. Las tareas se pueden repetir fácilmente en secuencia en distintos grupos de entidades o con distintos parámetros combinados de distintas maneras. Se puede automatizar flujos de trabajo enteros, o se pueden subdividir en pequeñas piezas con una verificación o edición manual en medio.
Combinar tareas de generalización en flujos de trabajo de cartografía
El proceso de creación de un mapa en una escala más pequeña que la escala para la que se pretendían usar los datos comienza con la comprensión de la escala de destino, las especificaciones de visualización, incluida la simbología, y el objetivo subyacente o la intención del mapa. A continuación, se realizan operaciones para reducir el número total de entidades sin impactar en la conectividad ni carácter del dataset. Después, se reduce la complejidad de las entidades individuales eliminando los vértices u otros detalles de entidad. Esto también puede incluir la simplificación de la complejidad dentro de los atributos de la entidad combinando subcategorías de entidades similares para la visualización con el mismo símbolo. Una vez que comienza la creación del mapa y los datos se visualizan con la simbología final en la escala final, se pueden detectar y resolver los conflictos de gráfico.
El siguiente diagrama de flujo muestra una versión simplificada de un flujo de trabajo de generalización e identifica algunas de las herramientas clave de la caja de herramientas Cartografía que contribuyen a la generalización de datos para la visualización a escala más pequeña.
Es importante entender que la mayor parte de las herramientas de geoprocesamiento generalmente generan nuevos datos como una salida que después se pueden utilizar como entrada para herramientas posteriores. En cambio, los cartógrafos generalmente siguen un flujo de trabajo que está caracterizado por una mejora incremental de las capas de entidades ya establecidas en un documento de mapa. La simbología, las propiedades de la capa y las relaciones de máscara ya están definidas, por eso, a continuación es preferible modificar las capas de entrada ya que las operaciones de resolución de conflictos y generalización se realizan de manera que no se pierda esta información. Por esta razón, algunas de las herramientas en la caja de herramientas Cartografía modifican los datos de entrada en las capas simbolizadas en lugar de crear los datos. Este enfoque resultar particularmente fácil de alcanzar y poderoso cuando se utiliza en conjunción con las representaciones cartográficas.
Utilizar representaciones para respaldar la generalización
Las representaciones son una propiedad de las clases de entidad de geodatabase que pueden admitir una visualización alternativa de la geometría de las entidades. Las clases de entidad pueden tener varias representaciones asociadas a ellas y, por lo tanto, admiten varias visualizaciones de los mismos datos. Las representaciones desempeñan un papel beneficioso en la generalización, pero se debe comprender que se crea una sola clase de entidad para una escala específica (o un pequeño rango de escalas) independientemente de cuántas representaciones se le asocien. Puede parecer que ser capaz de utilizar representaciones para admitir varias vistas de un conjunto de entidades significa que las representaciones se pueden utilizar para dibujar las mismas entidades a diferentes escalas. Se pueden lograr algunos pequeños cambios de escala haciendo algunos ajustes menores en las formas de algunas entidades de representación, o incluso ocultando algunas. Pero existe una relación de uno a uno aún entre las representaciones; cada entidad puede tener una o más visualizaciones alternativas, pero las entidades no se pueden combinar y formar nuevas entidades. Por ejemplo, un conjunto de edificios discretos no se pueden modelar como un área urbanizada utilizando una visualización de representación solamente. Para poder admitir verdaderamente una representación cartográfica de varias escalas, las entidades se deben procesar correctamente para asegurar una densidad de entidad y detalles razonables y para evitar los conflictos simbolizados. Las herramientas de los conjuntos de herramientas Generalización y Conflictos de gráfico pueden ayudarle a conseguirlo.
Más información sobre la resolución de conflictos y la generalización
Las representaciones presentan una de las dos configuraciones de comportamiento de edición. La configuración de la edición es una propiedad de una representación y se establece cuando se crea la representación en una clase de entidad.
- Almacenar cambio en geometría como excepción de representación: esta es la configuración predeterminada. Significa que las modificaciones a la geometría de las entidades se almacenarán en un campo BLOB separado en la tabla de atributos de la clase de entidad, a la que sólo se puede obtener acceso a través de la representación actual. La geometría base de la entidad almacenada en el campo Shape se deja intacta.
- Cambiar la geometría de la entidad compatible: con esta opción, las modificaciones a la geometría de entidades modificarán el propio campo Shape de la clase de entidad, lo que afecta a cualquier otra representación asociada con la clase de entidad.
Algunas de las herramientas de generalización modifican sus capas de entrada; no se crean nuevos datasets. Esto se conoce como datos derivados de entrada y salida. Se recomienda encarecidamente que utilice capas que apunten a representaciones con la configuración Almacenar cambio en geometría como excepción de representación, especialmente cuando trabaje con las herramientas de conflicto de gráfico (Resolver conflictos de carretera, Propagar desplazamiento o Resolver conflictos de edificio), ya que estas herramientas modifican la geometría de las capas de entrada. Con esta configuración, las modificaciones realizadas en las entidades con estas herramientas se almacenan como excepciones en la representación, y la geometría original no se cambia. La ventaja de trabajar de esta manera es que las formas originales de las entidades ya están disponibles (en el campo Shape) para compararlas visualmente o incluso revertir los cambios si los resultados no son los apropiados.
Las representaciones también resultan ventajosas cuando se generalizan los datos a lo largo de un rango de escala relativamente grande. Lo ideal sería que los procesos de generalización fuesen capaces de manejar grandes reducciones en escala directamente, pero generalmente se necesita una escala intermedia. Preparar los datos para la visualización en escalas intermedias para conectar la transición puede exagerar las inexactitudes, ya que se deben tomar decisiones diferentes a medida que los datos detallados se eliminan de la visualización. Por ejemplo, piense en una entidad A desplazada para alojar la entidad B en un mapa a gran escala. En mapas a escala reducida, la entidad B ya no aparece, pero no hay ninguna forma sencilla de ver que A se ha desplazado o determinar de dónde vino. En este caso, una inexactitud, ahora innecesaria, se propaga a la próxima escala más pequeña. Las excepciones de representación resultan útiles en esta situación, ya que fácilmente se puede determinar en forma visual la ubicación de inicio de una entidad y se puede revertir si es necesario.
Encadenar herramientas de generalización en ModelBuilder
Las herramientas de generalización utilizan entradas de valor múltiple, es decir, una lista de una o más clases de entidad. Muchas herramientas de geoprocesamiento aceptan varios valores (por ejemplo, la herramienta Unión), pero las herramientas de generalización son distintas en el sentido de que también producen valores múltiples de salida. Esto requiere que tenga en cuenta algunas de las técnicas de ModelBuilder para producir el modelo que desea. Estas técnicas se describen debajo.
Conectar herramientas con varias entradas y salidas
Las herramientas Simplificar red de carreteras, Resolver conflictos de carretera y Resolver conflictos de edificio producen valores múltiples de salida. Esto significa que sólo las herramientas que aceptan entradas de valores múltiples pueden utilizar la salida de estas herramientas directamente. Por ejemplo, si se utilizan tres capas como entradas de la herramienta Simplificar red de carreteras y desea utilizar dichas capas como entradas de la herramienta Resolver conflictos de carretera después de que se hayan simplificado, puede encadenar la salida de la herramienta Simplificar red de carreteras directamente a la herramienta Resolver conflictos de carretera.
Puede utilizar la herramienta Recopilar valores para agregar más capas al valor múltiple. El siguiente ejemplo muestra la adición de dos capas más a la salida de Simplificar red de carreteras para crear la entrada de Resolver conflictos de carretera.
Conectar varias salidas a una entrada única
Para encadenar herramientas que presenten una salida de valor múltiple a una herramienta que acepta una sola entrada, utilice la herramienta Incorporar para fusionar varias clases de entidad. Un ejemplo de este flujo de trabajo es incorporar varias capas de entrada de carretera que se procesaron mediante la herramienta Simplificar red de carreteras para utilizarlas como entrada para la herramienta Fusionar carreteras divididas, que acepta una sola entrada.
Conectar varias entradas en forma individual
En algunos casos, puede trasladar varias salidas de una herramienta a otra en forma individual. Este sería el caso si no desea que todas las salidas de la primera herramienta participen en la segunda herramienta, o si desea establecer parámetros específicos para cada entrada en la segunda herramienta. Por ejemplo, la herramienta Resolver conflictos de edificio permite un control total sobre la forma en que cada capa de entrada se define como una barrera. En estos casos, use el mismo conjunto de capas como entradas en las dos herramientas, pero establezca la salida de la primera herramienta como una condición previa de la segunda herramienta para imponer el correcto orden del proceso, como se muestra debajo. Este enfoque solo se puede aplicar cuando la primera herramienta, como la herramienta Resolver conflictos de carretera, modifica capas de entrada en lugar de crear nuevas capas de salida.
Más información sobre la utilización de condiciones previas en ModelBuilder
En el siguiente ejemplo, las tres capas de transporte se usan como entradas para ambas herramientas. Esto es posible porque estas capas se modifican mediante la herramienta Resolver conflictos de carretera; no se crean nuevas clases de entidad de salida. La salida de la herramienta Resolver conflictos de carretera se utiliza como condición previa para el procesamiento de la herramienta Resolver conflictos de edificio para garantizar que la herramienta Resolver conflictos de carretera complete el procesamiento antes de que se inicie la herramienta Resolver conflictos de carretera.
Entradas simbolizadas
Para conectar herramientas que solo acepten capas simbolizadas, necesitará utilizar la herramienta Crear capa de entidades y la herramienta Aplicar simbología de capa para preparar una capa de salida para encadenar en ModelBuilder, así como en entornos de script.
Script de muestra de Python para preparar los datos para la visualización en una escala más pequeña
Ejemplo de flujo de trabajo de la caja de herramientas Cartografía (script independiente)
Esta script independiente revisa un flujo de trabajo de muestra usando un número de herramientas de la caja de herramientas Cartografía para generalizar datos con una escala de 1:25.000 y resolver conflictos de gráfico para visualizar en una escala de 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")