public static async Task<List<int>> GetLayersIdList(string url) { var geodatabaseTask = new GeodatabaseSyncTask(new Uri(url)); FeatureServiceInfo fsInfo = await geodatabaseTask.GetServiceInfoAsync(); IReadOnlyList<LayerServiceInfo> layerServiceInfos = fsInfo.Layers; return layerServiceInfos.Select(lsi => lsi.ID).ToList(); }
public static async void CreateReplicaDataBufferExtent(string url, string gdbName, string geodatabasePath, string gdbExt, IProgress<string> prog) { var serviceUrl = new Uri(url); var geodatabaseTask = new GeodatabaseSyncTask(serviceUrl); FeatureServiceInfo serviceInfo = await geodatabaseTask.GetServiceInfoAsync(); List<int> layerNumList = await GetLayersIdList(url); Geometry smallEnvelope = GeometryEngine.Buffer(serviceInfo.FullExtent.GetCenter(), 1000); await CreateReplica(url, layerNumList, smallEnvelope, gdbName, geodatabasePath, gdbExt, prog); Console.WriteLine("Done CreateReplicaExtent"); }
public async Task<GeodatabaseStatusInfo> SyncGeodatabase(string url, Geodatabase gdb, bool unregister, bool syncing) { Console.WriteLine("Starting Sync " + DateTime.Now + " --> " + syncing); var syncTask = new GeodatabaseSyncTask(new Uri(url)); var layerIdsAndName = new Dictionary<int, string>(); FeatureServiceInfo serviceInfo = await syncTask.GetServiceInfoAsync(); foreach (LayerServiceInfo layerServiceInfo in serviceInfo.Layers) { if (!layerIdsAndName.ContainsKey(layerServiceInfo.ID)) { layerIdsAndName.Add(layerServiceInfo.ID, layerServiceInfo.Name); } } var tcs = new TaskCompletionSource<GeodatabaseStatusInfo>(); Action<GeodatabaseStatusInfo, Exception> completionAction = (info, ex) => { if (ex != null) { tcs.SetException(ex); return; } tcs.SetResult(info); }; var syncProgress = new Progress<GeodatabaseStatusInfo>(); syncProgress.ProgressChanged += (sndr, sts) => Console.WriteLine("Status:" + sts.Status.ToString() + "," +" --> " + syncing + "," + sts.SubmissionTime + "," + sts.ResultUri); IDictionary<int, LayerSyncInfo> layerSync = null; layerSync = new Dictionary<int, LayerSyncInfo>(); foreach (var id_name in layerIdsAndName) { var layerQuery = new LayerSyncInfo { SyncDirection = SyncDirection.Bidirectional }; layerSync.Add(id_name.Key, layerQuery); } Action<UploadResult> uploadAction = result => { Console.Write(""); }; //should we remove sync direction since it should be defined in layers? var syncParams = new SyncGeodatabaseParameters(gdb) { RollbackOnFailure = false, UnregisterGeodatabase = unregister, LayerSyncInfos = layerSync, SyncDirection = SyncDirection.Bidirectional }; Console.WriteLine("Calling sync " + DateTime.Now); await syncTask.SyncGeodatabaseAsync(syncParams, gdb, completionAction, uploadAction, TimeSpan.FromSeconds(3), syncProgress, CancellationToken.None); return await tcs.Task; }
//await CreateReplica(url, layerNumList, thisExtent, gdbName, geodatabasePath, gdbExt,prog); private static async Task CreateReplica(string featureServiceUrl, IEnumerable<int> layerNumList, Geometry geometry, string gdbNameNoExt, string geodatabasePath, string gdbExt, IProgress<string> prog) { try { DateTime begin = DateTime.UtcNow; var generationProgress = new Progress<GeodatabaseStatusInfo>(); Int64 i = 0; generationProgress.ProgressChanged += (sender, s) => { i++; }; //setup parameters var geodatabaseSyncTask = new GeodatabaseSyncTask(new Uri(featureServiceUrl)); FeatureServiceInfo serviceInfo = await geodatabaseSyncTask.GetServiceInfoAsync(); var parameters = new GenerateGeodatabaseParameters(layerNumList, geometry) { GeodatabasePrefixName = gdbNameNoExt, OutSpatialReference = SpatialReferences.WebMercator, }; if (serviceInfo.SyncEnabled) { parameters.SyncModel = serviceInfo.SyncCapabilities.SupportsPerLayerSync ? SyncModel.PerLayer : SyncModel.PerGeodatabase; } //call extension method GeodatabaseStatusInfo resultInfo = await geodatabaseSyncTask.ExGenerateGeodatabaseAsync(parameters, new TimeSpan(0, 0, 2), generationProgress); // Download geodatabase only if generation was completed without errors. Other statuses that might be checked and handled are // GeodatabaseSyncStatus.Failed and GeodatabaseSyncStatus.CompletedWithErrors. if (resultInfo.Status != GeodatabaseSyncStatus.Completed) { Logger.Report(string.Format("Geodatabase: Generating geodatabase failed. Status = {0}.", resultInfo.Status), prog); return; } //Download database ... with no buffer Logger.Report("Geodatabase: Replica created, starting download.", prog); var client = new ArcGISHttpClient(); HttpResponseMessage gdbStream = await client.GetAsync(resultInfo.ResultUri, HttpCompletionOption.ResponseHeadersRead); using (FileStream stream = File.Create(geodatabasePath + "\\" + gdbNameNoExt + gdbExt)) { await gdbStream.Content.CopyToAsync(stream); await stream.FlushAsync(); } DateTime end = DateTime.UtcNow; Logger.Report("Measured time: " + (end - begin).TotalMilliseconds + " ms.", prog); } catch (Exception ex) { Debug.WriteLine(ex.Message); Debug.WriteLine(ex.ToString()); Console.WriteLine("CreateReplica Exception" + Environment.NewLine + ex.Message); } }
private async Task GenerateGeodatabase() { var syncTask = new GeodatabaseSyncTask(new Uri(_url)); var serviceInfo = await syncTask.GetServiceInfoAsync(); var syncModel = serviceInfo.SyncCapabilities.SupportsPerLayerSync ? SyncModel.PerLayer : SyncModel.PerGeodatabase; var layerNumList = await Helpers.GetLayersIdList(_url); var options = new GenerateGeodatabaseParameters(layerNumList, serviceInfo.FullExtent) { ReturnAttachments = false, OutSpatialReference = serviceInfo.SpatialReference, SyncModel = syncModel }; var tcs = new TaskCompletionSource<GeodatabaseStatusInfo>(); Action<GeodatabaseStatusInfo, Exception> completionAction = (statusInfo, ex) => { try { if (ex != null) { tcs.SetException(ex); return; } tcs.SetResult(statusInfo); } catch (Exception) { } }; var generationProgress = new Progress<GeodatabaseStatusInfo>(); var result = await syncTask.GenerateGeodatabaseAsync(options, completionAction, TimeSpan.FromSeconds(3), generationProgress, CancellationToken.None); var statusResult = await tcs.Task; if (statusResult.Status == GeodatabaseSyncStatus.Failed) throw new ApplicationException("Map Download Failed, try again later."); await DownloadGeodatabase(statusResult, GDB_PATH); }