Skip to content

Commit b13258a

Browse files
committed
新增默认预设底图,当不存在底图时将自动加载第一张默认预设底图,并支持后续自行添加默认预设底图
1 parent 14a604b commit b13258a

File tree

12 files changed

+186
-38
lines changed

12 files changed

+186
-38
lines changed

MapBoard.Model/BaseLayerInfo.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ public enum BaseLayerType
115115
RasterLayer,
116116
ShapefileLayer,
117117
TpkLayer,
118-
WmsLayer
118+
WmsLayer,
119+
Esri
119120
}
120121
}

MapBoard.Package/MapBoard.Package.wapproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
<GenerateAppInstallerFile>False</GenerateAppInstallerFile>
6161
<AppxAutoIncrementPackageRevision>True</AppxAutoIncrementPackageRevision>
6262
<GenerateTestArtifacts>True</GenerateTestArtifacts>
63-
<AppxBundlePlatforms>neutral</AppxBundlePlatforms>
63+
<AppxBundlePlatforms>x64</AppxBundlePlatforms>
6464
<HoursBetweenUpdateChecks>0</HoursBetweenUpdateChecks>
6565
<PackageCertificateThumbprint>58874E7939579327BB02F044550620683DBE9150</PackageCertificateThumbprint>
6666
<AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm>

MapBoard.Package/Package.appxmanifest

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<Identity
1111
Name="a6844e86-a7e5-466e-ba78-62da95e26c6b"
1212
Publisher="CN=autodotua"
13-
Version="1.0.1.0" />
13+
Version="1.0.11.0" />
1414

1515
<Properties>
1616
<DisplayName>MapBoard</DisplayName>

MapBoard.UI/MapBoard.UI.csproj

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -134,34 +134,37 @@
134134
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
135135
</None>
136136
<None Update="res\DefaultBaseMap.jpg">
137-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
137+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
138138
</None>
139139
<None Update="res\DefaultBaseMap.jpg.aux.xml">
140-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
140+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
141141
</None>
142142
<None Update="res\DefaultBaseMap.jpg.xml">
143-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
143+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
144144
</None>
145145
<None Update="res\DefaultBaseMap.jpgw">
146-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
146+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
147147
</None>
148148
<None Update="res\DefaultBaseMap.prj">
149-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
149+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
150+
</None>
151+
<None Update="res\DefaultBasemapLayers.txt">
152+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
150153
</None>
151154
<None Update="res\icon.ico">
152-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
155+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
153156
</None>
154157
<None Update="res\openlayers\index.html">
155-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
158+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
156159
</None>
157160
<None Update="res\openlayers\ol.css">
158-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
161+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
159162
</None>
160163
<None Update="res\openlayers\ol.js">
161-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
164+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
162165
</None>
163166
<None Update="res\openlayers\point.png">
164-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
167+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
165168
</None>
166169
</ItemGroup>
167170

MapBoard.UI/Mapping/GeoViewHelper.cs

