Skip to content

Commit ded2131

Browse files
committed
KML导入修改为先完全展开然后导入的模式
1 parent 8cf089f commit ded2131

File tree

2 files changed

+80
-54
lines changed

2 files changed

+80
-54
lines changed

MapBoard.Core/IO/Kml.cs

Lines changed: 75 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,58 @@ await Task.Run(async () =>
5050
await kml.SaveAsAsync(path);
5151
}
5252

53+
public static async Task ImportAsync(string path, MapLayerCollection layers)
54+
{
55+
KmlDataset kml = new KmlDataset(new Uri(path));
56+
await kml.LoadAsync();
57+
List<MapPoint> points = new List<MapPoint>();
58+
List<Polyline> lines = new List<Polyline>();
59+
List<Polygon> polygons = new List<Polygon>();
60+
foreach (var node in GetAllKmlPlacemark(kml))
61+
{
62+
switch (node.GraphicType)
63+
{
64+
case KmlGraphicType.None:
65+
break;
66+
case KmlGraphicType.Point:
67+
points.Add(node.Geometry.RemoveZAndM() as MapPoint);
68+
break;
69+
case KmlGraphicType.Polyline:
70+
lines.Add(node.Geometry.RemoveZAndM() as Polyline);
71+
break;
72+
case KmlGraphicType.Polygon:
73+
polygons.Add(node.Geometry.RemoveZAndM() as Polygon);
74+
break;
75+
case KmlGraphicType.ExtrudedPoint:
76+
break;
77+
case KmlGraphicType.ExtrudedPolyline:
78+
break;
79+
case KmlGraphicType.ExtrudedPolygon:
80+
break;
81+
case KmlGraphicType.Model:
82+
break;
83+
case KmlGraphicType.MultiGeometry:
84+
break;
85+
}
86+
}
87+
string name = Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(path));
88+
if (points.Count > 0)
89+
{
90+
var layer = await LayerUtility.CreateShapefileLayerAsync(GeometryType.Point, layers, name: name + "(点)");
91+
await layer.AddFeaturesAsync(points.Select(p => layer.CreateFeature(null, p)), FeaturesChangedSource.Import);
92+
}
93+
if (lines.Count > 0)
94+
{
95+
var layer = await LayerUtility.CreateShapefileLayerAsync(GeometryType.Polyline, layers, name: name + "(线)");
96+
await layer.AddFeaturesAsync(lines.Select(p => layer.CreateFeature(null, p)), FeaturesChangedSource.Import);
97+
}
98+
if (polygons.Count > 0)
99+
{
100+
var layer = await LayerUtility.CreateShapefileLayerAsync(GeometryType.Polygon, layers, name: name + "(面)");
101+
await layer.AddFeaturesAsync(polygons.Select(p => layer.CreateFeature(null, p)), FeaturesChangedSource.Import);
102+
}
103+
}
104+
53105
private static async Task AddToKmlAsync(IMapLayerInfo layer, KmlNodeCollection nodes)
54106
{
55107
foreach (var feature in await layer.GetAllFeaturesAsync())
@@ -105,64 +157,34 @@ private static async Task AddToKmlAsync(IMapLayerInfo layer, KmlNodeCollection n
105157
}
106158
}
107159
}
108-
109-
public static async Task ImportAsync(string path, MapLayerCollection layers)
160+
private static IEnumerable<KmlPlacemark> GetAllKmlPlacemark(KmlDataset dataset)
110161
{
111-
KmlDataset kml = new KmlDataset(new Uri(path));
112-
await kml.LoadAsync();
113-
List<MapPoint> points = new List<MapPoint>();
114-
List<Polyline> lines = new List<Polyline>();
115-
List<Polygon> polygons = new List<Polygon>();
116-
foreach (var doc in kml.RootNodes.OfType<KmlDocument>())
162+
foreach (var node in dataset.RootNodes)
117163
{
118-
KmlNodeCollection nodes = doc.ChildNodes;
119-
if (nodes.Count==1&& nodes[0] is KmlDocument)
120-
{
121-
nodes = (nodes[0] as KmlDocument).ChildNodes;
122-
}
123-
foreach (var node in nodes.OfType<KmlPlacemark>())
164+
foreach (var childNode in AddAll(node))
124165
{
125-
switch (node.GraphicType)
126-
{
127-
case KmlGraphicType.None:
128-
break;
129-
case KmlGraphicType.Point:
130-
points.Add(node.Geometry.RemoveZAndM() as MapPoint);
131-
break;
132-
case KmlGraphicType.Polyline:
133-
lines.Add(node.Geometry.RemoveZAndM() as Polyline);
134-
break;
135-
case KmlGraphicType.Polygon:
136-
polygons.Add(node.Geometry.RemoveZAndM() as Polygon);
137-
break;
138-
case KmlGraphicType.ExtrudedPoint:
139-
break;
140-
case KmlGraphicType.ExtrudedPolyline:
141-
break;
142-
case KmlGraphicType.ExtrudedPolygon:
143-
break;
144-
case KmlGraphicType.Model:
145-
break;
146-
case KmlGraphicType.MultiGeometry:
147-
break;
148-
}
149-
}
166+
yield return childNode;
167+
}
150168
}
151-
string name = Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(path));
152-
if (points.Count > 0)
169+
IEnumerable<KmlPlacemark> AddAll(KmlNode parentNode)
153170
{
154-
var layer = await LayerUtility.CreateShapefileLayerAsync(GeometryType.Point, layers, name: name+"(点)");
155-
await layer.AddFeaturesAsync(points.Select(p => layer.CreateFeature(null, p)), FeaturesChangedSource.Import);
156-
}
157-
if (lines.Count > 0)
158-
{
159-
var layer = await LayerUtility.CreateShapefileLayerAsync(GeometryType.Polyline, layers, name: name + "(线)");
160-
await layer.AddFeaturesAsync(lines.Select(p => layer.CreateFeature(null, p)), FeaturesChangedSource.Import);
161-
}
162-
if (polygons.Count > 0)
163-
{
164-
var layer = await LayerUtility.CreateShapefileLayerAsync(GeometryType.Polygon, layers, name: name + "(面)");
165-
await layer.AddFeaturesAsync(polygons.Select(p => layer.CreateFeature(null, p)), FeaturesChangedSource.Import);
171+
switch (parentNode)
172+
{
173+
case KmlContainer container:
174+
foreach (var node in container.ChildNodes)
175+
{
176+
foreach (var childNode in AddAll(node))
177+
{
178+
yield return childNode;
179+
}
180+
}
181+
break;
182+
case KmlPlacemark placemark:
183+
yield return placemark;
184+
break;
185+
default:
186+
break;
187+
}
166188
}
167189
}
168190
}

日志.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1953,4 +1953,8 @@ Url DataGrid修改为ListBox+文本框,方便修改
19531953

19541954
【地图画板】优化多选时选择要素对话框的显示,能够根据图层字段显示属性
19551955

1956-
【地图画板】修复了无法导入QGIS生成的KML的问题
1956+
【地图画板】修复了无法导入QGIS生成的KML的问题
1957+
1958+
## 20221027
1959+
1960+
【地图画板】KML导入修改为先完全展开然后导入的模式

0 commit comments

Comments
 (0)