Example #1
0
 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();
 }
Example #2
0
        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");

        }
Example #3
0
        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;

            

        }
Example #4
0
        //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);
            }
        }
Example #5
0
        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);
        }