Comment publier automatiquement de nombreux fichiers MXD dans ArcGIS Server 10.1?

12

Comment publier automatiquement de nombreux fichiers mxd dans ArcGIS Server 10.1?

J'ai environ 60 fichiers mxd et je souhaite les publier automatiquement. Est-ce qu'il y a un moyen de faire ça?

user7172
la source
Btelliot, votre code fonctionne également 10.2! Il est évidemment nécessaire de définir certains détails concernant le service, mais c'est un point de départ incroyable !!! 10X

Réponses:

14

vous pouvez utiliser arcpy pour publier vos fichiers mxd.

pour lister vos fichiers mxd, utilisez os.walk:

import os
import arcpy

path= r"c:\path"
for (path, dirs, files) in os.walk(path):
  for fl in files:
     if fl.lower().endswith(".mxd"):
       mxd = arcpy.mapping.MapDocument(os.path.join(path, fl))
       print mxd.filePath

puis procédez comme suit:

1. Fonction AnalyzeForMSD () ( info ): analyse les documents cartographiques (.mxd) pour déterminer les sources de problèmes potentiels d'adéquation et de performances lors de la conversion d'une carte en fichier de définition de service de carte (MSD).

Exemple:

import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\ReadyForMSD.mxd")
analysis = arcpy.mapping.AnalyzeForMSD(mxd)

2. Fonction ConvertToMSD () ( info ): convertit une carte en un fichier de définition de service de carte (MSD).

Exemple:

import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\ReadyForMSD.mxd")
msd = r"C:\Project\Output\Project.msd"
df = arcpy.mapping.ListDataFrames(mxd, "County Maps")[0]
arcpy.mapping.ConvertToMSD(mxd, msd, df, "NORMAL", "NORMAL")
del mxd, msd

3. Fonction PublishMSDToServer () ( info ): publie un fichier de définition de service de carte (MSD) existant sur un serveur ArcGIS désigné.

Exemple:

import arcpy
msd = r"C:\Project\Project.msd"
arcpy.mapping.PublishMSDToServer (msd, "http://<MyServer>/arcgis/services", 
              "<MyServer>", "MyMapService", "MyMapServiceFolder", ["WMS", "KML"])

la dernière chose à faire est de fusionner toutes les fonctions selon vos besoins. en fait, il existe un didacticiel qui peut vous aider ici à propos de l' utilisation d'ArcPy Mapping pour publier des documents cartographiques sur ArcGIS Server . c'est similaire à ma documentation ...

Pour résumer (l'image provient du lien que je donne ci-dessus):

arcgis

J'espère que ça t'aide...

Aragon
la source
Sa volonté en travaillant avec ags 10.1? Dans 10.1 est * .sd au lieu de * .msd.
user7172
oui c'est pour 10 mais vous pouvez mettre à jour le nouvel arcpy pour 10.1 ...
Aragon
1
Merci Aragon, cela a été très utile! Je viens de terminer la publication automatique de plus de 130 MXD. :) Juste pour la postérité, le workflow 10.1 est: arcpy.mapping.CreateMapSDDraft-> arcpy.StageService_server->arcpy.UploadServiceDefinition_server
Mintx
4

Aragon a une excellente réponse, mais malheureusement, cela ne fonctionne pas pour ArcGIS / ArcServer 10.1.

La nouvelle méthode que je viens d'essayer est basée sur l'aide d'ArcGIS 10.1. Vous pouvez trouver le lien vers le fichier d'aide ici: http://resources.arcgis.com/en/help/main/10.1/index.html#//00s30000006q000000

Voici comment j'ai utilisé le code pour publier des MXD basés sur un dossier spécifié:

#import modules
import arcpy, sys, os, string

#specify folder containing MXDs
inFolder = raw_input("Please enter folder containing 10.1 MXDs to Publish to ArcServer: ")

#specify connection File Path
connectionFilePath = r'C:\Users\<your user name>\AppData\Roaming\ESRI\Desktop10.1\ArcCatalog\<your connection file location.ags>'

#look in folder for mxds
MapPath= []
MapFolder = os.listdir(inFolder)
for file in MapFolder:
    fileExt = os.path.splitext(file)[1]
    if fileExt == ".mxd":
        MapPath = os.path.join(inFolder, file)
        file = MapPath.strip('\'')
        mxd = arcpy.mapping.MapDocument(file)
        base = os.path.basename(file)
        serviceName = base[:-4]
        SDDraft = file[:-4] + ".sddraft"
        sd = file[:-4] + ".sd"

        #Create Map SD Draft
        print "\n" + "Publishing: " + base
        analysis = arcpy.mapping.CreateMapSDDraft(mxd, SDDraft, serviceName, "FROM_CONNECTION_FILE", connectionFilePath, "False", <Service Folder Name>,  "None", "None")

        # stage and upload the service if the sddraft analysis did not contain errors
        if analysis['errors'] == {}:
            # Execute StageService
            print "Staging Service"
            arcpy.StageService_server(SDDraft, sd)
            # Execute UploadServiceDefinition
            print "Uploading Service Definition"
            arcpy.UploadServiceDefinition_server(sd, connectionFilePath)
            print "Publishing " + base +" succeeded" + "\n"
        else:
            # if the sddraft analysis contained errors, display them
            print analysis['errors']

Il pourrait y avoir un moyen plus simple d'utiliser ce code, mais cela fonctionne pour moi. J'espère que cela t'aides.

Btelliot
la source