Zum Generalisieren von Daten müssen Sie viele repetitive, arbeitsintensive Tasks ausführen. Dieser Vorgang eignet sich daher ideal für die Automatisierung. Das kontextabhängige und subjektive Wesen der Generalisierung erschwert die Automatisierung jedoch. Das menschliche Gehirn ist in hohem Maße fähig, Prioritäten zu setzen und gleichzeitig kontextabhängig Zugeständnisse zu machen. Viel schwieriger ist es, einen Computer anzuweisen, dies mit einer Reihe einzelner Befehle auszuführen.
Die Geoverarbeitungsumgebung in ArcGIS eignet sich gut zur Einrichtung einer Generalisierungsumgebung, da die Transformation von Daten anhand von daten-, maßstabs- und produktspezifischen Variablen in einzelnen isolierten Schritten verwaltet werden können. Diese Schritte können logisch miteinander verknüpft oder sogar als Schleifen in Skripten oder Modellen ausgeführt werden, sodass ein komplexer Workflow entsteht, der auf einen Bereich von Daten angewendet werden kann. Damit werden Datenbanken mit mehreren Maßstäben erzeugt, die gedruckt oder auf dem Bildschirm angezeigt werden können. Tasks können problemlos für verschiedene Gruppen von Features sequenziell wiederholt oder auf unterschiedliche Weise mit verschiedenen Parametern verbunden werden. Ganze Workflows können automatisiert oder in kleinere Abschnitte unterteilt werden, zwischen denen manuelle Bearbeitungs- oder Überprüfungsschritte stattfinden.
Kombinieren von Generalisierungs-Tasks zu kartografischen Workflows
Die Erstellung einer Karte in einem kleineren als dem für die Daten vorgesehenen Maßstab beginnt mit dem Erarbeiten des Zielmaßstabs, der Anzeigespezifikation (einschließlich Symbologie) sowie des zugrunde liegenden Zwecks oder der Absicht der Karte. Anschließend werden Vorgänge ausgeführt, um die Gesamtanzahl der Features zu reduzieren, ohne die Konnektivität oder das Wesen des Datasets zu verändern. Danach wird die Komplexität einzelner Features verringert, indem Stützpunkte oder andere Feature-Details entfernt werden. Dazu zählt möglicherweise auch das Vereinfachen der Komplexität innerhalb der Feature-Attribute durch die Kombination ähnlicher Feature-Unterkategorien für die Anzeige mit dem gleichen Symbol. Sobald die Kartenerstellung beginnt und die Daten mit der endgültigen Symbologie im endgültigen Maßstab angezeigt werden, können grafische Konflikte ermittelt und gelöst werden.
Das folgende Flussdiagramm zeigt eine vereinfachte Version eines Generalisierungsworkflow und nennt einige Hauptwerkzeuge aus der Toolbox "Cartography", mit denen Sie sich die Generalisierung von Daten für die Anzeige in einem kleineren Maßstab erleichtern können.
Es ist wichtig, zu verstehen, dass die meisten Geoverarbeitungswerkzeuge meist neue Daten als Ausgabe generieren, die dann als Eingabe für nachfolgende Werkzeuge verwendet werden können. Im Gegensatz dazu folgen Kartografen meist einem Workflow, der durch schrittweise Verbesserung von Feature-Layern charakterisiert ist, die bereits in einem Kartendokument festgelegt sind. Symbologie, Layer-Eigenschaften und Maskierungsbeziehungen sind bereits festgelegt, daher sollten Eingabe-Layer beim Ausführen von Konfliktlösungs- und Generalisierungsvorgängen geändert werden, sodass diese Informationen nicht verloren gehen. Aus diesem Grund werden mit einigen Werkzeugen in der Toolbox "Cartography" Eingabedaten in symbolisierten Layern geändert und keine Daten erstellt. Dieser Ansatz ist besonders gut überschaubar und leistungsfähig, wenn er in Verbindung mit kartografischen Repräsentationen verwendet wird.
Unterstützen der Generalisierung durch Repräsentationen
Repräsentationen sind eine Eigenschaft von Geodatabase-Feature-Classes, die eine alternative Anzeige der Feature-Geometrie unterstützen kann. Feature-Classes können mehrere Repräsentationen zugeordnet sein, wodurch mehrere Anzeigen derselben Daten unterstützt werden. Repräsentationen bieten Vorteile bei der Generalisierung. Beachten Sie jedoch, dass für einen spezifischen Maßstab (oder Maßstabsbereich) nur eine einzelne Feature-Class erstellt wird, unabhängig davon, wie viele Repräsentationen dieser zugeordnet werden. Es kann verlockend sein, aus der Möglichkeit, Repräsentationen zum Unterstützen mehrerer Anzeigen eines Feature-Satzes zu verwenden, auf eine Verwendungsmöglichkeit von Repräsentationen zum Zeichnen der gleichen Features bei anderen Maßstäben zu schließen. Einige kleine Änderungen im Maßstab können problemlos erzielt werden, indem Sie kleinere Anpassungen an den Shapes einiger Repräsentations-Features vornehmen oder einige sogar ausblenden. Dennoch besteht eine 1:1-Beziehung, die sogar beibehalten wird, wenn Repräsentationen vorliegen. Für jedes Feature können eine oder mehrere Anzeigen vorhanden sein, doch die Features können nicht zu neuen Features kombiniert werden. Zum Beispiel kann eine Reihe einzelner Gebäude nicht durch Anzeigen von Repräsentationen allein als bebaute Fläche modelliert werden. Um eine Kartenerstellung in mehreren Maßstäben wirklich zu unterstützen, müssen die Features ordnungsgemäß verarbeitet werden, sodass eine angemessene Feature-Dichte und -Detailtreue erzielt und Symbolisierungskonflikte vermieden werden. Die Werkzeuge in den Toolsets Generalisierung und Grafikkonflikte erleichtern diese Arbeit.
Weitere Informationen zur Konfliktlösung und Generalisierung
Repräsentationen weisen eine von zwei Einstellungen für das Bearbeitungsverhalten auf. Die Bearbeitungseinstellung ist eine Eigenschaft einer Repräsentation und wird beim Erstellen der Repräsentation für eine Feature-Class festgelegt.
- Geometrieänderung als Repräsentation-Override speichern. Dies ist die Standardeinstellung. Diese bedeutet, dass Änderungen an der Geometrie von Features in einem separaten BLOB-Feld der Feature-Class-Attributtabelle gespeichert werden, auf die von der aktuellen Repräsentation zugegriffen werden kann. Die Basisgeometrie des im Feld "Shape" gespeicherten Features wird intakt gelassen.
- Geometrie von zugrunde liegendem Feature ändern. Mit dieser Einstellung wird bei einer Änderung an der Geometrie eines Features das eigentliche Feld "Shape" der Feature-Class geändert, was sich auf alle anderen, der Feature-Class zugeordneten Repräsentationen auswirkt.
Mit einigen Generalisierungswerkzeugen ändern Sie ihre Eingabe-Layer, und es werden keine neuen Datasets erstellt. Diese werden als abgeleitete In/Out-Daten bezeichnet. Es wird dringend empfohlen, Layer zu verwenden, die auf Repräsentationen mit der Einstellung Geometrieänderung als Repräsentation-Override speichern verweisen. Dies gilt insbesondere bei der Arbeit mit den Grafikkonfliktwerkzeugen (Straßenkonflikte lösen, Versatz propagieren und Gebäudekonflikte lösen), da mit diesen Werkzeugen die Geometrie der Eingabe-Layer geändert wird. Bei dieser Einstellung werden die von diesen Werkzeugen an Features vorgenommenen Änderungen als Overrides in der Repräsentation gespeichert, und die ursprüngliche Geometrie bleibt unverändert. Der Vorteil dabei besteht darin, dass die ursprünglichen Shapes der Features (im Feld "Shape") schnell verfügbar sind, um visuelle Vergleiche vornehmen oder die Shapes zurücksetzen zu können, wenn die Ergebnisse nicht befriedigend sind.
Beim Generalisieren von Daten über größere Maßstabsbereiche sind Repräsentationen ebenfalls vorteilhaft. Idealerweise sollten starke Maßstabsverkleinerungen mit Generalisierungsprozessen direkt vorgenommen werden können. Meist ist jedoch ein Zwischenmaßstab notwendig. Bei der Vorbereitung der Daten für die Anzeige in Zwischenmaßstäben als Zwischenstufe des Übergangs werden Ungenauigkeiten möglicherweise übertrieben, da unterschiedliche Entscheidungen getroffen werden sollten, wenn Detaildaten aus der Anzeige entfernt werden. Beispielsweise kann auf einer Karte mit großem Maßstab Feature A versetzt werden, um Feature B unterbringen zu können. Auf einer Karte mit kleinerem Maßstab wird Feature B nicht mehr angezeigt, doch gibt es keine einfache Möglichkeit zu sehen, ob A versetzt wurde, oder zu ermitteln, woher es stammte. In diesem Fall wird eine nun nicht erforderliche Ungenauigkeit auf den nächstkleineren Maßstab übertragen. Repräsentations-Overrides sind in dieser Situation hilfreich, da Sie schnell und einfach die Startposition eines Features visuell bestimmen und dieses bei Bedarf zurücksetzen können.
Verketten von Generalisierungswerkzeugen in ModelBuilder
In Generalisierungswerkzeugen werden Eingaben mit mehreren Werten genutzt – das heißt, eine Liste mit einer oder mehreren Feature-Classes. Zahlreiche Geoverarbeitungswerkzeuge akzeptieren mehrere Werte (z. B. das Werkzeug Vereinigen (Union)), doch sind Generalisierungswerkzeuge insofern etwas außergewöhnlich, dass sie auch Ausgaben mit mehreren Werten erzeugen. Daher sollten Sie sich unbedingt mit einigen ModelBuilder-Verfahren vertraut machen, um das gewünschte Modell zu erzeugen. Diese Verfahren werden nachfolgend erläutert.
Verketten von Werkzeugen mit mehreren Eingaben und Ausgaben
Die Werkzeuge Straßennetzwerk ausdünnen, Straßenkonflikte lösen und Gebäudekonflikte lösen erzeugen Ausgaben mit mehreren Werten. Daher können nur Werkzeuge, die Eingaben mit mehreren Werten akzeptieren, die Ausgabe solcher Werkzeuge direkt verwenden. Wenn beispielsweise drei Layer als Eingabe für das Werkzeug Straßennetzwerk ausdünnen verwendet werden und Sie eben diese drei Layer nach dem Ausdünnen als Eingabe für das Werkzeug Straßenkonflikte lösen verwenden möchten, können Sie die Ausgabe des Werkzeugs Straßennetzwerk ausdünnen mit dem Werkzeug Straßenkonflikte lösen direkt verketten.
Sie können das Werkzeug Werte erfassen verwenden, um einer mehrwertigen Ausgabe weitere Layer hinzuzufügen. Das Beispiel unten zeigt das Hinzufügen zweier Layer zur Ausgabe von Straßennetzwerk ausdünnen, um die Eingabe für Straßenkonflikte lösen zu erstellen.
Verketten mehrerer Ausgaben mit einer Einzelwerteingabe
Um Werkzeuge mit einer mehrwertigen Ausgabe mit einem Werkzeug zu verknüpfen, das eine Einzelwerteingabe akzeptiert, verwenden Sie das Werkzeug Anhängen, um mehrere Feature-Classes zusammenzuführen. Ein Beispiel für diesen Workflow ist das Anhängen mehrerer vom Werkzeug Straßennetzwerk ausdünnen verarbeiteter Straßen-Eingabe-Layer an das Werkzeug Getrennte Fahrbahnen zusammenführen, das nur eine Einzelwerteingabe akzeptiert.
Einzelnes Verketten mehrerer Eingaben
In manchen Fällen möchten Sie möglicherweise mehrere Ausgaben eines Werkzeugs einzeln an ein anderes Werkzeug übergeben. Dies kann der Fall sein, wenn nicht alle Ausgaben des ersten Werkzeugs an das zweite Werkzeug übergeben werden sollen oder Sie für jede Eingabe im zweiten Werkzeug bestimmte Parameter festlegen möchten. Das Werkzeug Gebäudekonflikte lösen ermöglicht beispielsweise die vollständige Steuerung der Art und Weise, auf die die einzelnen Eingabe-Layer als Barriere definiert werden. Verwenden Sie in solchen Fällen die gleichen Layer als Eingaben für beide Werkzeuge, aber legen Sie, wie unten dargestellt, die Ausgabe des ersten Werkzeugs als Vorbedingung für das zweite Werkzeug fest, um die richtige Reihenfolge der Verarbeitung zu erzwingen. Dieser Ansatz ist nur anwendbar, wenn mit dem ersten Werkzeug, z. B. dem Werkzeug Straßenkonflikte lösen, Eingabe-Layer geändert und keine neuen Ausgabe-Layer erstellt werden.
Weitere Informationen zu Vorbedingungen in ModelBuilder
Im Beispiel unten werden die drei Transport-Layer als Eingaben für beide Werkzeuge verwendet. Dies ist möglich, weil diese Layer vom Werkzeug Straßenkonflikte lösen geändert und keine neuen Ausgabe-Feature-Classes erstellt werden. Die Ausgabe des Werkzeugs Straßenkonflikte lösen wird als Vorbedingung für die Verarbeitung durch das Werkzeug Gebäudekonflikte lösen verwendet, um sicherzustellen, dass das Werkzeug Straßenkonflikte lösen die Verarbeitung abschließt, bevor das Werkzeug Gebäudekonflikte lösen gestartet wird.
Symbolisierte Eingaben
Um Werkzeuge zu verknüpfen, die nur symbolisierte Layer akzeptieren, müssen Sie mit dem Werkzeug Feature-Layer erstellen und dem Werkzeug Symbologie aus Layer anwenden einen Ausgabe-Layer für Verkettungszwecke in ModelBuilder sowie in Skriptumgebungen vorbereiten.
Ein Python-Beispielskript, mit dem Daten für die Anzeige in einem kleineren Maßstab vorbereitet werden
Beispiel für Workflow mit der Toolbox "Cartography" (eigenständiges Python-Skript)
Dieses eigenständige Skript durchläuft einen Beispielworkflow mit einer Reihe von Werkzeugen aus der Toolbox "Cartography", bei dem Daten im Maßstab 1:25.000 generalisiert und grafische Konflikte gelöst werden, die bei der Anzeige im Maßstab 1:50.000 auftreten.
# 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")