Lines changed: 71 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,16 @@
55
using Esri.ArcGISRuntime.UI.Controls;
66
using FzLib;
77
using MapBoard.Model;
8+
using Newtonsoft.Json.Linq;
89
using System;
10+
using System.Collections.Generic;
11+
using System.ComponentModel;
12+
using System.Diagnostics;
913
using System.Drawing;
1014
using System.Drawing.Imaging;
1115
using System.IO;
1216
using System.Linq;
17+
using System.Reflection;
1318
using System.Runtime.InteropServices;
1419
using System.Threading.Tasks;
1520
using System.Windows;
@@ -30,9 +35,26 @@ public static async Task<ItemsOperationErrorCollection> LoadBaseGeoViewAsync(thi
3035
ItemsOperationErrorCollection errors = new ItemsOperationErrorCollection();
3136
try
3237
{
33-
Basemap basemap = new Basemap();
34-
35-
foreach (var item in Config.Instance.BaseLayers.Where(p => p.Enable).Reverse())
38+
Basemap basemap = GetBasemap(errors);
39+
await basemap.LoadAsync();
40+
if (Config.Instance.BaseLayers.Count == 0)
41+
{
42+
//如果没有底图,一般是首次打开软件的时候,那么从默认瓦片底图的文件中读取第一条加载
43+
try
44+
{
45+
var defaultBaseLayers = GetDefaultBaseLayers();
46+
if (defaultBaseLayers.Any())
47+
{
48+
Config.Instance.BaseLayers.Add(defaultBaseLayers.First());
49+
}
50+
}
51+
catch
52+
{
53+
}
54+
}
55+
//加载底图
56+
var baseLayers = Config.Instance.BaseLayers.Where(p => p.Enable && p.Type != BaseLayerType.Esri).Reverse();
57+
foreach (var item in baseLayers)
3658
{
3759
Layer layer = null;
3860
try
@@ -61,10 +83,11 @@ public static async Task<ItemsOperationErrorCollection> LoadBaseGeoViewAsync(thi
6183
errors.Add($"加载底图{item.Name}({item.Path})失败", ex);
6284
}
6385
}
64-
86+
//如果还是没有底图,那么加载单张世界地图
6587
if (basemap.BaseLayers.Count == 0)
6688
{
67-
basemap = new Basemap(new RasterLayer(Path.Combine(FzLib.Program.App.ProgramDirectoryPath, "res", "DefaultBaseMap.jpg")));
89+
string defaultBaseMapPath = Path.Combine(FzLib.Program.App.ProgramDirectoryPath, "res", "DefaultBaseMap.jpg");
90+
basemap = new Basemap(new RasterLayer(defaultBaseMapPath));
6891
}
6992
await basemap.LoadAsync();
7093
if (map is SceneView s)
@@ -100,6 +123,21 @@ public static async Task<ItemsOperationErrorCollection> LoadBaseGeoViewAsync(thi
100123
}
101124
}
102125

126+
public static IEnumerable<BaseLayerInfo> GetDefaultBaseLayers()
127+
{
128+
string defaultBasemapLayersPath = Path.Combine(FzLib.Program.App.ProgramDirectoryPath, "res", "DefaultBasemapLayers.txt");
129+
130+
if (File.Exists(defaultBasemapLayersPath))
131+
{
132+
return File.ReadAllLines(defaultBasemapLayersPath)
133+
.Select(p => p.Trim().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries))
134+
.Select(p => p.Length == 2 ?
135+
new BaseLayerInfo(BaseLayerType.WebTiledLayer, p[1]) { Name = p[0] }
136+
: throw new FormatException("默认底图文件格式错误"));
137+
}
138+
return Enumerable.Empty<BaseLayerInfo>();
139+
}
140+
103141
public static void SetHideWatermark(this GeoView map)
104142
{
105143
map.Margin = GetMinusWatermarkThickness();
@@ -123,11 +161,6 @@ public static Thickness GetMinusWatermarkThickness()
123161
return new Thickness(0, -Config.WatermarkHeight, 0, -Config.WatermarkHeight); ;
124162
}
125163

126-
public const string WebTiledLayer = nameof(WebTiledLayer);
127-
public const string RasterLayer = nameof(RasterLayer);
128-
public const string ShapefileLayer = nameof(ShapefileLayer);
129-
public const string TpkLayer = nameof(TpkLayer);
130-
131164
public static Layer GetLayer(BaseLayerInfo baseLayer)
132165
{
133166
var type = baseLayer.Type;
@@ -139,10 +172,37 @@ public static Layer GetLayer(BaseLayerInfo baseLayer)
139172
BaseLayerType.ShapefileLayer => AddShapefileLayer(arg),
140173
BaseLayerType.TpkLayer => AddTpkLayer(arg),
141174
BaseLayerType.WmsLayer => AddWmsLayer(arg),
142-
_ => throw new Exception("未知类型"),
175+
_ => throw new InvalidEnumArgumentException("未知类型"),
143176
};
144177
}
145178

