Comme la généralisation de données implique beaucoup de tâches répétitives et fastidieuses, elle se prête à l’automatisation. Toutefois, la nature contextuelle et subjective de la généralisation la rend difficile à automatiser. Le cerveau humain est capable d’établir des priorités et de faire en même temps des concessions en fonction du contexte. En revanche, il est beaucoup plus difficile d’indiquer à un ordinateur de faire la même chose avec une série de commandes discrètes.
L’environnement de géotraitement dans ArcGIS est idéal pour établir une structure de généralisation. Il permet, en effet, de gérer la transformation de données au cours d’étapes isolées distinctes s’appuyant sur des variables de données, d’échelle et spécifiques au produit. Ces étapes peuvent être logiquement reliées entre elles ou même répétées sous forme de boucle dans des scripts ou des modèles pour créer un workflow complexe. Ce dernier peut être appliqué à une plage de données afin de produire des bases de données multi-échelles pour l’impression ou l’affichage à l’écran. Les tâches peuvent être aisément répétées en séquences et appliquées à différents groupes d’entités ou avec différents paramètres combinés de plusieurs manières. Des workflows entiers peuvent être automatisés ou subdivisés en plus petits morceaux après avoir été mis à jour manuellement ou vérifiés.
Combinaison des tâches de généralisation en workflows cartographiques
Le processus de création d’une carte à une plus petite échelle que celle pour laquelle les données étaient prévues commence par une évaluation de l’échelle cible, des caractéristiques d’affichage, symbologie comprise, et de l’utilisation prévue ou sous-jacente de la carte. Puis, des opérations sont effectuées pour limiter le nombre total d’entités sans nuire à la connectivité ou au caractère du jeu de données. Il convient enfin de réduire le niveau de complexité de chaque entité en supprimant des sommets ou d’autres détails d’entités. Cela peut concerner également les attributs d’entité en combinant des sous-catégories similaires d’entités qui seront affichées avec le même symbole. Une fois que la carte est produite et que les données sont affichées avec leur symbologie finale à l’échelle finale, les conflits graphiques peuvent être détectés et résolus.
L’organigramme suivant présente une version simplifiée d’un workflow de généralisation et identifie les outils clés de la boîte à outils Cartographie permettant de généraliser les données pour les afficher à une plus petite échelle.
Il est important de comprendre que la plupart des outils de géotraitement génèrent, en général, de nouvelles données en sortie, exploitables à leur tour par d’autres outils. Cela n’est pas le cas des cartographes, qui suivent, en principe, un processus caractérisé par l’amélioration successive des couches d’entités déjà établies dans une carte. La symbologie, les propriétés de couche et les relations de masquage sont déjà définies. Il est donc préférable de modifier les couches en entrée lors de la résolution des conflits et de la généralisation pour ne pas perdre ces informations. Pour cette raison, certains des outils de la boîte à outils Cartographie modifient les données en entrée dans les couches symbolisées au lieu de créer des données. Cette approche est particulièrement facile à gérer et efficace lorsqu’elle est utilisée avec des représentations cartographiques.
Utilisation de représentations pour la prise en charge de la généralisation
Les représentations sont une propriété des classes d’entités de géodatabase qui leur permet d’afficher différemment la géométrie des entités. Plusieurs représentations peuvent être associées aux classes d’entités, ce qui permet à ces dernières d’afficher de différentes manières les mêmes données. Les représentations jouent un rôle primordial dans la généralisation, mais il faut tenir compte du fait qu’une seule classe d’entités est créée pour une échelle spécifique (ou une petite plage d’échelles), quel que soit le nombre de représentations qui lui sont associées. Étant donné que les représentations permettent d’afficher un ensemble d’entités de plusieurs manières, on peut supposer qu’elles sont aptes à présenter les mêmes entités à plusieurs échelles. Il est possible de réaliser des petits changements harmonieux d’échelles en modifiant légèrement les formes de certaines entités de représentation ou en en masquant quelques-unes. Mais la relation un à un est maintenue avec les représentations ; chaque entité peut avoir un ou plusieurs affichages, mais les entités ne peuvent pas être combinées pour former de nouvelles entités. Par exemple, un ensemble de bâtiments discrets ne peut pas être modélisé en tant que zone construite uniquement à l’aide de l’affichage d’une représentation. Pour vraiment prendre en charge la cartographie multi-échelle, les entités doivent être traitées convenablement pour éviter une trop grande densité d’entités et une surcharge de détails ainsi que des conflits de symboles. Les outils disponibles dans les jeux d’outils Généralisation et Conflits graphiques peuvent vous aider à y parvenir.
Pour en savoir plus sur la résolution des conflits et la généralisation
Deux comportements de mise à jour sont possibles pour les représentations. Le paramètre de mise à jour est une propriété d’une représentation qui est établi lorsqu’une représentation est créée sur une classe d’entités.
- Store change to geometry as representation override (Enregistrer la modification dans la géométrie en tant que débrayage de la représentation)—Il s’agit du paramètre par défaut. Ce paramètre indique que les modifications apportées à la géométrie des entités seront enregistrées dans un champ BLOB distinct dans la table attributaire de classe d’entités, lequel est uniquement accessible par le biais de la représentation employée. La géométrie de base de l’entité stockée dans le champ Shape n’est pas modifiée.
- Modifier la géométrie de l’entité : lorsque ce paramètre est activé, les modifications apportées à la géométrie des entités sont répercutées au champ Shape de la classe d’entités. Les autres représentations associées à la classe d’entités sont modifiées en conséquence.
Certains outils de généralisation modifient leurs couches en entrée ; cela n’a pas pour effet de créer de nouveaux jeux de données. Les données produites sont appelées données dérivées en entrée/sortie. Nous vous conseillons vivement d’utiliser des couches pointant vers des représentations avec le paramètre Enregistrer la modification dans la géométrie en tant que remplacement de la représentation), surtout si vous exécutez les outils de résolution de conflits graphiques (Résoudre des conflits de routes, Propager le déplacement ou Résoudre des conflits de construction), car ces outils modifient la géométrie des couches en entrée. Avec ce paramètre, les modifications apportées aux entités avec ces outils sont enregistrées en tant que débrayages dans la représentation et la géométrie d’origine n’est pas modifiée. Cela est très utile, car les formes d’origine des entités (dans le champ Shape) peuvent être comparées aux entités modifiées et elles peuvent être rétablies si les résultats ne conviennent pas.
Les représentations sont également très utiles pour généraliser des données sur des échelles assez grandes. Dans l’idéal, les processus de généralisation doivent être en mesure de traiter directement des réductions d’échelle importantes, mais une échelle intermédiaire est en général nécessaire. La préparation des données pour les afficher graduellement à des échelles intermédiaires peut exagérer les imprécisions, car différentes décisions doivent être prises à mesure que des données détaillées disparaissent. Prenons l’exemple d’une entité A qui est déplacée pour permettre l’affichage d’une entité B sur une carte à grande échelle. Sur une carte à plus petite échelle, l’entité B n’apparaît plus, mais il n’y a aucun moyen aisé de voir que l’entité A a été déplacée ou de déterminer son emplacement d’origine. Dans ce cas, cette imprécision inutile est propagée aux plus petites échelles. Les débrayages de représentation permettent de remédier à cette situation, car vous pouvez rapidement et facilement déterminer visuellement l’emplacement de départ d’une entité et le rétablir si nécessaire.
Liaison d’outils de généralisation dans ModelBuilder
Les outils de généralisation ont recours à des entrées à valeurs multiples, c’est-à-dire, à une liste d’une ou plusieurs classes d’entités. Beaucoup d’outils de géotraitement acceptent les valeurs multiples (comme l’outil Agréger), mais les outils de généralisation sont un peu différents, car ils produisent également des valeurs multiples en sortie. Par conséquent, vous devez maîtriser quelques techniques de ModelBuilder pour produire le modèle désiré. Ces techniques sont abordées ci-dessous.
Liaison d’outils avec plusieurs entrées et sorties
Les outils Éclaircir le réseau routier, Résoudre des conflits de routes et Résoudre des conflits de construction produisent des valeurs multiples en sortie. Cela signifie que seuls les outils qui acceptent des entrées à valeurs multiples peuvent utiliser directement les valeurs en sortie de ces outils. Par exemple, si trois couches sont utilisées en tant qu’entrées pour l’outil Éclaircir le réseau routier, et que vous souhaitez utiliser ces trois mêmes couches en tant qu’entrées pour l’outil Résoudre des conflits de routes après qu’elles ont été affinées, vous pouvez lier directement les valeurs en sortie de l’outil Éclaircir le réseau routier à l’outil Résoudre des conflits de routes.
Vous pouvez utiliser l’outil Recueillir des valeurs pour ajouter plus de couches à une valeur multiple. L’exemple suivant montre l’ajout de deux couches supplémentaires à la sortie de l’outil Éclaircir le réseau routier pour créer l’entrée de l’outil Résoudre des conflits de routes.
Liaison de plusieurs sorties à une entrée unique
Pour lier des outils qui ont une sortie à valeurs multiples à un outil qui accepte une seule entrée, utilisez l’outil Ajouter pour fusionner plusieurs classes d’entités. L’ajout de plusieurs couches de routes en entrée traitées par l’outil Éclaircir le réseau routier en vue de les utiliser comme entrée pour l’outil Fusionner des chaussées séparées (lequel accepte une seule entrée) constitue un bon exemple de ce processus.
Liaison de plusieurs entrées de façon individuelle
Dans certains cas, il peut être judicieux de transférer plusieurs sorties, une à une, d’un outil à un autre. C’est le cas, si vous ne souhaitez pas que toutes les sorties du premier outil participent au deuxième outil ou si vous souhaitez définir des paramètres spécifiques pour chaque entrée dans le deuxième outil. Par exemple, l’outil Résoudre des conflits de construction permet de contrôler totalement la manière dont chaque couche en entrée est définie en tant qu’interruption. Dans ce cas, utilisez le même ensemble de couches en tant qu’entrées pour les deux outils, mais définissez la sortie du premier outil comme condition préalable pour le deuxième outil afin d’appliquer l’ordre de traitement correct, comme illustré ci-dessous. Cette approche est uniquement applicable lorsque le premier outil (Résoudre des conflits de routes, par exemple) modifie des couches en entrée au lieu de créer de nouvelles couches en sortie.
Pour en savoir plus sur l’utilisation des conditions préalables dans ModelBuilder
Dans l’exemple ci-dessous, les trois couches de transport sont utilisées comme entrées pour les deux outils. Cela est possible, car ces couches sont modifiées par l’outil Résoudre des conflits de routes ; aucune nouvelle classe d’entités en sortie n’est créée. La sortie de l’outil Résoudre des conflits de routes est utilisée comme condition préalable à l’exécution de l’outil Résoudre des conflits de construction. Autrement dit, l’outil Résoudre des conflits de construction ne démarrera qu’une fois l’exécution de l’outil Résoudre des conflits de routes terminée.
Entrées symbolisées
Pour lier des outils qui acceptent uniquement des couches symbolisées, vous devez utiliser l’outil Générer une couche et l’outil Appliquer la symbologie d’une couche pour préparer une couche en sortie à des fins de liaison dans ModelBuilder ainsi que dans des environnements de script.
Exemple de script Python pour préparer des données pour un affichage à une plus petite échelle
Exemple de workflow de la boîte à outils Cartographie (script autonome)
Ce script autonome exécute un workflow basé sur certains outils de la boîte à outils Cartographie pour généraliser des données à l’échelle 1:25 000 et résoudre les conflits graphiques en vue d’afficher les données à l’échelle 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")