XAML-Map-Control/SampleApps/Shared/MapLayers.cs

199 lines
7.5 KiB
C#
Raw Normal View History

using MapControl;
using System;
using System.Collections.Generic;
using System.ComponentModel;
2020-10-24 00:28:10 +02:00
using System.Globalization;
2017-09-05 23:35:12 +02:00
#if WINDOWS_UWP
using Windows.UI;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Media;
#else
using System.Windows;
using System.Windows.Media;
#endif
namespace ViewModel
{
2020-10-24 10:35:08 +02:00
public class MapLayers : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private readonly Dictionary<string, UIElement> mapLayers = new Dictionary<string, UIElement>
{
{
"OpenStreetMap",
2020-04-19 12:47:39 +02:00
new MapTileLayer
{
2020-10-23 23:35:48 +02:00
TileSource = new TileSource { UriFormat = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" },
2020-04-19 12:47:39 +02:00
SourceName = "OpenStreetMap",
Description = "© [OpenStreetMap Contributors](http://www.openstreetmap.org/copyright)",
MaxZoomLevel = 19
}
},
{
2017-10-07 17:43:28 +02:00
"OpenStreetMap German",
new MapTileLayer
{
2020-10-23 23:35:48 +02:00
TileSource = new TileSource { UriFormat = "https://{s}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png" },
SourceName = "OpenStreetMap German",
2017-10-07 17:43:28 +02:00
Description = "© [OpenStreetMap contributors](http://www.openstreetmap.org/copyright)",
2017-07-17 21:31:09 +02:00
MaxZoomLevel = 19
}
},
{
2020-10-23 23:35:48 +02:00
"OpenTopoMap",
new MapTileLayer
{
2020-10-23 23:35:48 +02:00
TileSource = new TileSource { UriFormat = "https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png" },
SourceName = "OpenTopoMap",
2020-10-24 19:23:15 +02:00
Description = "© [OpenTopoMap](https://opentopomap.org/)\n© [OpenStreetMap contributors](http://www.openstreetmap.org/copyright)",
2017-10-07 17:43:28 +02:00
MaxZoomLevel = 17
}
},
{
2020-10-23 23:35:48 +02:00
"Seamarks",
new MapTileLayer
{
2020-10-23 23:35:48 +02:00
TileSource = new TileSource { UriFormat = "http://tiles.openseamap.org/seamark/{z}/{x}/{y}.png" },
SourceName = "OpenSeaMap",
MinZoomLevel = 9,
2017-10-07 17:43:28 +02:00
MaxZoomLevel = 18
}
},
{
2020-10-23 23:35:48 +02:00
"TopPlusOpen WMTS",
new WmtsTileLayer
{
2020-10-23 23:35:48 +02:00
SourceName = "TopPlusOpen",
Description = "© [BKG](https://gdz.bkg.bund.de/index.php/default/webdienste/topplus-produkte/wmts-topplusopen-wmts-topplus-open.html)",
CapabilitiesUri = new Uri("https://sgx.geodatenzentrum.de/wmts_topplus_open/1.0.0/WMTSCapabilities.xml")
}
},
{
2020-10-23 23:35:48 +02:00
"TopPlusOpen WMS",
new WmsImageLayer
{
2020-10-23 23:35:48 +02:00
Description = "© [BKG](https://gdz.bkg.bund.de/index.php/default/webdienste/topplus-produkte/wms-topplusopen-mit-layer-fur-normalausgabe-und-druck-wms-topplus-open.html)",
ServiceUri = new Uri("https://sgx.geodatenzentrum.de/wms_topplus_open")
}
},
{
"OpenStreetMap WMS",
new WmsImageLayer
{
2017-10-08 17:35:07 +02:00
Description = "© [terrestris GmbH & Co. KG](http://ows.terrestris.de/)\nData © [OpenStreetMap contributors](http://www.openstreetmap.org/copyright)",
2020-04-19 12:47:39 +02:00
ServiceUri = new Uri("http://ows.terrestris.de/osm/service")
2017-10-08 17:35:07 +02:00
}
},
{
2020-10-23 23:35:48 +02:00
"SevenCs ChartServer WMS",
new ChartServerLayer()
2020-03-20 20:50:19 +01:00
},
{
2020-10-23 23:35:48 +02:00
"Bing Maps Road",
new BingMapsTileLayer
2020-03-20 20:50:19 +01:00
{
2020-10-23 23:35:48 +02:00
Mode = BingMapsTileLayer.MapMode.Road,
SourceName = "Bing Maps Road",
Description = "© [Microsoft](http://www.bing.com/maps/)"
2020-03-20 20:50:19 +01:00
}
},
2020-03-20 21:29:43 +01:00
{
2020-10-23 23:35:48 +02:00
"Bing Maps Aerial",
new BingMapsTileLayer
{
Mode = BingMapsTileLayer.MapMode.Aerial,
SourceName = "Bing Maps Aerial",
Description = "© [Microsoft](http://www.bing.com/maps/)",
MapForeground = new SolidColorBrush(Colors.White),
MapBackground = new SolidColorBrush(Colors.Black)
}
2020-03-20 21:29:43 +01:00
},
2020-04-19 12:47:39 +02:00
{
2020-10-23 23:35:48 +02:00
"Bing Maps Aerial with Labels",
new BingMapsTileLayer
2020-04-19 12:47:39 +02:00
{
2020-10-23 23:35:48 +02:00
Mode = BingMapsTileLayer.MapMode.AerialWithLabels,
SourceName = "Bing Maps Hybrid",
Description = "© [Microsoft](http://www.bing.com/maps/)",
MapForeground = new SolidColorBrush(Colors.White),
MapBackground = new SolidColorBrush(Colors.Black)
2020-04-19 12:47:39 +02:00
}
},
};
private string currentMapLayerName = "OpenStreetMap";
public string CurrentMapLayerName
{
get { return currentMapLayerName; }
set
{
currentMapLayerName = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CurrentMapLayerName)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CurrentMapLayer)));
}
}
public UIElement CurrentMapLayer
{
get { return mapLayers[currentMapLayerName]; }
}
public UIElement SeamarksLayer
{
get { return mapLayers["Seamarks"]; }
}
public List<string> MapLayerNames { get; } = new List<string>
{
"OpenStreetMap",
2017-10-07 17:43:28 +02:00
"OpenStreetMap German",
2020-10-23 23:35:48 +02:00
"OpenTopoMap",
2020-03-20 20:50:19 +01:00
"TopPlusOpen WMTS",
2020-10-23 23:35:48 +02:00
"TopPlusOpen WMS",
"OpenStreetMap WMS",
2020-04-19 12:47:39 +02:00
"SevenCs ChartServer WMS",
};
public MapLayers()
{
2020-10-24 10:29:12 +02:00
// Add Bing Maps TileLayers with tile URLs retrieved from the Imagery Metadata Service
2020-10-24 10:23:16 +02:00
// (http://msdn.microsoft.com/en-us/library/ff701716.aspx).
// A Bing Maps API Key (http://msdn.microsoft.com/en-us/library/ff428642.aspx) is required
// for using these layers and must be assigned to the static BingMapsTileLayer.ApiKey property.
2017-10-08 17:35:07 +02:00
if (!string.IsNullOrEmpty(BingMapsTileLayer.ApiKey))
{
MapLayerNames.Add("Bing Maps Road");
MapLayerNames.Add("Bing Maps Aerial");
MapLayerNames.Add("Bing Maps Aerial with Labels");
}
}
}
public class ChartServerLayer : WmsImageLayer
{
public ChartServerLayer()
{
Description = "© [SevenCs GmbH](http://www.sevencs.com)";
ServiceUri = new Uri("https://wms.sevencs.com:9090");
Layers = "ENC";
MaxBoundingBoxWidth = 360;
}
2020-10-24 00:28:10 +02:00
protected override string GetCrsParam(MapProjection projection)
{
2020-10-24 00:28:10 +02:00
switch (projection.CrsId)
{
case "AUTO2:97001":
return string.Format(CultureInfo.InvariantCulture, "CRS=AUTO2:7CS01,1,{0},{1}", projection.Center.Longitude, projection.Center.Latitude);
case "AUTO2:97002":
return string.Format(CultureInfo.InvariantCulture, "CRS=AUTO2:7CS02,1,{0},{1}", projection.Center.Longitude, projection.Center.Latitude);
default:
return base.GetCrsParam(projection);
}
}
}
}