179+
public static readonly string[] EsriBasemaps = typeof(Basemap)
180+
.GetMethods(BindingFlags.Static | BindingFlags.Public)
181+
.Where(p => p.Name.StartsWith("Create"))
182+
.Select(p => p.Name[6..])
183+
.ToArray();
184+
185+
private static Basemap GetBasemap(ItemsOperationErrorCollection errors)
186+
187+
{
188+
var info = Config.Instance.BaseLayers.FirstOrDefault(p => p.Type == BaseLayerType.Esri);
189+
if (info == null)
190+
{
191+
return new Basemap();
192+
}
193+
string type = info.Path;
194+
Debug.Assert(type != null);
195+
var methods = typeof(Basemap).GetMethods(BindingFlags.Static | BindingFlags.Public);
196+
var method = methods.FirstOrDefault(p => p.Name == $"Create{type}");
197+
if (method == null)
198+
{
199+
errors.Add(new ItemsOperationError("Esri底图", $"找不到类型{type}"));
200+
return new Basemap();
201+
}
202+
203+
return method.Invoke(null, null) as Basemap;
204+
}
205+
146206
private static WebTiledLayer AddTiledLayer(string url)
147207
{
148208
WebTiledLayer layer = new WebTiledLayer(url.Replace("{x}", "{col}").Replace("{y}", "{row}").Replace("{z}", "{level}"));

MapBoard.UI/UI/Dialog/SettingDialog.xaml

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
Closing="DialogWindowBase_Closing"
1919
DataContext="{Binding RelativeSource={RelativeSource Self}}"
2020
Loaded="Window_Loaded"
21+
ResizeMode="CanResize"
2122
mc:Ignorable="d">
2223
<u:DialogWindowBase.Resources>
2324
<CollectionViewSource
@@ -176,17 +177,29 @@
176177
</ui:SimpleStackPanel>
177178
</TabItem>
178179
<TabItem Header="地图">
179-
<ui:SimpleStackPanel Spacing="8">
180+
<Grid>
181+
<Grid.RowDefinitions>
182+
<RowDefinition Height="*" />
183+
<RowDefinition Height="8" />
184+
<RowDefinition Height="Auto" />
185+
</Grid.RowDefinitions>
180186
<GroupBox Header="底图">
181187
<Grid Margin="4">
182188
<Grid.RowDefinitions>
189+
<RowDefinition Height="Auto" />
190+
<RowDefinition Height="8" />
183191
<RowDefinition Height="*" />
184192
<RowDefinition Height="8" />
185193
<RowDefinition Height="Auto" />
186194
</Grid.RowDefinitions>
195+
<ComboBox
196+
ui:ControlHelper.Description="设置Esri预设底图时,该图层将永远置于最底层"
197+
ui:ControlHelper.Header="Esri预设底图"
198+
ItemsSource="{Binding EsriBasemaps}"
199+
SelectedItem="{Binding EsriBaseLayer}" />
187200
<DataGrid
188201
x:Name="grd"
189-
Height="160"
202+
Grid.Row="2"
190203
dd:DragDrop.IsDragSource="True"
191204
dd:DragDrop.IsDropTarget="True"
192205
fzc:SmoothScrollViewerHelper.SmoothScroll="{Binding Source={x:Static m:Config.Instance}, Path=SmoothScroll}"
@@ -292,13 +305,14 @@
292305
</DataGrid>
293306

294307
<ui:SimpleStackPanel
295-
Grid.Row="2"
308+
Grid.Row="4"
296309
Grid.ColumnSpan="5"
297310
HorizontalAlignment="Right"
298311
VerticalAlignment="Bottom"
299312
Orientation="Horizontal"
300313
Spacing="8">
301314
<ui:SplitButton
315+
x:Name="btnAddBasemapLayer"
302316
Click="AddButtonClick"
303317
Content="新增">
304318
<ui:SplitButton.Flyout>
@@ -321,13 +335,15 @@
321335
</ui:SimpleStackPanel>
322336
<ComboBox
323337
x:Name="cbbCoords"
324-
Grid.Row="2"
338+
Grid.Row="4"
325339
ui:ControlHelper.Header="底图坐标系"
326340
SelectedItem="{Binding Config.BasemapCoordinateSystem}" />
327341
</Grid>
328342
</GroupBox>
329343

330-
<GroupBox Header="界面">
344+
<GroupBox
345+
Grid.Row="2"
346+
Header="界面">
331347
<ui:SimpleStackPanel Spacing="8">
332348
<CheckBox
333349
Click="WatermarkCheckBox_Click"
@@ -360,7 +376,7 @@
360376
</WrapPanel>
361377
</ui:SimpleStackPanel>
362378
</GroupBox>
363-
</ui:SimpleStackPanel>
379+
</Grid>
364380
</TabItem>
365381

366382
<TabItem Header="地图画板">

MapBoard.UI/UI/Dialog/SettingDialog.xaml.cs

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,12 @@ public SettingDialog(Window owner, MapLayerCollection layers, int tabIndex = 0)
3939
FormatGpxAssociated = FileFormatAssociationUtility.IsAssociated("gpx", gpxID);
4040

4141
BaseLayers = new ObservableCollection<BaseLayerInfo>(
42-
Config.Instance.BaseLayers.Select(p => p.Clone()));
42+
Config.Instance.BaseLayers.Where(p => p.Type != BaseLayerType.Esri).Select(p => p.Clone()));
43+
var esriBaseLayer = Config.BaseLayers.FirstOrDefault(p => p.Type == BaseLayerType.Esri);
44+
if (esriBaseLayer != null)
45+
{
46+
EsriBaseLayer = esriBaseLayer.Path;
47+
}
4348
ResetIndex();
4449
BaseLayers.CollectionChanged += (p1, p2) => ResetIndex();
4550
InitializeComponent();
@@ -53,7 +58,7 @@ public SettingDialog(Window owner, MapLayerCollection layers, int tabIndex = 0)
5358
/// </summary>
5459
/// <param name="sender"></param>
5560
/// <param name="e"></param>
56-
private void Window_Loaded(object sender, RoutedEventArgs e)
61+
private async void Window_Loaded(object sender, RoutedEventArgs e)
5762
{
5863
string appPath = FzLib.Program.App.ProgramDirectoryPath;
5964
if (File.Exists(Path.Combine(appPath, Parameters.ConfigHere)))
@@ -68,10 +73,45 @@ private void Window_Loaded(object sender, RoutedEventArgs e)
6873
{
6974
rbtnAppData.IsChecked = true;
7075
}
76+
try
77+
{
78+
var defaultBasemapLayers = GeoViewHelper.GetDefaultBaseLayers();
79+
if (defaultBasemapLayers.Any())
80+
{
81+
var menu = btnAddBasemapLayer.Flyout as MenuFlyout;
82+
menu.Items.Add(new Separator());
83+
foreach (var layer in defaultBasemapLayers)
84+
{
85+
var menuItem = new MenuItem()
86+
{
87+
Header = layer.Name,
88+
};
89+
menuItem.Click += (s, e) =>
90+
{
91+
BaseLayers.Add(layer);
92+
};
93+
menu.Items.Add(menuItem);
94+
}
95+
}
96+
}
97+
catch (Exception ex)
98+
{
99+
Activate();
100+
await CommonDialog.ShowErrorDialogAsync(ex, "获取默认底图失败");
101+
}
71102
}
72103

