ArcGIS Desktop

  • ArcGIS Pro
  • ArcMap

  • My Profile
  • Hilfe
  • Sign Out
ArcGIS Desktop

ArcGIS Online

Die Mapping-Plattform für Ihre Organisation

ArcGIS Desktop

Ein vollständiges professionelles GIS

ArcGIS Enterprise

GIS in Ihrem Unternehmen

ArcGIS Developers

Werkzeuge zum Erstellen standortbezogener Apps

ArcGIS Solutions

Kostenlose Karten- und App-Vorlagen für Ihre Branche

ArcGIS Marketplace

Rufen Sie Apps und Daten für Ihre Organisation ab.

  • Dokumentation
  • Support
Esri
  • Anmelden
user
  • Eigenes Profil
  • Abmelden

ArcMap

  • Startseite
  • Erste Schritte
  • Karte
  • Analysieren
  • Verwalten von Daten
  • Werkzeuge
  • Erweiterungen

Automatisieren von Abgleich- und Zurückschreibevorgängen für Daten mit aktivierter Synchronisierung

  • Identifizieren von Geodatabase-Versionen anhand von Service-Namen
  • Batch-Abgleich von Versionen und Zurückschreiben von Änderungen
  • Komprimieren der Geodatabase
  • Erneutes Erstellen von Indizes und Aktualisieren der Statistik
  • Löschen von abgeglichenen Versionen
  • Vollständiger Code – Beispiel

ArcGIS-Geodatabase-Administratoren können viele Tasks, die normalerweise mit verschiedenen Geoverarbeitungswerkzeugen durchgeführt werden, mithilfe der Python-Skripterstellung automatisieren. In diesem Thema wird eine der Vorgehensweisen erläutert, wie der Administrator einen geplanten nächtlichen Abgleich von Versionen ausführen kann, nachdem Außendienstmitarbeiter ihre Änderungen an den Daten mit traditioneller Versionierung synchronisiert haben.

Identifizieren von Geodatabase-Versionen anhand von Service-Namen

Erstellen Sie zunächst eine Liste der Geodatabase-Versionen, die abgeglichen werden müssen.

# Create a list of user names that will be used to find versions.
userList = ['???', '###']
# Get a list of versions for the service named '???' and '###' to pass into the ReconcileVersions tool.
versions = arcpy.da.ListVersions('//connectionLocation/admin.sde')
# Create an empty list that will be used to hold version names that you want to reconcile.
verReconcileList = []
# Loop through the versions list to look for versions with appropriate names.
# if these names are found append them to the verReconcileList.
for user in userList:
    for version in versions:
        if user.lower() in version.name.lower():
            verReconcileList.append(version.name)

Batch-Abgleich von Versionen und Zurückschreiben von Änderungen

Sie können das Werkzeug Versionen abgleichen verwenden, um alle traditionellen Versionen in einer Enterprise-Geodatabase abzugleichen und zurückzuschreiben. Dieses Werkzeug stellt Optionen bereit, um alle Versionen in der Geodatabase mit einer Zielversion (ALL_VERSIONS) abzugleichen. Es können aber auch nur die Versionen abgeglichen werden, die die Komprimierung der Zielversion verhindern (BLOCKING_VERSIONS). Dieses Werkzeug ist ein Mittel, um eine effektive Komprimierung zu erreichen, da es das gleichzeitige Abgleichen und sofortige Zurückschreiben mehrerer Versionen in entsprechender Reihenfolge ermöglicht. Die Versionen können auch im Anschluss an den Abgleich- oder Zurückschreibevorgang durch die Angabe des Schlüsselworts DELETE_VERSION gelöscht werden.

In diesem Beispiel werden die Versionen nicht gelöscht, da das Schlüsselwort KEEP_VERSION angegeben wurde. Das Werkzeug wird zudem als Geodatabase-Administrator ausgeführt. Indem eine Verbindung als Geodatabase-Administrator hergestellt wird, können alle Versionen in der Geodatabase – selbst private oder geschützte Versionen anderer Benutzer – abgeglichen und zurückgeschrieben werden.

