Ejemplo n.º 1
0
        /// <summary>
        /// Returns a layer for the basemap according to that chosen by the user and saved in settings. If offline and an associated mbtiles file is present, the mbtiles layer is returned.
        /// </summary>
        /// <returns></returns>
        public static MapLayer GetBaseMap()
        {
            var dirPath = Path.Combine(App.TileLocation, "mbtiles");
            var BL      = Preferences.Get("BaseLayer", "swisstopo_pixelkarte");

            bool noInternet = MapModel.IsAppDisconnected();


            var wmtsLayer = WMSLayer.CreatePixelkarteWMTSTileLayer();

            if (BL == "osm")
            {
                wmtsLayer = OpenStreetMap.CreateTileLayer();
            }
            else if (BL == "swissimage")
            {
                wmtsLayer = WMSLayer.CreateSwissimageWMTSTileLayer();
            }
            var baseLayer = new MapLayer(true, 0, wmtsLayer);

            if (noInternet)
            {
                var filename = "swisstopo_pixelkarte.mbtiles";
                if (BL == "osm")
                {
                    filename = "osm.mbtiles";
                }
                else if (BL == "swissimage")
                {
                    filename = "swissimage.mbtiles";
                }
                foreach (var file in System.IO.Directory.GetFiles(dirPath))
                {
                    if (file.EndsWith(filename))
                    {
                        var offlineLayer = WMSLayer.CreateOfflineLayer(file) as TileLayer;
                        baseLayer = new MapLayer(true, 0, offlineLayer);
                        return(baseLayer);
                    }
                }
            }

            return(baseLayer);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Create an array of map layers: either mbtiles layers if offline and the mbtiles file exists, or direct links to the map servers
        /// </summary>
        /// <returns>An observable collection of map layers</returns>
        public static ObservableCollection <MapLayer> MakeArrayOfLayers()
        {
            int i = 0;
            //Add mbtiles layers
            var dirPath = Path.Combine(App.TileLocation, "mbtiles");

            //Create directory if it doesn't exist
            if (!File.Exists(dirPath))
            {
                Directory.CreateDirectory(dirPath);
            }

            //Get the offline layers
            var offlineLayers = GetOfflineLayers(dirPath);

            //Get the online layers
            var layers = GetLayersForMap(App.CurrentProjectId);
            //Create an array for adding the layers into in an ordered fashion
            var mapLayersTemp = new MapLayer[layers.Count];
            //Add online wms layers
            var layerStack = layers.OrderBy(o => o.order).ToList();

            bool noInternet = MapModel.IsAppDisconnected();

            foreach (var layer in layerStack)
            {
                //Now add the layers in their correct order
                try
                {
                    var layerNo = Math.Max(layers.Count - layer.order, 0);


                    bool offlineLayerExists = offlineLayers.Keys.Contains(layer.title);

                    if (noInternet && offlineLayerExists)
                    {
                        //If no internet, check for saved tiles
                        ILayer offlineLayer;
                        offlineLayers.TryGetValue(layer.title, out offlineLayer);

                        if (offlineLayer != null)
                        {
                            offlineLayer.Opacity = layer.opacity;
                            offlineLayer.Enabled = layer.visible;
                            var WmsLayer = new MapLayer(true, 0, offlineLayer);
                            WmsLayer.Opacity = layer.opacity;
                            WmsLayer.Enabled = layer.visible;
                            WmsLayer.LayerZ  = layer.order;
                            WmsLayer.Name    = layer.title;
                            mapLayersTemp.SetValue(WmsLayer, layerNo);
                            var      path = dirPath + "/" + layer.title;
                            FileInfo fi   = new FileInfo(dirPath + "/" + layer.title + ".mbtiles");
                            if (fi != null)
                            {
                                WmsLayer.LocalStorage = fi.Length;
                            }
                            else
                            {
                                WmsLayer.LocalStorage = 0;
                            }
                            i++;
                        }
                    }
                    else
                    {
                        //If internet, read directly from WMS
                        var layerWms = WMSLayer.CreateWMSLayer(layer.url, layer.wmsLayer, "EPSG:3857", layer.title);
                        layerWms.Opacity = layer.opacity;
                        layerWms.Enabled = layer.visible;
                        if (layerWms != null)
                        {
                            var WmsLayer = new MapLayer(true, 0, layerWms);
                            WmsLayer.Opacity = layer.opacity;
                            WmsLayer.Enabled = layer.visible;
                            WmsLayer.LayerZ  = layer.order;
                            WmsLayer.Name    = layer.title;
                            mapLayersTemp.SetValue(WmsLayer, layerNo);
                            if (offlineLayerExists)
                            {
                                var      path = dirPath + "/" + layer.title;
                                FileInfo fi   = new FileInfo(dirPath + "/" + layer.title + ".mbtiles");
                                if (fi != null)
                                {
                                    WmsLayer.LocalStorage = fi.Length;
                                }
                                else
                                {
                                    WmsLayer.LocalStorage = 0;
                                }
                            }
                            i++;
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }
            var mapLayersTempList = mapLayersTemp.ToList().GetRange(0, i);

            return(new ObservableCollection <MapLayer>(mapLayersTempList as List <MapLayer>));
        }