¿Cómo publicar muchos archivos MXD en ArcGIS Server 10.1 automáticamente?

12

¿Cómo publicar muchos archivos mxd en ArcGIS Server 10.1 automáticamente?

Tengo alrededor de 60 archivos mxd y quiero publicarlos automáticamente. ¿Hay alguna forma de hacer esto?

usuario7172
fuente
¡Btelliot, tu código también funciona 10.2! Obviamente, es necesario definir algunos detalles sobre el servicio, ¡pero este es un punto de partida increíble! 10X

Respuestas:

14

puede usar arcpy para publicar sus archivos mxd.

para listar sus archivos mxd use 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

y luego ve de esta manera:

1. Función AnalyzeForMSD () ( información ): analiza documentos de mapa (.mxd) para determinar las fuentes de problemas potenciales de idoneidad y rendimiento al convertir un mapa en un archivo de definición de servicio de mapa (MSD).

Ejemplo:

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

2. Función ConvertToMSD () ( información ): Convierte un mapa en un archivo de definición de servicio de mapas (MSD).

Ejemplo:

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. Función PublishMSDToServer () ( información ): publica un archivo de definición de servicio de mapas (MSD) existente en un servidor ArcGIS designado.

Ejemplo:

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

Lo último es que debe hacer que fusionar todas las funciones para sus necesidades. En realidad, hay un tutorial que puede ayudarlo aquí sobre el uso de la asignación de ArcPy para publicar documentos de mapa en ArcGIS Server . es similar a mi documentación ...

Para resumir (la imagen es del enlace que doy arriba):

arcgis

Espero que te ayude...

Aragón
fuente
¿Será por trabajar con ags 10.1? En 10.1 es * .sd en lugar de * .msd.
user7172
sí, esto es para 10 pero puedes actualizar el nuevo arcpy para 10.1 ...
Aragón
1
¡Gracias Aragón, esto fue muy útil! Acabo de terminar de publicar automáticamente más de 130 MXD. :) Solo para la posteridad, el flujo de trabajo 10.1 es: arcpy.mapping.CreateMapSDDraft-> arcpy.StageService_server->arcpy.UploadServiceDefinition_server
Mintx
4

Aragón tiene una gran respuesta, pero desafortunadamente no funciona para ArcGIS / ArcServer 10.1.

El nuevo método que acabo de probar se basa en la ayuda de ArcGIS 10.1. Puede encontrar el enlace al archivo de ayuda aquí: http://resources.arcgis.com/en/help/main/10.1/index.html#//00s30000006q000000

Así es como usé el código para publicar MXDs basados ​​en una carpeta específica:

#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']

Puede haber una forma más simple de usar este código, pero funciona para mí. Espero que esto ayude.

Btelliot
fuente