Usando arcpy.SetParameter () com a Ferramenta de Script Python publicada como Serviço de Geoprocessamento?

8

Eu tenho um script que precisa ser publicado no ArcGIS Server como um serviço de geoprocessamento. Este script calcula um conjunto de registros em forma de tabela. Eu preciso definir um parâmetro de saída para que ele retorne a tabela (conjunto de registros).

Portanto, para garantir que eu tenha uma tabela (não uma classe de recurso), estou usando arcpy.TableToTable_conversion (), exibindo a tabela no espaço de trabalho in_memory. Então, eu sei que tenho uma mesa. Eu sei que ele tem registros, pois eu posso executar um arcpy.GetCount e obter o número de registros.

Eu tenho o parâmetro de saída definido. Aqui está o que parece:

arcpy.SetParameter(2, theTable)

Não importa o que eu tente, isso não funciona. Na minha caixa de ferramentas, o parâmetro de saída é definido como um RecordSet. Tentei fornecer um objeto de conjunto de registros, o caminho para a classe de recurso na memória e muitas outras idéias.

Como você lida corretamente com a saída de uma tabela para uma saída do conjunto de registros usando o SetParameter for ArcGIS server?

Kenton W
fonte
Parece (da ESRI) que não posso usar o espaço de trabalho na memória para gerar conjuntos de registros. Quando o serviço recupera os itens definidos na instrução SetParameter, a tabela na memória foi excluída.
Kenton W
1
Não sei quem te disse isso, mas isso é falso. Você pode usar a saída in_memory. O único momento de real, você não pode usar a saída in_memory é quando você quer desenhar o resultado com um servidor de mapas resultado
KHibma

Respostas:

5

Na minha experiência (e estou mais do que feliz em ser corrigido nisso), quando você cria um serviço de geoprocessamento, o argumento que você fornece para a saída não é o objeto em si, mas uma referência ao objeto (o caminho do arquivo).

O tipo de dados apenas informa ao servidor como interpretar os dados, dependendo de como você executa a ferramenta (em um aplicativo, ele pode exibir automaticamente o conjunto de registros, no SOAP, você pode obter o conjunto de registros como um fluxo de dados (embora eu não tenha certeza ) e através do REST, você obterá um link).

Basicamente, você precisa escrever sua tabela neste arquivo - o servidor ArcGIS anexará automaticamente um caminho de pasta / jobid para a frente, com base na sua pasta de saída, a partir de quando você adicionou o modelo ao servidor. por exemplo

  1. Sua pasta de saída no servidor pode estar C:/arcgisserver/arcgisoutput
  2. Portanto, no servidor, essa pasta se torna /arcgisoutput
  3. Em seguida, sua saída para sua caixa de ferramentas pode ser /arcgisoutput/tabletoolbox
  4. Seu valor para a saída pode ser %scratchworkspace%/tablename.csv

Observe que o %scratchworkspace%servidor ArcGIS permite submarinar nos diretórios de saída. Consulte Conceitos-chave para serviços de geoprocessamento na ajuda da ESRI.

Portanto, o servidor cria automaticamente um ID de trabalho (UUID), cria uma pasta para você na saída e o anexa ao argumento de saída. Escreva seus dados lá e, quando recuperá-los do servidor arcgis, você obterá um link href como: http://server_name/arcgisoutput/tabletoolbox/job_id/tablename.csv

Agora você deve conseguir acessar o arquivo da maneira que desejar (use urllib2.urlopen(path).read()no Python como um atalho rápido).

Espero que tudo isso esteja claro! -H

om_henners
fonte
0

Estou assumindo que o parâmetro do conjunto de registros foi definido como derivado no script de parâmetro.

Também estou assumindo que você pode publicar a ferramenta diretamente com uma caixa de ferramentas ou através de um projeto mxd. Na minha experiência, tive mais sucesso com ferramentas publicadas em projetos mxd.

Às vezes, resolvi problemas de serviços de geoprocessamento publicando um modelo ModelBuilder que era apenas um wrapper em torno do script python, ou seja, dentro do modelo, eu tinha apenas o script e expus os parâmetros de script fora do modelo.

Roberto Messora
fonte
Estou usando uma caixa de ferramentas personalizada para publicar o script como um serviço. Quando você define um parâmetro como Saída, ele é alterado automaticamente para Derivado.
Kenton W