73104
public Config Config => Config.Instance;
74105

106+
public string[] EsriBasemaps => new string[] { "" }.Concat(GeoViewHelper.EsriBasemaps).ToArray();
107+
private string esriBaseLayer;
108+
109+
public string EsriBaseLayer
110+
{
111+
get => esriBaseLayer;
112+
set => this.SetValueAndNotify(ref esriBaseLayer, value, nameof(EsriBaseLayer));
113+
}
114+
75115
/// <summary>
76116
/// 是否设置了地图画板地图包格式关联
77117
/// </summary>
@@ -134,7 +174,7 @@ private void WatermarkCheckBox_Click(object sender, RoutedEventArgs e)
134174
/// </summary>
135175
/// <param name="sender"></param>
136176
/// <param name="e"></param>
137-
private void DialogWindowBase_Closing(object sender, System.ComponentModel.CancelEventArgs e)
177+
private void DialogWindowBase_Closing(object sender, CancelEventArgs e)
138178
{
139179
if (!canClose)
140180
{
@@ -178,7 +218,19 @@ private void ResetIndex()
178218
private void OkButtonClick(object sender, RoutedEventArgs e)
179219
{
180220
Config.Instance.BaseLayers = BaseLayers.ToList();
181-
221+
if (string.IsNullOrEmpty(EsriBaseLayer))
222+
{
223+
Config.Instance.BaseLayers.RemoveAll(p => p.Type == BaseLayerType.Esri);
224+
}
225+
else
226+
{
227+
Config.Instance.BaseLayers.Add(new BaseLayerInfo()
228+
{
229+
Type = BaseLayerType.Esri,
230+
Path = EsriBaseLayer,
231+
Name = EsriBaseLayer
232+
});
233+
}
182234
RestartMainWindow();
183235
}
184236

0 commit comments

Comments
 (0)