# Get a list of versions to pass into the ReconcileVersions tool. versionList = arcpy.ListVersions('//connectionLocation/admin.sde')
# Execute the ReconcileVersions tool.
arcpy.ReconcileVersions_management('//connectionLocation/admin.sde', "ALL_VERSIONS", "sde.DEFAULT", verReconcileList, "LOCK_ACQUIRED", "NO_ABORT", "BY_OBJECT", "FAVOR_TARGET_VERSION", "POST", "KEEP_VERSION", "c:/temp/reconcilelog.txt")

Komprimieren der Geodatabase

Nach dem Abgleichen und Zurückschreiben der Änderungen ist es wichtig, die Geodatabase zu komprimieren, um überflüssige Informationen zu entfernen und die Änderungen in die Basistabellen zu verschieben.

# Run the compress tool. 
arcpy.Compress_management('//connectionLocation/admin.sde')

Erneutes Erstellen von Indizes und Aktualisieren der Statistik

Nach dem Durchführen eines Komprimierungsvorgangs empfiehlt es sich, die Indizes neu zu erstellen und die Statistiken zu aktualisieren. Diese Schritte können mit den Werkzeugen Indizes neu erstellen und Datasets analysieren durchgeführt werden. Diese Werkzeuge ermöglichen die Eingabe einer Liste mit Eingabe-Datasets, sodass die Funktionen für alle Datasets gleichzeitig ausgeführt werden können. Mit diesen Werkzeugen werden außerdem Statistiken aktualisiert und Indizes für entsprechende Systemtabellen neu erstellt, wenn sie als Geodatabase-Administrator ausgeführt werden. Im ersten Schritt dieses Prozesses wird eine Liste mit den Daten und den Benutzern, denen die Daten gehören, abgerufen. Indizes und Statistiken können nur vom Datenbesitzer aktualisiert werden.

# set the workspace arcpy.env.workspace = '//connectionLocation/dataOwner.sde'
# Get the user name for the workspace
# this assumes you are using database authentication. # OS authentication connection files do not have a 'user' property. userName = arcpy.Describe(arcpy.env.workspace).connectionProperties.user
# Get a list of all the datasets the user has access to. # First, get all the stand-alone tables, feature classes and rasters owned by the current user. oDataList = arcpy.ListTables('*.' + userName + '.*') + arcpy.ListFeatureClasses('*.' + userName + '.*') + arcpy.ListRasters('*.' + userName + '.*')
# Next, for feature datasets owned by the current user
# get all of the featureclasses and add them to the master list. for dataset in arcpy.ListDatasets('*.' + userName + '.*'):
    oDataList += arcpy.ListFeatureClasses(feature_dataset=dataset)
Hinweis:

Die verwendeten Platzhaltertoken zur Einschränkung der Datasets der Datenbesitzer variieren je nach Betriebssystem. Der im obigen Beispiel verwendete Platzhalter ('*.' + userName + '.*') kann für Geodatabases in Microsoft SQL Server, PostgreSQL und IBM Db2 genutzt werden. Für Geodatabases in Oracle kann der folgende Platzhalter verwendet werden: (userName + '.*').

Sobald Ihnen die Liste mit Daten im Besitz des Benutzers vorliegt, können Sie diese in den Werkzeugen Indizes neu erstellen und Datasets analysieren verwenden.

Bei mehreren Datenbesitzern müssen Sie für jeden Datenbesitzer eine Datenliste erstellen. Führen Sie die Werkzeuge Indizes neu erstellen und Datasets analysieren mit Datenbankverbindungsdateien (.sde) aus, bei denen für den jeweiligen Benutzer eine Verbindung zur Geodatabase hergestellt wird.

# Execute rebuild indexes and analyze datasets
# Note: to use the "SYSTEM" option, the user must be an administrator.
workspace = "//connectionLocation/user1.sde"
arcpy.RebuildIndexes_management(workspace, "NO_SYSTEM", oDataList, "ALL")
arcpy.AnalyzeDatasets_management(workspace, "NO_SYSTEM", oDataList, "ANALYZE_BASE", "ANALYZE_DELTA", "ANALYZE_ARCHIVE")

Löschen von abgeglichenen Versionen

