Suchen Sie ein Python-Skript zum Erstellen von .mxd-Dateien?

11

Ich bin neu in ArcGIS und Python. Meine Anforderung ist es, den folgenden MANUELLEN Prozess zu automatisieren:

  1. Erstellen einer Ebene in ArcGIS for Desktop. Mit anderen Worten: Erstellen Sie ein ArcMap-Dokument (.mxd).
  2. Veröffentlichen des erstellten ArcMap-Dokuments (in Schritt 1) ​​als Service für ArcGIS Server.

Derzeit machen wir dies manuell. Ich bin auf Skripte gestoßen, um Schritt 2 mit Python zu automatisieren.

Wie kann ich Schritt 1 und Schritt 2 automatisieren?

user15051
quelle

Antworten:

16

Dies ist keine eigenständige Antwort, sondern eher eine Ergänzung zu @ PolyGeos Antwort, da sie sich mit der "mxd-Erstellung von Grund auf neu" in der Python-Ausgabe befasst.

Sie können MXDs in Python von Grund auf neu erstellen, wenn Sie auf ArcObjects zugreifen . Sie benötigen das comtypes- Paket. Wenn Sie ArcGIS 10.1 verwenden, müssen Sie eine kleine Änderung an vornehmen automation.py. Siehe ArcObjects + comtypes unter 10.1

Unten finden Sie einen Code zum Erstellen einer MXD von Grund auf in Python:

import arcpy
import comtypes,os

def CreateMXD(path):
    GetModule('esriCarto.olb')
    import comtypes.gen.esriCarto as esriCarto
    pMapDocument = CreateObject(esriCarto.MapDocument, esriCarto.IMapDocument)
    pMapDocument.New(path)
    pMapDocument.Save() #probably not required...

def GetLibPath():
    """ Get the ArcObjects library path

        It would be nice to just load the module directly instead of needing the path,
        they are registered after all... But I just don't know enough about COM to do this

    """
    compath=os.path.join(arcpy.GetInstallInfo()['InstallDir'],'com')
    return compath

def GetModule(sModuleName):
    """ Generate (if not already done) wrappers for COM modules
    """
    from comtypes.client import GetModule
    sLibPath = GetLibPath()
    GetModule(os.path.join(sLibPath,sModuleName))

def CreateObject(COMClass, COMInterface):
    """ Creates a new comtypes POINTER object where
        COMClass is the class to be instantiated,
        COMInterface is the interface to be assigned
    """
    ptr = comtypes.client.CreateObject(COMClass, interface=COMInterface)
    return ptr

if __name__=='__main__':
    #testing...
    arcpy.SetProduct('arcview')
    filepath='c:/temp/testing123.mxd'
    if os.path.exists(filepath):os.unlink(filepath)
    CreateMXD(filepath)
user2856
quelle
14

Beispielcode zum Erstellen einer Ebene in ArcGIS for Desktop finden Sie in der Online-Hilfe für AddLayer (arcpy.mapping) .

Die Schritte zum Veröffentlichen eines ArcMap-Dokuments als Dienst für ArcGIS for Server finden Sie in der Online-Hilfe zum Veröffentlichen eines Kartendienstes mit Python .

Beachten Sie, dass es nicht möglich ist, eine MXD mit ArcPy zu erstellen. Sie benötigen eine vorhandene MXD, zu der Sie Ebenen hinzufügen können. Diese Entwurfsentscheidung wird in der Online-Hilfe zu Richtlinien für arcpy.mapping beschrieben . Die Möglichkeit, ein neues Kartendokument aus dem Nichts in ArcPy zu erstellen, ist eine ArcGIS-Idee , die ich gerne implementiert sehen würde.

Siehe @ Lukes Antwort für eine erweiterte Python- und ArcObjects-Methode, die ich nicht getestet habe, die Ihnen jedoch möglicherweise eine Problemumgehung zum Erstellen einer MXD aus einem Python-Skript bietet, das ArcPy dann bearbeiten kann.

PolyGeo
quelle