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 secuencias de comandos 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 intentó usar los datos comienza con la comprensión de la escala de destino, las especificaciones de visualización que incluye la simbología y el objetivo subyacente o intención del mapa. Siguiendo este proceso, se realizan las operaciones para reducir el número total de entidades sin impactar en la conectividad o carácter del dataset. A continuación, se disminuye la complejidad de la entidades individuales quitando los vértices u otros detalles de la 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 organigrama muestra una versión simplificada de un flujo de trabajo de generalización e identifica las herramientas clave de la caja de herramientas Cartografía que puede ayudar en la generalización de los datos para la visualización en una 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 contraste, los cartógrafos generalmente siguen un flujo de trabajo que está caracterizado por una mejora en incremento 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 cumplen un rol ventajoso en la generalización, pero debe entender que se crea una clase de entidad simple para una escala específica (o un pequeño rango de escala) sin importar cuántas representaciones estén asociadas a ella. Es tentador pensar que al poder usar las representaciones para admitir varias visualizaciones de un conjunto de entidades, también se pueden usar las representaciones para dibujar las mismas entidades en diferentes escalas. Se pueden lograr algunos pequeños cambios de escala haciendo algunos ajustes menores a las formas de algunas entidades de representación u 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 que se encuentran en los conjuntos de herramientas Generalización y Conflictos de gráfico pueden facilitar la tarea.
Más información acerca de 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 a geometría como excepción de representación. 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 Forma se mantiene intacta.
- Cambiar la geometría de la entidad soporte. Con esta configuración, las modificaciones a la geometría de las entidades modificarán el campo Forma actual de la clase de entidad, impactando en cualquier otra representación asociada a la clase de entidad.
Algunas de las herramientas de generalización modifican sus capas de entrada; no se crean nuevos datasets. Esto se denomina datos derivados de entrada/salida. Se recomienda utilizar capas que apunten a representaciones con la configuración Almacenar cambio a geometría como excepción de representación, especialmente cuando se trabaja con las herramientas de conflictos de gráfico (Resolver conflictos de carretera, Propagar desplazamiento o Resolver conflictos de edificio) debido a 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 Forma) para comparar 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, tenga en cuenta que la entidad A se desplaza para darle lugar a la entidad B en un mapa de gran escala. En un mapa con una escala más pequeña, la entidad B no aparece más, pero no hay una manera fácil de ver que A se desplazó o determinar de dónde proviene. 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.
Conectar las 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 valores múltiples (como la herramienta Combinación), pero las herramientas de generalización difieren levemente ya que también tienen 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 tienen valores múltiples como 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 usan tres capas como entradas para la herramienta Simplificar red de carreteras y desea usar esas mismas capas como entradas para la herramienta Resolver conflictos de carretera después de haber sido simplificadas, puede conectar la salida de la herramienta Simplificar red de carreteras directamente a la herramienta Resolver conflictos de carretera.
Puede usar la herramienta Adquirir valores para agregar más capas a un valor múltiple.En el siguiente ejemplo se muestra cómo agregar 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 conectar herramientas que tengan una salida de valor múltiple a una herramienta que acepte una entrada única, use la herramienta Adjuntar para fusionar varias clases de entidad. Un ejemplo de este flujo de trabajo es adjuntar capas de entrada de varias carreteras que fueron procesadas con la herramienta Simplificar red de carreteras para utilizarlas como entrada para la herramienta Fusionar carreteras divididas, que acepta sólo una única 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 tener control completo sobre la forma en que cada capa de entrada se define como 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 sólo se puede aplicar cuando la primera herramienta, por ejemplo Resolver conflictos de carretera, modifica capas de entrada en lugar de crear nuevas capas de salida.
Más información acerca del uso de condiciones previas en ModelBuilder
En el siguiente ejemplo, las tres capas de transporte se usan como entradas para ambas herramientas. Esto es posible debido a que estas capas están modificadas por 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 usa como una condición previa del proceso de la herramienta Resolver conflictos de edificio para garantizar que la herramienta Resolver conflictos de carretera complete el proceso antes de que se inicie la herramienta Resolver conflictos de edificio.
Entradas simbolizadas
Para conectar herramientas que sólo aceptan capas simbolizadas, deberá usar la herramienta Crear capa de entidad y la herramienta Aplicar simbología de capa para preparar una capa de salida para conectar en ModelBuilder así como en entornos de secuencias de comandos.
Secuencia de comandos 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 (secuencia de comandos de Python independiente)
Esta secuencia de comandos 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")