Der letzte Schritt besteht darin, die abgeglichenen und zurückgeschriebenen Versionen zu löschen. Durch die Ausführung der Anweisung versionList haben Sie bereits die Liste der abgeglichenen Versionen abgerufen. Im folgenden Code wird diese Liste durchlaufen, um nicht benötigte Versionen zu löschen.

Hinweis:

Bei Verwendung der Geodatabase-Replikation müssen Sie unbedingt darauf achten, keine Version zu löschen, die noch von einem Replikat referenziert wird, da aus diesen Versionen Geodatabase-Replikate erstellt werden. Mit der Funktion ListReplicas können Sie die Replikate und die Namen der referenzierten Versionen auflisten. Das Löschen einer Replikatversion führt meist zu einem Fehler und sollte daher vermieden werden.

Im folgenden Beispiel rufen Sie eine Liste von Replikatversionen ab, indem alle Replikate durchlaufen werden. Als Nächstes entfernen Sie aus der Versionsliste die Replikatversionen, die abgeglichen wurden. Zuletzt durchlaufen Sie die restliche Liste und löschen die abgeglichenen Versionen.

# set the workspace workspace = '//connectionLocation/admin.sde'
# Get a list of all the replica versions in the geodatabase replicaVersions = [replica.version for replica in arcpy.da.ListReplicas(workspace)]
# Loop through this replica version list and remove these version names from the list of versions you reconciled earlier. # You want to remove versions from this list that are still being referenced by a replica for replicaVer in replicaVersions:
  if replicaVer in verReconcileList:
    verReconcileList.remove(replicaVer)
# Loop through the verReconcileList and delete versions. 
# These versions are no longer being referenced by a replica so you can assume it's safe to delete them. if len(versionsList) > 0:
  for version in verReconcileList:
  		arcpy.DeleteVersion_management(workspace, version)

Vollständiger Code – Beispiel

Im nachstehenden Code-Beispiel wird ein Großteil der oben erläuterten Schritte zusammengeführt, um die folgenden Vorgänge durchzuführen:

  • Identifizieren von Geodatabase-Versionen
  • Batch-Abgleich von Versionen und Zurückschreiben von Änderungen
  • Komprimieren der Geodatabase
  • Erneutes Erstellen von Indizes und Aktualisieren der Statistik in Systemtabellen
  • Erneutes Erstellen von Indizes und Aktualisieren der Statistik in Benutzertabellen

Hinweis:

Das folgende Skript enthält zusätzliche Logik im Vergleich zu den anderen Codebeispielen in diesem Thema. Durch die zusätzliche Logik können Fehler besser gehandhabt werden. Beachten Sie zudem, dass einige Kommentare und Variablennamen im Skript geändert wurden.

import arcpy

