<\/HEAD>
Con ArcGIS Runtime<\/A> se pueden crear aplicaciones nativas para todas las plataformas comunes. Las aplicaciones nativas son especialmente adecuadas para escenarios móviles en el trabajo de campo. Dado que en el campo a menudo no se garantiza una conexión a Internet estable, los mapas junto con todos los datos asociados deben almacenarse localmente en el dispositivo. Hasta ahora, existen varias formas de hacer esto con ArcGIS Runtime:<\/P><\/P>
- Exportación On Demand de datos directamente desde ArcGIS Services (
Feature<\/A>, Raster<\/A> y Vector Tile<\/A>)<\/LI>Exportación On Demand de Mapas completos<\/A><\/LI>Preprocesamiento de ArcGIS Runtime Content<\/A> o Mobile Map Packages<\/A> con ArcGIS Desktop y posterior copia al dispositivo<\/LI><\/UL>
Estas opciones también se utilizan en aplicaciones ArcGIS como
Collector<\/A>, Navigator<\/A> o Explorer<\/A>. Desde la versión 100.2 de ArcGIS Runtime, además existe el Preplanned Workflow<\/A> para la planificación continua y automatizable de escenarios móviles offline.<\/P>
El Preplanned Workflow<\/H2>
En un escenario típico de trabajo de campo, varios empleados tienen la misma tarea pero en diferentes áreas de trabajo. Un ejemplo es la inspección de calles en una ciudad, donde diferentes empleados están activos en distintas zonas urbanas. Un empleado generalmente solo necesita los datos móviles de su área y no los datos del mapa completo. A menudo, solo puede ver los datos de su propia área.

El Preplanned Workflow está diseñado precisamente para estos escenarios. Consiste esencialmente en dos partes: la planificación de áreas de trabajo en la oficina y el uso de "sub-mapas" en aplicaciones ArcGIS Runtime durante el trabajo de campo.

Planificación de áreas de trabajo en la oficina<\/H2>Se requiere un WebMap compatible con offline<\/A>. De este WebMap se necesita el ID del elemento del portal (la cadena en la URL).

