@@ -50,6 +50,58 @@ await Task.Run(async () =>
50
50
await kml . SaveAsAsync ( path ) ;
51
51
}
52
52
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
+
53
105
private static async Task AddToKmlAsync ( IMapLayerInfo layer , KmlNodeCollection nodes )
54
106
{
55
107
foreach ( var feature in await layer . GetAllFeaturesAsync ( ) )
@@ -105,64 +157,34 @@ private static async Task AddToKmlAsync(IMapLayerInfo layer, KmlNodeCollection n
105
157
}
106
158
}
107
159
}
108
-
109
- public static async Task ImportAsync ( string path , MapLayerCollection layers )
160
+ private static IEnumerable < KmlPlacemark > GetAllKmlPlacemark ( KmlDataset dataset )
110
161
{
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 )
117
163
{
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 ) )
124
165
{
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
+ }
150
168
}
151
- string name = Path . GetFileNameWithoutExtension ( Path . GetFileNameWithoutExtension ( path ) ) ;
152
- if ( points . Count > 0 )
169
+ IEnumerable < KmlPlacemark > AddAll ( KmlNode parentNode )
153
170
{
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
+ }
166
188
}
167
189
}
168
190
}
0 commit comments