try:
    # Set the workspace 
    arcpy.env.workspace = 'Database Connections/admin.sde'
    
    # Set variables
    workspace = arcpy.env.workspace
    arcpy.env.overwriteOutput = True
    targetVersion = 'sde.DEFAULT'
    
    # Create a list of user names that will be used to find versions.
    userList = ['???', '###']
    
    # Get a list of versions for the service named '???' and '###' to pass into the ReconcileVersions tool.
    versions = arcpy.da.ListVersions(workspace)
    
    # Create an empty list to hold version names to reconcile.
    verReconcileList = []
    
    # Loop through the list to look for versions with our user names in their name where the parent version is the target version.
    # if these names are found, append them to the verReconcileList.
    for user in userList:
        for version in versions:
            if user.lower() in version.name.lower():
                if version.parentVersionName.lower() == targetVersion.lower():
                    verReconcileList.append(version.name)
    
    # Perform maintenance if versions are found; otherwise, there is no maintenance to perform.
    if len(verReconcileList)>0:
        
        # Execute the ReconcileVersions tool.
        arcpy.ReconcileVersions_management(workspace, "ALL_VERSIONS", targetVersion, verReconcileList, "LOCK_ACQUIRED", "NO_ABORT", "BY_OBJECT", "FAVOR_TARGET_VERSION", "POST", "KEEP_VERSION", "c:/temp/reconcilelog.txt")
        
        # Run the compress tool. 
        arcpy.Compress_management(workspace)
        
        # Rebuild indexes and analyze the states and states_lineages system tables
        arcpy.RebuildIndexes_management(workspace, "SYSTEM", "", "ALL")
        
        arcpy.AnalyzeDatasets_management(workspace, "SYSTEM", "", "ANALYZE_BASE", "ANALYZE_DELTA", "ANALYZE_ARCHIVE")
        
        
        '''
        *********************
        Data Owner(s) Section
        *********************
        '''
        # Get a list of datasets owned by the data owner user (requires second connection file)
        
        # Set the workspace 
        arcpy.env.workspace = 'Database Connections/dataOwner.sde'
        
        # Set a variable for the workspace
        workspace = arcpy.env.workspace
        
        # Get the user name for the workspace
        # this assumes you are using database authentication.
        # OS authentication connection files do not have a 'user' property.
        userName = arcpy.Describe(arcpy.env.workspace).connectionProperties.user
        
        # Get a list of all the datasets the user has access to.
        # First, get all the stand alone tables, feature classes and raster datasets owned by the current user.
        oDataList = arcpy.ListTables('*.' + userName + '.*') + arcpy.ListFeatureClasses('*.' + userName + '.*') + arcpy.ListRasters('*.' + userName + '.*')
        
        # Next, for feature datasets owned by the current user
        # get all of the feature classes and add them to the master list.
        for dataset in arcpy.ListDatasets('*.' + userName + '.*'):
            oDataList += arcpy.ListFeatureClasses(feature_dataset=dataset)
        
        # Rebuild indexes and analyze the data owner tables
        arcpy.RebuildIndexes_management(workspace, "NO_SYSTEM", oDataList, "ALL")
        
        arcpy.AnalyzeDatasets_management(workspace, "NO_SYSTEM", oDataList, "ANALYZE_BASE", "ANALYZE_DELTA", "ANALYZE_ARCHIVE")
        
        '''
        *************************
        End Data Owner(s) Section
        *************************
        '''
        
        # set the workspace back to the geodatabase administrator workspace
        workspace = 'Database Connections/admin.sde'
        
        # Get a list of all the replica versions in the geodatabase
        replicaVersions = [replica.version for replica in arcpy.da.ListReplicas(workspace)]
        
        '''
        - We now have a list of versions that were created by taking a map offline (verReconcileList)
        - We also have a list of replica versions (replicaVersions)
        - The versions that we were reconciling are ready to be deleted if they are not currently pointing to a version
        - We are going to loop through the reconcile versions list and remove any versions that are still pointing to a replica
        - The versions remaining in the reconcile list are ready to be cleaned (deleted) up because there are no maps/replicas pointing to them. 
        '''
        
        # Use the list of versions associated with users/maps that we reconciled earlier. Remove any versions from the list that are still being used by a replica. 
        for replicaVer in replicaVersions:
            if replicaVer in verReconcileList:
                verReconcileList.remove(replicaVer)
        
        # Loop through the versionsList and delete versions that are no longer being referenced by a replica. 
        # Since these versions are no longer being referenced by a replica, we can assume it's safe to delete them.
        if len(verReconcileList) > 0:     #check to see that the list is not empty
            for version in verReconcileList:
                try:
                    arcpy.DeleteVersion_management(workspace, version)
                except:
                    print("Failed to delete version.")
                    print(arcpy.GetMessages(2))
        else:
            print("No versions to delete.")
    
    else:
        print("No versions to reconcile, aborting version maintenance routine.")

except:
    print(arcpy.GetMessages(2))
    
print("Done.")

ArcGIS Desktop

  • Startseite
  • Dokumentation
  • Support

ArcGIS

  • ArcGIS Online
  • ArcGIS Desktop
  • ArcGIS Enterprise
  • ArcGIS
  • ArcGIS Developer
  • ArcGIS Solutions
  • ArcGIS Marketplace

Über Esri

  • Über uns
  • Karriere
  • Esri Blog
  • User Conference
  • Developer Summit
Esri
Wir sind an Ihrer Meinung interessiert.
Copyright © 2021 Esri. | Datenschutz | Rechtliches