Luego se definen las áreas relevantes (MapAreas) dentro del WebMap. La forma más sencilla es crear
Bookmarks<\\/A>. También se pueden determinar las Extents de las áreas y usarlas en formato JSON, por ejemplo así:
{
"xmin": -13184700,
"ymin": 3988556,
"xmax": -13004945,
"ymax": 4061479,
"spatialReference": {
"wkid": 102100
}}<SPAN class="line-numbers-rows"><SPAN><\\/SPAN><SPAN><\\/SPAN><SPAN><\\/SPAN><SPAN><\\/SPAN><SPAN><\\/SPAN><SPAN><\\/SPAN><SPAN><\\/SPAN><SPAN><\\/SPAN></SPAN>Con la ayuda del nuevo Offline Packaging Geoprocessing Service para el Preplanned Workflow se pueden realizar las siguientes tareas:
Create Map Area<\\/A>)Preprocesar datos móviles para cada área (Setup Map Area<\\/A>)Actualizar datos móviles (Refresh Map Area Package<\\/A>)
Para un WebMap se pueden crear hasta 16 MapAreas. Los datos móviles correspondientes a cada MapArea se almacenan directamente en formato utilizable offline en el portal:
- Features como base de datos SQLite
- Capa Vector Tile como Vector Tile Packages (.vtpk)
- Datos raster como Tile Packages (.tpk)
Los datos móviles tienen una referencia al MapArea correspondiente. Y todos los MapAreas tienen una referencia al WebMap correspondiente. Esto significa: si se elimina un MapArea, también se eliminan los datos móviles correspondientes en el portal. Y si se elimina el WebMap, también desaparecen todos los MapAreas más los datos móviles.
Los MapAreas y sus datos móviles asociados no se muestran en la interfaz estándar del portal. En el Catálogo de ArcGIS Pro estos elementos pueden mostrarse o eliminarse. Otra opción es usar el
AGOL Assistant<\/>.
1Cómo se implementa esto en la práctica?
Los Geoprocessing Services pueden usarse en aplicaciones web con la
ArcGIS API for JavaScripty en aplicaciones nativas con ArcGIS Runtime. Con ambos sería posible, por ejemplo, crear aplicaciones configuradoras para planificadores en la oficina. Otra opción es usar el Offline Packaging Geoprocessing Service directamente en ArcGIS Desktop. Sin embargo, mi favorito personal es la implementación con la ArcGIS API for Pythony el OfflineMapAreaManager. Con estas pocas líneas de código Python se generan MapAreas a partir de todos los Bookmarks de un WebMap y también se crean inmediatamente los datos móviles correspondientes:
# Importar módulos
from arcgis.gis import GIS
from arcgis.mapping import WebMap
from getpass import getpass
# Configurar la organización e información del usuario
password=getpass()
gis = GIS('https://www.arcgis.com', 'my named user', password)
# obtener el webmap desde el id del elemento del portal
offline_map_item = gis.content token">.<\/SPAN>obtener<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">"mi id de webmap"<\/SPAN><SPAN class="punctuation token">)<\/SPAN>
offline_webmap <SPAN class="operator token">=<\/SPAN> WebMap<SPAN class="punctuation token">(<\/SPAN>offline_map_item<SPAN class="punctuation token">)<\/SPAN>
<SPAN class="comment token"># Recorrer los marcadores del webmap y crear un área de mapa para cada marcador<\/SPAN>
<SPAN class="keyword token">para<\/SPAN> bookmark <SPAN class="keyword token">en<\/SPAN> offline_webmap<SPAN class="punctuation token">.<\/SPAN>definition<SPAN class="punctuation token">.<\/SPAN>bookmarks<SPAN class="punctuation token">:<\/SPAN>
bookmark_name <SPAN class="operator token">=<\/SPAN> bookmark<SPAN class="punctuation token">.<\/SPAN>name
item_prop <SPAN class="operator token">=<\/SPAN> <SPAN class="punctuation token">{<\/SPAN><SPAN class="string token">'title'<\/SPAN><SPAN class="punctuation token">:<\/SPAN> offline_map_item<SPAN class="punctuation token">.<\/SPAN>title <SPAN class="operator token">+<\/SPAN> <SPAN class="string token">'_'<\/SPAN> <SPAN class="operator token">+<\/SPAN> bookmark_name <SPAN class="operator token">+<\/SPAN> <SPAN class="string token">'_MapArea'<\/SPAN><SPAN class="punctuation token">,<\/SPAN>
<SPAN class="string token">'snippet'<\/SPAN><SPAN class="punctuation token">:<\/SPAN> <SPAN class="string token">'mi fragmento'<\/SPAN><SPAN class="punctuation token">,<\/SPAN>
<SPAN class="string token">'description'<\/SPAN><SPAN class="punctuation token">:<\/SPAN> <SPAN class="string token">'mi descripción'<\/SPAN><SPAN class="punctuation token">,<\/SPAN>
<SPAN class="string token">'tags'<\/SPAN><SPAN class="punctuation token">:<\/SPAN> <SPAN class="punctuation token">[<\/SPAN><SPAN class="string token">'python api'<\/Span><span>,</span> <span>'MapArea'</span>, <span>'mi etiqueta'</span><span>]</span><span>}</span>
offline_area <span>=</span> offline_webmap.offline_areas.create(area=bookmark_name, folder='mi carpeta de contenido del portal', item_properties=item_prop) <span class='line-numbers-rows'><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span>Para una prueba rápida se puede usar el cuaderno Python adjunto a este blog en notebooks.esri.com (subida).Uso de MapAreas en aplicaciones ArcGIS Runtime en campo
Las MapAreas de un WebMap y los datos móviles asociados ya han sido creados en el Portal. Ahora solo deben descargarse y usarse con ArcGIS Runtime. Las funciones de flujo de trabajo preplanificado en los SDK están disponibles a partir de la versión 100.2 de ArcGIS Runtime. Aquí están los pasos generales para la implementación usando el SDK .NET como ejemplo:
1. Cargar el WebMap
var portal = await ArcGISPortal.CreateAsync();
var webmapItem = await PortalItem.CreateAsync(portal, "ID del Portal WebMap");
var myMap = new Map(webmapItem);<span class='line-numbers-rows'><span><<EMOJI_23>></span><span><<EMOJI_24>></span><span><<EMOJI_25>></span>
2. Consultar las MapAreas de un WebMap
var offlineMapTask = await OfflineMapTask.CreateAsync(myMap);
var preplannedMapAreas = await offlineMapTask.GetPreplannedMapAreasAsync();<spanspanclass='line-numbers-rows'><spanspan><<EMOJI_27>></spanspan<span><<EMOJI_28>></spanspan
3. Descargar la información y datos de una MapArea como paquete Mobile Map Package explotado
var myArea = preplannedMapAreas.FirstOrDefault();
var downloadJob = offlineMapTask.DownloadPreplannedOfflineMap(myArea, "Ruta de almacenamiento");
var results = await downloadJob.GetResultAsync();<<EMOJI_29 > ><spanspanclass ='line-numbers-rows'><spanspan><< EMOJI _30 >></spanspan ><spanspan><< EMOJI _31 >></spanspan ><spanspan><< EMOJI _32 >></spanspan ><spanspan><< EMOJI _33 >></spanspan ></code ></pre ><p ></p ><p >4. Cargar y mostrar la MapArea almacenada localmente en el Mapa</p ><preclass ='lia-code-sample line-numbers language-none'><code >var offlineMapArea = await MobileMapPackage.OpenAsync("Ruta de almacenamiento");
myMap = offlineMapArea.Maps[0];<<EMOJI_34 > ><spanspanclass ='line-numbers-rows'><spanspan><< EMOJI _35 >></spanspan ><spanspan><< EMOJI _36 >></spanspan ></code ></pre ><p ></p ><p ><strong >Sincronización de Ediciones con el Feature Service</strong ></p ><p >Para la sincronización bidireccional de ediciones de entidades, la geodatabase SQLite local es registrada automáticamente por el <a href ='https://developers.arcgis.com/net/latest/wpf/api-reference//html/T_Esri_ArcGISRuntime_Tasks_Offline_OfflineMapTask.htm' rel ='nofollow noopener noreferrer' target ='_blank'>OfflineMapTask</a > con el Feature Service<a href ='https://developers.arcgis.com/net/latest/wpf/api-reference//html/T_Esri_ArcGISRuntime_Tasks_Offline_OfflineMapTask.htm' rel ='nofollow noopener noreferrer' target ='_blank'> </a>. Por lo tanto, el desarrollador no tiene que preocuparse. Así es como se sincroniza:</p ><p ></p ><preclass ='lia-code-sample line-numbers language-none'><code >var editLayer = class="punctuation token">(<\/SPAN>FeatureLayer
)<\/SPAN>myMap.<\/SPAN>OperationalLayers[<\/SPAN>0<\/SPAN>]<\/SPAN>;<\/SPAN>\nvar<\/SPAN> featureTable =<\/SPAN> (<\/SPAN>GeodatabaseFeatureTable)<\/SPAN>editLayer.<\/SPAN>FeatureTable;<\/SPAN>\n\nvar<\/SPAN> syncTask =<\/SPAN> await<\/SPAN> GeodatabaseSyncTask.<\/SPAN>CreateAsync<\/SPAN>(<\/SPAN>featureTable.<\/SPAN>Geodatabase.<\/SPAN>Source)<\/SPAN>;<\/SPAN>\n\n\/\/ sincronizar geodatabase<\/SPAN>\nvar<\/SPAN> taskParameters =<\/SPAN> await<\/SPAN> syncTask.<\/SPAN>CreateDefaultSyncGeodatabaseParametersAsync<\/SPAN>(<\/SPAN>featureTable.<\/SPAN>Geodatabase)<\/SPAN>;<\/SPAN>\n\nvar<\/SPAN> syncJob =<\/SPAN> syncTask.<\/span>SyncGeodatabase(taskParameters, featureTable.Geodatabase);
var result = await syncJob.GetResultAsync();
documentación. Así es como se puede implementar:<\/P><PRE class=\