Estoy acuñando un nuevo término aquí - Integración Total - que significa la integración continua y automatizada de cualquier dato y cualquier servicio ArcGIS, este concepto combina el movimiento de datos con la actualización de los servicios web que alimentan los datos. Sin ETL manual, sin procesos desconectados después del ETL, sin tiempo de inactividad, solo mantenimiento continuo del Enterprise Service Bus como debe hacerse, en un solo proceso.<\/P>
Se ha vuelto trillado decir que estás "emocionado" de compartir detalles sobre la funcionalidad, pero realmente siento que usar un Notebook como un programador ligero llevará la automatización de herramientas web a las masas.<\/P>
Mi escenario de ejemplo sucede que es sobre mantener un localizador de portal (es decir, servicio de geocodificación), un servicio fundamental muy común, pero lee entre líneas y visualiza tu suite completa de servicios bajo gestión continua sin importar cómo cambien los datos que los alimentan. Por supuesto, no tienes que estar manteniendo un servicio, tu herramienta web puede estar haciendo cualquier tipo de geoprocesamiento.<\/P>
Datos del Localizador de San Francisco desde Socrata<\/span><\/span><\/P>Hay algunas partes en la integración total, el truco es hacer que funcionen juntas. Los pasos lógicos son:<\/P>Publicar una herramienta web<\/STRONG> que mueva tus datos y<\/EM> <\/STRONG>actualice tu servicio web objetivo (si aplica)<\/LI>Automatizar la herramienta web en un horario<\/LI><\/OL>En mi caso uso ArcGIS Data Interoperability<\/STRONG> en la herramienta web pero eso es solo un artefacto de mi fuente de datos. Los momentos reveladores para mí fueron darme cuenta que podía combinar ETL con geoprocesamiento central para incluir la actualización del servicio en mi herramienta web y también usar un Notebook alojado en ArcGIS Online como un programador ligero para automatización completa.<\/P>Aunque usualmente soy una persona sin código, hay un poco de Python involucrado, pero puedes relajarte, estoy compartiendo los patrones de código en la descarga del blog. Mi escenario del blog está en el extremo alto en su uso de ArcPy pero solo porque ArcGIS actualmente carece de una herramienta de geoprocesamiento que reconstruya un localizador de portal (nota para mí: conseguir uno pronto), muchas veces podrías construir tu herramienta web usando Data Interoperability llamada dentro de ModelBuilder, así sin código ArcPy.<\/P>Así que con algo de ArcPy y usando la API Python de ArcGIS en un Notebook podemos juntar todo. ¡Comencemos!<\/P>Mi conjunto de datos fuente para integrar es el Sistema Empresarial de Direccionamiento del ciudad y condado de San Francisco Direcciones con Unidades<\/A>. Los datos cambian diariamente y quiero que un localizador del portal se actualice cada día antes del horario laboral. Aquí está mi espacio de trabajo Data Interoperability creado en Pro y que hace el trabajo interactivamente:<\/P>
Actualizar Localizador del Portal<\/span><\/span><\/P>La herramienta ETL lee un archivo CSV desde una URL proporcionada por Socrata, escribe las entidades a una geodatabase temporal, realiza detección de cambios entre los datos más recientes y su estado previo (mantenido en un servicio de entidades del portal) luego escribe los cambios tanto al servicio de entidades como a una clase de entidades Edits en la geodatabase temporal. También me envía por correo electrónico un resumen útil de direcciones nuevas o cambiadas. La herramienta está en la descarga del blog y requiere Pro 3.0+ y Data Interoperability.<\/P>
Spoiler<\/a>script de cierre que llama a ArcPy en el entorno temporal del geoprocesamiento! Las herramientas ETL Data Interoperability son herramientas de geoprocesamiento y la geodatabase temporal en este caso se encuentra mediante este parámetro scriptado:<\/P> <\/P>import arcpy
scratchGDB = arcpy.CreateScratchName("xyz",".gdb","Workspace",arcpy.env.scratchFolder)
arcpy.AddMessage('Usando GDB temporal {}'.format(scratchGDB))
return scratchGDB<\/code><\/pre><P> <\/P><P>La carpeta temporal se encuentra similarmente:<\/P><P> <\/P><pre class="lia-code-sample language-python"><code>import arcpy
scratchFolder = str(arcpy.env.scratchFolder)
arcpy.AddMessage('Usando carpeta temporal {}'.format(scratchFolder))
return scratchFolder<\/code><\/pre><P> <\/P><P>Cuando se comparte como una herramienta web el registro muestra estos mensajes:<\/P><P><STRONG>Usando GDB temporal C:\\Users\\arcgis\\AppData\\Local\\Temp\\scratch\\xx0.gdb<\/STRONG><BR \/><STRONG>Usando carpeta temporal C:\\Users\\arcgis\\AppData\\Local\\Temp\\scratch<\/STRONG><\/P><P>Ahora la parte poderosa, usar ArcPy en un <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 cierre</A> para recrear el servicio localizador. El código para crear el localizador se originó como una copia desde un elemento histórico después de ejecutar una herramienta Crear Localizador, el resto simplemente leyendo la ayuda.<\/P><P> <\/P><pre class="lia-code-sample language-python"><code># Si hay ediciones entonces recrear el localizador del 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'):
# Crear o recrear el localizador si hay cambios en los datos
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")
# Crear el borrador SD y 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 la Ciudad de San Francisco actualizado a las {} PST'.format(sfNowStr)
summary += '\\nConstruido desde la fuente 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)
# Subir el locator
if analyze_messages['errors'] == {}:
arcpy.SignInToPortal(portalURL,portalUser,portalPassword)
arcpy.server.StageService(sddraft_file,sd_file)
arcpy.server.UploadServiceDefinition(sd_file,serverURL)
# Limpiar la GDB temporal
try:
arcpy.management.Delete(scratchGDB)
except:
pass
Así que esa es la herramienta ETL que publiqué como una herramienta web. Antes de continuar con cómo orquestamos la herramienta web, tengo un par de consejos sobre la creación y publicación.<\/P>
- La herramienta ETL no tiene parámetros en lo que respecta al entorno de geoprocesamiento, porque configuré todas sus entradas para no<\/EM> ser publicadas. Esto evita un comportamiento con un archivo CSV de entrada que está en una URL: ArcGIS Enterprise no puede registrar una URL como almacén de datos ni copiar los datos al servidor en tiempo de ejecución, así que simplemente lo ocultamos no publicando el parámetro.<\/LI>La herramienta ETL usa un par de conexiones web para acceder al portal y autenticarse en un servicio de correo electrónico. Obtienes estas en el servidor copiándolas como archivos XML desde el menú Tools>Options>Web Connections, copiándolas al servidor, iniciando sesión en el servidor como el propietario del servicio arcgis, iniciando Workbench desde fmeworkbench.exe<\/STRONG> e importándolas desde la misma interfaz. Asegúrate de reautenticar cada conexión después de importarlas.<\/LI>Dado que estamos usando el entorno scratch en el servidor, que es compartido entre procesos (este comportamiento puede cambiar), el servicio de geoprocesamiento de la herramienta web está configurado para ejecutarse con un máximo de 1 instancia, esto nos previene de tener conflictos entre instancias escribiendo en la geodatabase temporal (los trabajos múltiples se pondrán en cola). Si necesitas publicar múltiples herramientas web que escriban en el entorno del servidor, entonces refactorízalas para usar espacios de trabajo temporales.<\/LI><\/UL>En este punto tenemos una herramienta web que hace lo que queremos, ahora necesitamos orquestarla según un horario<\/STRONG>. Para esto usamos un Notebook alojado en ArcGIS Online. Este es el primer notebook que he creado (se nota mi experiencia sin código) así que si yo puedo hacerlo tú también. La herramienta web se ejecuta en mi portal pero mi notebook se ejecuta en Online<\/STRONG>. Eso no es problema para el notebook, la herramienta web no se está ejecutando en Online<\/STRONG>, bajo el capó el notebook solo se autentica en el portal y envía una solicitud REST submitJob<\/STRONG>. Los notebooks Online saben cómo conectarse a instancias GIS del portal. Aquí está el notebook de una sola celda (runtime estándar):<\/P>
Notebook alojado Online<\/span><\/span><\/P> ¿Qué tan difícil es eso? Súper simple.<\/STRONG> La parte más difícil fue conseguir un certificado del equipo de TI que el portal aceptara cuando recibiera solicitudes desde ArcGIS Online (mi colega Renato S. tiene el mérito por eso). Todo lo que hice fue leer la ayuda y reemplazar los ejemplos con mis rutas y nombres. Para encontrar el nombre de la función a usar después de importar la caja de herramientas web simplemente puse el código en IDLE para que intellisense me mostrara los métodos.<\/P>Luego mientras editaba el notebook fui al editor de Tareas y configuré mi notebook para ejecutarse los días laborables a las 6am. Ten en cuenta que el selector horario del editor de tareas usa valores horarios locales desde tu navegador.<\/P>Ahora puedo dejar que el sistema(s) funcione y cada día mi organización tiene un locator actualizado mantenido en un portal!<\/P>
Detalles del elemento Locator más correo electrónico con cambios de direcciones del día<\/span><\/span><\/P> <\/P> <\/P>