parâmetro scriptado<\/A>:<\/P> <\/P>
import arcpy
scratchGDB = arcpy.CreateScratchName("xyz",".gdb","Workspace",arcpy.env.scratchFolder)
arcpy.AddMessage('Usando scratch GDB {}'.format(scratchGDB))
return scratchGDB<\/code><\/pre><P> <\/P><P>A pasta temporária é encontrada similarmente:<\/P><P> <\/P><pre class="lia-code-sample language-python"><code>import arcpy
scratchFolder = str(arcpy.env.scratchFolder)
arcpy.AddMessage('Usando pasta temporária {}'.format(scratchFolder))
return scratchFolder<\/code><\/pre><P> <\/P><P>Quando compartilhada como uma ferramenta web o log mostra estas mensagens:<\/P><P><STRONG>Usando scratch GDB C:\\Users\\arcgis\\AppData\\Local\\Temp\\scratch\\xx0.gdb<\/STRONG><BR \/><STRONG>Usando pasta temporária C:\\Users\\arcgis\\AppData\\Local\\Temp\\scratch<\/STRONG><\/P><P>Agora a parte poderosa, usar ArcPy em um <A title="Shutdown Scripts" href="https:\/\/docs.safe.com\/fme\/2022.0\/html\/DataInterop_Documentation/FME_Workbench/Workbench/Startup_and_Shutdown_Python_Scripts.htm" target="_blank" rel="noopener nofollow noreferrer">script de desligamento<\/A> para recriar o serviço localizador. O código para criação do localizador originou-se como uma cópia de um item histórico após uma execução da ferramenta Create Locator, o resto veio apenas lendo a ajuda.<\/P><P> <\/P><pre class="lia-code-sample language-python"><code># Se houver edições então recrie o localizador do portal
import arcpy
import datetime
import fme
import os
import pytz
scratchGDB = fme.macroValues['ScratchGDB']
scratchFolder = fme.macroValues['ScratchFolder']
portalURL = fme.macroValues['PortalURL']
serverURL = fme.macroValues['ServerURL']
portalUser = fme.macroValues['PortalUser']
portalPassword = fme.macroValues['PortalPassword']
arcpy.env.workspace = scratchGDB
arcpy.env.overwriteOutput = True
if arcpy.Exists('Edits') and arcpy.Exists('AddressesWithUnits'):
# Criar ou recriar o localizador se houver mudanças nos dados
arcpy.geocoding.CreateLocator("USA",
r"{}\\AddressesWithUnits PointAddress".format(scratchGDB),
"'PointAddress.HOUSE_NUMBER AddressesWithUnits.Full_Address_Number';"+
"'PointAddress.STREET_NAME AddressesWithUnits.Street_Name';"+
"'PointAddress.STREET_SUFFIX_TYPE AddressesWithUnits.Street_Type';"+
"'PointAddress.SUB_ADDRESS_UNIT AddressesWithUnits.Unit_Number';"+
"'PointAddress.NEIGHBORHOOD AddressesWithUnits.Neighborhood';"+
"'PointAddress.CITY AddressesWithUnits.City';"+
"'PointAddress.SUBREGION AddressesWithUnits.County';"+
"'PointAddress.REGION AddressesWithUnits.Region';"+
"'PointAddress.POSTAL AddressesWithUnits.ZIP_Code';"+
"'PointAddress.COUNTRY AddressesWithUnits.Country';",
r"{}\\SanFrancisco".format(scratchFolder),
"ENG",None,None,None,"GLOBAL_HIGH")
# Criar o rascunho SD e SD
locator_path = os.path.join(scratchFolder,'SanFrancisco')
sddraft_file = os.path.join(scratchFolder,'SanFrancisco.sddraft')
sd_file = os.path.join(scratchFolder,'SanFrancisco.sd')
service_name = 'SanFrancisco'
pst = pytz.timezone('US/Pacific')
sfNow = datetime.datetime.now(pst)
sfNowStr = sfNow.strftime('%Y:%m:%d %H:%M:%S')
summary = 'Localizador Point Address With Units para a Cidade de San Francisco atualizado às {} PST'.format(sfNowStr)
summary += '\nConstruído a partir da fonte de dados Socrata: https://data.sfgov.org/Geographic-Locations-and-Boundaries/Addresses-with-Units-Enterprise-Addressing-System/ramy-di5m'
tags = 'San Francisco,EAS'
analyze_messages = arcpy.CreateGeocodeSDDraft(locator_path,
sddraft_file,
service_name,
copy_data_to_server = True,
summary = summary,
tags = tags,
max_result_size=50,
max_batch_size=1000,
suggested_batch_size=150,
overwrite_existing_service=True)
# Fazer upload do locator
if analyze_messages['errors'] == {}:
arcpy.SignInToPortal(portalURL,portalUser,portalPassword)
arcpy.server.StageService(sddraft_file,sd_file)
arcpy.server.UploadServiceDefinition(sd_file,serverURL)
# Limpar o scratch GDB
try:
arcpy.management.Delete(scratchGDB)
except:
pass
Então essa é a ferramenta ETL que publiquei como uma web tool. Antes de avançar para como orquestramos a web tool, tenho algumas dicas sobre autoria e publicação.<\/P>
- A ferramenta ETL não tem parâmetros no que diz respeito ao ambiente de geoprocessamento, porque defini todas as suas entradas para não<\/EM> serem publicadas. Isso contorna um comportamento com um arquivo CSV de entrada que está em uma URL: ArcGIS Enterprise não pode registrar uma URL como um data store ou copiar os dados para o servidor em tempo de execução, então simplesmente ocultamos isso não publicando o parâmetro.<\/LI>A ferramenta ETL usa algumas conexões web para acessar o portal e autenticar em um serviço de email. Você obtém essas conexões no servidor copiando-as como arquivos XML do menu Tools>Options>Web Connections, copiando-os para o servidor, fazendo login no servidor como o proprietário do serviço arcgis, iniciando o Workbench a partir do fmeworkbench.exe<\/STRONG> e importando-os pela mesma interface. Certifique-se de reautenticar cada conexão após importá-las.<\/LI>Como estamos usando o ambiente scratch no servidor, que é compartilhado entre processos (esse comportamento pode mudar), o serviço de geoprocessamento da web tool está configurado para rodar em no máximo 1 instância, isso nos impede de ter contenção acidental entre instâncias escrevendo no arquivo geodatabase scratch (vários trabalhos ficarão na fila). Se você precisar publicar múltiplas web tools que escrevem no ambiente do servidor, então refatore-as para usar workspaces temporários.<\/LI><\/UL>Nesse ponto temos uma web tool que faz o que queremos, agora precisamos orquestrá-la em uma programação<\/STRONG>. Para isso usamos um Notebook hospedado no ArcGIS Online. Este é o primeiro notebook que já criei (meu histórico sem código aparece) então se eu consegui você também consegue. A web tool roda no meu portal mas meu notebook roda no Online<\/STRONG>. Isso não é problema para o notebook, a web tool não está executando no Online<\/STRONG>, por baixo dos panos o notebook está apenas autenticando no portal e enviando uma requisição REST submitJob<\/STRONG>. Notebooks Online sabem como se conectar a instâncias GIS do portal. Aqui está o notebook de célula única (Standard runtime):<\/P>
Notebook hospedado Online<\/span><\/span><\/P> Quão difícil é isso? Extremamente simples.<\/STRONG> A parte mais difícil foi conseguir um certificado com a equipe de TI que o portal aceitaria ao receber do ArcGIS Online (meu colega Renato S. merece crédito por isso). Tudo que fiz foi ler a ajuda e substituir os exemplos da ajuda pelos meus caminhos e nomes. Para encontrar o nome da função a usar após importar a web toolbox, coloquei o código no IDLE para que o intellisense me mostrasse os métodos.<\/P>Depois, enquanto editava o notebook, fui ao editor de Tasks e configurei meu notebook para rodar nos dias úteis às 6h da manhã. Note que o seletor de horário do editor de tarefas usa valores de horário local do seu navegador.<\/P>Agora posso deixar os sistemas rodarem e todo dia minha organização tem um locator atualizado mantido em um portal!<\/P>
Detalhes do item Locator mais email das mudanças de endereço de hoje<\/span><\/span><\/P> <\/P> <\/P>