Como publicar muitos arquivos MXD no ArcGIS Server 10.1 automaticamente?

12

Como publicar muitos arquivos mxd no ArcGIS Server 10.1 automaticamente?

Tenho cerca de 60 arquivos mxd e quero publicá-los automaticamente. Há alguma maneira de fazer isso?

user7172
fonte
Btelliot, seu código também funciona 10.2! Obviamente, é necessário definir alguns detalhes sobre o serviço, mas este é um ponto de partida incrível !!! 10X

Respostas:

14

você pode usar o arcpy para publicar seus arquivos mxd.

para listar seus arquivos 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

e depois siga este caminho:

1. Função AnalyzeForMSD () ( info ): analisa documentos de mapa (.mxd) para determinar fontes de possíveis problemas de adequação e desempenho ao converter um mapa em um arquivo de definição de serviço de mapa (MSD).

Exemplo:

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

2. Função ConvertToMSD () ( informações ): converte um mapa em um arquivo de definição de serviço de mapa (MSD).

Exemplo:

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. Função PublishMSDToServer () ( info ): publica um arquivo de definição de serviço de mapa existente (MSD) em um ArcGIS Server designado.

Exemplo:

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

a última coisa é que você deve fazer isso mesclar todas as funções para suas necessidades. na verdade, há um tutorial que pode ajudá-lo aqui sobre Usar o mapeamento do ArcPy para publicar documentos de mapa no ArcGIS Server . é semelhante à minha documentação ...

Para resumir (a imagem é do link fornecido acima):

arcgis

espero que ajude você ...

Aragão
fonte
Sua vontade trabalhando com a AGS 10.1? No 10.1, é * .sd em vez de * .msd.
user7172
sim este é para 10, mas você pode atualizar o novo arcpy 10,1 ...
Aragon
1
Obrigado Aragão, isso foi muito útil! Acabou de publicar automaticamente mais de 130 MXDs. :) Apenas para a posteridade, o fluxo de trabalho 10.1 é: arcpy.mapping.CreateMapSDDraft-> arcpy.StageService_server->arcpy.UploadServiceDefinition_server
Mintx
4

Aragon tem uma ótima resposta, mas infelizmente não funciona para o ArcGIS / ArcServer 10.1.

O novo método que acabei de experimentar baseia-se na ajuda do ArcGIS 10.1. Você pode encontrar o link para o arquivo de ajuda aqui: http://resources.arcgis.com/en/help/main/10.1/index.html#//00s30000006q000000

Aqui está como eu usei o código para publicar MXDs com base em uma pasta especificada:

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

Pode haver uma maneira mais simples de usar esse código, mas funciona para mim. Espero que isto ajude.

Btelliot
fonte