private void writeKML(string filename) { Color[] colours = { Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Blue, Color.Indigo, Color.Violet, Color.Pink }; Document kml = new Document(); Tour tour = new Tour(); tour.Name = "First Person View"; Playlist tourplaylist = new Playlist(); AddNamespace(kml, "gx", "http://www.google.com/kml/ext/2.2"); Style style = new Style(); style.Id = "yellowLineGreenPoly"; style.Line = new LineStyle(new Color32(HexStringToColor("7f00ffff")), 4); PolygonStyle pstyle = new PolygonStyle(); pstyle.Color = new Color32(HexStringToColor("7f00ff00")); style.Polygon = pstyle; kml.AddStyle(style); // create sub folders Folder planes = new Folder(); planes.Name = "Planes"; kml.AddFeature(planes); // coords for line string CoordinateCollection coords = new CoordinateCollection(); int a = 1; int c = -1; DateTime lasttime = DateTime.MaxValue; DateTime starttime = DateTime.MinValue; Color stylecolor = Color.AliceBlue; string mode = ""; if (flightdata.Count > 0) { mode = flightdata[0].mode; } foreach (CurrentState cs in flightdata) { progressBar1.Value = 50 + (int)((float)a / (float)flightdata.Count * 100.0f / 2.0f); progressBar1.Refresh(); if (starttime == DateTime.MinValue) { starttime = cs.datetime; lasttime = cs.datetime; } if (mode != cs.mode || flightdata.Count == a) { c++; LineString ls = new LineString(); ls.AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute; ls.Extrude = true; ls.Coordinates = coords; Placemark pm = new Placemark(); pm.Name = c + " Flight Path " + mode; pm.StyleUrl = new Uri("#yellowLineGreenPoly", UriKind.Relative); pm.Geometry = ls; SharpKml.Dom.TimeSpan ts = new SharpKml.Dom.TimeSpan(); ts.Begin = starttime; ts.End = cs.datetime; pm.Time = ts; // setup for next line mode = cs.mode; starttime = cs.datetime; stylecolor = colours[c % (colours.Length - 1)]; Style style2 = new Style(); style2.Line = new LineStyle(new Color32(stylecolor), 4); pm.StyleSelector = style2; kml.AddFeature(pm); coords = new CoordinateCollection(); } coords.Add(new Vector(cs.lat, cs.lng, cs.alt)); SharpKml.Dom.Timestamp tstamp = new SharpKml.Dom.Timestamp(); tstamp.When = cs.datetime; FlyTo flyto = new FlyTo(); flyto.Duration = (cs.datetime - lasttime).TotalMilliseconds / 1000.0; flyto.Mode = FlyToMode.Smooth; SharpKml.Dom.Camera cam = new SharpKml.Dom.Camera(); cam.AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute; cam.Latitude = cs.lat; cam.Longitude = cs.lng; cam.Altitude = cs.alt; cam.Heading = cs.yaw; cam.Roll = -cs.roll; cam.Tilt = (90 - (cs.pitch * -1)); cam.GXTimePrimitive = tstamp; flyto.View = cam; //if (Math.Abs(flyto.Duration.Value) > 0.1) { tourplaylist.AddTourPrimitive(flyto); lasttime = cs.datetime; } Placemark pmplane = new Placemark(); pmplane.Name = "Plane " + a; pmplane.Time = tstamp; pmplane.Visibility = false; SharpKml.Dom.Location loc = new SharpKml.Dom.Location(); loc.Latitude = cs.lat; loc.Longitude = cs.lng; loc.Altitude = cs.alt; SharpKml.Dom.Orientation ori = new SharpKml.Dom.Orientation(); ori.Heading = cs.yaw; ori.Roll = -cs.roll; ori.Tilt = -cs.pitch; SharpKml.Dom.Scale sca = new SharpKml.Dom.Scale(); sca.X = 2; sca.Y = 2; sca.Z = 2; Model model = new Model(); model.Location = loc; model.Orientation = ori; model.AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute; model.Scale = sca; try { Description desc = new Description(); desc.Text = @"<![CDATA[ <table> <tr><td>Roll: " + model.Orientation.Roll + @" </td></tr> <tr><td>Pitch: " + model.Orientation.Tilt + @" </td></tr> <tr><td>Yaw: " + model.Orientation.Heading + @" </td></tr> </table> ]]>"; pmplane.Description = desc; } catch { } Link link = new Link(); link.Href = new Uri("block_plane_0.dae", UriKind.Relative); model.Link = link; pmplane.Geometry = model; planes.AddFeature(pmplane); a++; } tour.Playlist = tourplaylist; kml.AddFeature(tour); Serializer serializer = new Serializer(); serializer.Serialize(kml); //Console.WriteLine(serializer.Xml); StreamWriter sw = new StreamWriter(filename); sw.Write(serializer.Xml); sw.Close(); // create kmz - aka zip file FileStream fs = File.Open(filename.Replace(Path.GetExtension(filename), ".kmz"), FileMode.Create); ZipOutputStream zipStream = new ZipOutputStream(fs); zipStream.SetLevel(9); //0-9, 9 being the highest level of compression zipStream.UseZip64 = UseZip64.Off; // older zipfile // entry 1 string entryName = ZipEntry.CleanName(Path.GetFileName(filename)); // Removes drive from name and fixes slash direction ZipEntry newEntry = new ZipEntry(entryName); newEntry.DateTime = DateTime.Now; zipStream.PutNextEntry(newEntry); // Zip the file in buffered chunks // the "using" will close the stream even if an exception occurs byte[] buffer = new byte[4096]; using (FileStream streamReader = File.Open(filename,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)) { StreamUtils.Copy(streamReader, zipStream, buffer); } zipStream.CloseEntry(); filename = Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + "block_plane_0.dae"; // entry 2 entryName = ZipEntry.CleanName(Path.GetFileName(filename)); // Removes drive from name and fixes slash direction newEntry = new ZipEntry(entryName); newEntry.DateTime = DateTime.Now; zipStream.PutNextEntry(newEntry); // Zip the file in buffered chunks // the "using" will close the stream even if an exception occurs buffer = new byte[4096]; using (FileStream streamReader = File.OpenRead(filename)) { StreamUtils.Copy(streamReader, zipStream, buffer); } zipStream.CloseEntry(); zipStream.IsStreamOwner = true; // Makes the Close also Close the underlying stream zipStream.Close(); File.Delete(filename); flightdata.Clear(); }
private void DescriptionTextBox_TextChanged(object sender, TextChangedEventArgs e) { if (selectedKMLFeatureTreeViewItem != null) { Feature feature = selectedKMLFeatureTreeViewItem.Feature; Description description = new Description(); description.Text = ((TextBox)sender).Text; feature.Description = description; } }
private PostImport.ExcelPost KonverterTilExcelPost(string name, Description description, Vector coordinates, string image, string område) { var text = description != null ? description.Text : string.Empty; return new PostImport.ExcelPost { Navn = name.Trim(), Beskrivelse = StripTagsKodeOgPoengArray(text), DefaultPoengArray = LesUtPoengArray(text), Latitude = coordinates.Latitude, Longitude = coordinates.Longitude, Altitude = coordinates.Altitude ?? 0.0, Image = image, Omraade = område, HemmeligKode = LesUtHemmeligKode(text) }; }
protected void GenerateKml() { var id = Convert.ToInt32(Server.HtmlEncode(Request.QueryString["Code"])); var document = new Document(); document.Id = "Document"; document.Name = "Document"; Description dsc = new Description(); dsc.Text = @"<h1>Car's Tracking</h1> "; CoordinateCollection coordinates = new CoordinateCollection(); DataTable dt = new DataTable(); try { DataSet ds = FieldAreaViewMethof.getfieldAreaValue(id); dt = ds.Tables[0]; string isreference = ds.Tables[0].Rows[0]["isReferencePoint"].ToString(); if (isreference == "True") { dt.Rows[0].Delete(); } foreach (DataRow dr in dt.Rows) { double lon = double.Parse(ParseDMS(dr["Longitude"].ToString()).ToString()); double lat = double.Parse(ParseDMS(dr["Latitude"].ToString()).ToString()); coordinates.Add(new Vector(lat, lon, 0)); } OuterBoundary outerBoundary = new OuterBoundary(); outerBoundary.LinearRing = new LinearRing(); outerBoundary.LinearRing.Coordinates = coordinates; // Polygon Setting: Polygon polygon = new Polygon(); polygon.Extrude = true; polygon.AltitudeMode = AltitudeMode.ClampToGround; polygon.OuterBoundary = outerBoundary; //Color Style Setting: byte byte_Color_R = 150, byte_Color_G = 150, byte_Color_B = 150, byte_Color_A = 100; //you may get your own color by other method var style = new SharpKml.Dom.Style(); style.Polygon = new PolygonStyle(); style.Polygon.ColorMode = SharpKml.Dom.ColorMode.Normal; style.Polygon.Color = new Color32(byte_Color_A, byte_Color_B, byte_Color_G, byte_Color_R); //Set the polygon and style to the Placemark: Placemark placemark = new Placemark(); placemark.Name = "Kukrail"; placemark.Geometry = polygon; placemark.AddStyle(style); //Finally to the document and save it document.AddFeature(placemark); var kml = new Kml(); kml.Feature = document; KmlFile kmlFile = KmlFile.Create(kml, true); if (File.Exists(Server.MapPath("~") + "MAP.kml")) { File.Delete(Server.MapPath("~") + "MAP.kml"); } using (var stream = System.IO.File.OpenWrite(Server.MapPath("~") + "MAP.kml")) { kmlFile.Save(stream); } } catch (Exception exc) { Response.Write(exc.Message); } finally { } }
public void generateParcour(List <List <Vector> > listOfRoutes, List <string> ListOfRouteNames, List <List <Vector> > listOfNBL, List <string> listOfNBLNames, bool hasMarkers, bool showForbiddenArea, bool isStandardOrder, double channelWidth, double altitude, bool hasRoundedCorners) { string[] styleNames = { @"PolygonAndLine", @"PolygonAndLineNoFill" }; // Document document = new Document(); KMLPolygonStyle.AddStylesForPolygon(document, styleNames); GeoData gc = new GeoData(); List <Feature> lstFeaturesPROHPolygon = new List <Feature>(); List <Feature> lstFeaturesSP = new List <Feature>(); List <Feature> lstFeaturesFP = new List <Feature>(); List <Feature> lstFeaturesNBLine = new List <Feature>(); List <Feature> lstFeaturesChannel = new List <Feature>(); Folder folderGeneral = new Folder(); folderGeneral.Name = "General"; Folder folderTKOFLines = new Folder(); folderTKOFLines.Name = "TakeOffLines"; // add a description SharpKml.Dom.Description descr = new SharpKml.Dom.Description(); descr.Text = "Add manually one or multiple take-off line(s) for your airfield<br/>into this folder for later use/import. Read more...<br/><b>Naming convention:</b>Take-off line names must start with the word <b>TKOF</b>.<br/><b>Examples:</b>TKOF_RWY21, TKOF_WEST"; folderTKOFLines.Description = descr; folderGeneral.AddFeature(folderTKOFLines); Folder folderLiveTracking = new Folder(); folderLiveTracking.Name = "LiveTracking"; // folderLiveTracking.Description = "This folder can be used for LiveTracking. Andjust the PROH areas manually.</br> Then (using a text editor) set 'clampToGround' to 'relativeToGround'.</br>"; List <Vector> lstOldRightBorder = new List <Vector>(); for (int j = 0; j < listOfRoutes.Count(); j++) { List <Vector> routePoints = listOfRoutes[j]; List <Vector> lstOrigNBLine = new List <Vector>(); Vector NBLPointOnRoute = new Vector(); string routeName = ListOfRouteNames[j]; Folder folderBorders = new Folder(); folderBorders.Name = routeName + "_RouteBorders"; // calculate headings and left/right borders List <double> lstHeadings = gc.CalculateHeadings(routePoints); List <Vector> lstLeftBorder = gc.CalculateCurvePoint(routePoints, lstHeadings, channelWidth, false, 1, hasRoundedCorners); List <Vector> lstRightBorder = gc.CalculateCurvePoint(routePoints, lstHeadings, channelWidth, true, 1, hasRoundedCorners); List <Vector> lstRightBorderMod = lstRightBorder; // used in PROH area calcs List <Vector> lstChannel = combineBorderVectorsForPolygon(lstLeftBorder, lstRightBorder); if (lstChannel.Count > 1) { // remove duplicate point at the end lstChannel.RemoveAt(lstChannel.Count - 1); } setAltitude(lstChannel, altitude); // shift start and end points of border inwards lstLeftBorder = gc.BorderModification(lstLeftBorder, SHIFT_DIST); lstRightBorder = gc.BorderModification(lstRightBorder, SHIFT_DIST); // calculate the gate points for start and end point gate. Fixed width 0.6 NM // we will use later on only the first two/ last two points List <Vector> lstGateLeft = gc.CalculateCurvePoint(routePoints, lstHeadings, GATE_WIDTH, false, 1, false); List <Vector> lstGateRight = gc.CalculateCurvePoint(routePoints, lstHeadings, GATE_WIDTH, true, 1, false); // SP line and FP line (use first/last points of left/right borders) List <Vector> lstSP, lstFP, lstNBLine; lstSP = new List <Vector>(); lstSP.Add(new Vector(lstGateRight[0].Latitude, lstGateRight[0].Longitude, altitude)); lstSP.Add(new Vector(lstGateLeft[0].Latitude, lstGateLeft[0].Longitude, altitude)); lstFP = new List <Vector>(); lstFP.Add(new Vector(lstGateRight[lstGateRight.Count - 1].Latitude, lstGateRight[lstGateRight.Count - 1].Longitude, altitude)); lstFP.Add(new Vector(lstGateLeft[lstGateLeft.Count - 1].Latitude, lstGateLeft[lstGateLeft.Count - 1].Longitude, altitude)); lstNBLine = new List <Vector>(); // check if we have a NBLINE for this route if (listOfNBLNames.IndexOf(String.Format("NBLINE-{0}", routeName)) >= 0) { int idx = listOfNBLNames.IndexOf(String.Format("NBLINE-{0}", routeName)); int idxRoutePointBeforeNBL = -1; lstOrigNBLine = listOfNBL[idx]; NBLPointOnRoute = gc.NBLPointOnRouteLine(routePoints, lstOrigNBLine, out idxRoutePointBeforeNBL); if (idxRoutePointBeforeNBL > -1) { List <Vector> lstNBLSegm = new List <Vector>(); // create a short segment with the NBL point on the route line, and the first route point after the NBL point lstNBLSegm.Add(NBLPointOnRoute); lstNBLSegm.Add(routePoints[idxRoutePointBeforeNBL + 1]); // calculate borders List <double> lstNBLHdg = gc.CalculateHeadings(lstNBLSegm); List <Vector> lstNBLGateLeft = gc.CalculateCurvePoint(lstNBLSegm, lstNBLHdg, channelWidth, false, 1, false); List <Vector> lstNBLGateRight = gc.CalculateCurvePoint(lstNBLSegm, lstNBLHdg, channelWidth, true, 1, false); lstNBLine.Clear(); lstNBLine.Add(new Vector(lstNBLGateRight[0].Latitude, lstNBLGateRight[0].Longitude, altitude)); lstNBLine.Add(new Vector(lstNBLGateLeft[0].Latitude, lstNBLGateLeft[0].Longitude, altitude)); } } List <Vector> lstLeftBorderForbiddenArea = new List <Vector>(); List <Vector> lstRightBorderForbiddenArea = new List <Vector>(); if (isStandardOrder) { if (j == 0) { // calculate LeftBorder PROH for first route List <Vector> lstLeftBorderPROH = gc.CalculateCurvePoint(routePoints, lstHeadings, channelWidth * 10, false, 1, false); //TODO: add Gate Point as first/last point to lstLeftBorderPROH lstLeftBorderPROH.Insert(0, lstGateLeft[0]); lstLeftBorderPROH.Add(lstGateLeft[lstGateLeft.Count - 1]); lstLeftBorderForbiddenArea = combineBorderVectorsForPolygon(lstLeftBorderPROH, lstLeftBorder); setAltitude(lstLeftBorderForbiddenArea, altitude); //TODO: add Gate Point as first/last point to lstRightBorderMod lstRightBorderMod.Add(lstGateRight[0]); lstRightBorderMod.Insert(0, lstGateRight[lstGateRight.Count - 1]); } else { // calculate LeftBorder PROH area from LeftBorder[j] and RightBorder[j-1] lstOldRightBorder.Add(lstGateLeft[0]); lstOldRightBorder.Insert(0, lstGateLeft[lstGateLeft.Count - 1]); lstLeftBorderForbiddenArea = combineBorderVectorsForPolygon(lstOldRightBorder, lstLeftBorder); setAltitude(lstLeftBorderForbiddenArea, altitude); } // for the last route, also calculate right border PROH if (j == listOfRoutes.Count - 1) { List <Vector> lstRightBorderPROH = gc.CalculateCurvePoint(routePoints, lstHeadings, channelWidth * 10, true, 1, false); //TODO: add Gate Point as first/last point to lstRightBorderPROH lstRightBorderPROH.Insert(0, lstGateRight[0]); lstRightBorderPROH.Add(lstGateRight[lstGateRight.Count - 1]); lstRightBorderForbiddenArea = combineBorderVectorsForPolygon(lstRightBorderPROH, lstRightBorder); setAltitude(lstRightBorderForbiddenArea, altitude); } } else { // not standard order, calculate right and left PROH areas for each channel List <Vector> lstLeftBorderPROH = gc.CalculateCurvePoint(routePoints, lstHeadings, channelWidth * 10, false, 1, false); List <Vector> lstRightBorderPROH = gc.CalculateCurvePoint(routePoints, lstHeadings, channelWidth * 10, true, 1, false); lstLeftBorderForbiddenArea = combineBorderVectorsForPolygon(lstLeftBorderPROH, lstLeftBorder); lstRightBorderForbiddenArea = combineBorderVectorsForPolygon(lstRightBorderPROH, lstRightBorder); setAltitude(lstLeftBorderForbiddenArea, altitude); setAltitude(lstRightBorderForbiddenArea, altitude); } lstOldRightBorder = lstRightBorderMod; #region Creation of KML objects var lineStrRoute = new SharpKml.Dom.LineString(); var lineStrRightBorder = new SharpKml.Dom.LineString(); var lineStrLeftBorder = new SharpKml.Dom.LineString(); var lineStrSP = new SharpKml.Dom.LineString(); var lineStrFP = new SharpKml.Dom.LineString(); var lineStrNBLine = new SharpKml.Dom.LineString(); var lineStrOrigNBLine = new SharpKml.Dom.LineString(); var lineStrChannel = new SharpKml.Dom.LineString(); lineStrRoute.Coordinates = new CoordinateCollection(routePoints); lineStrRoute.Tessellate = true; lineStrRightBorder.Coordinates = new CoordinateCollection(lstRightBorder); lineStrLeftBorder.Coordinates = new CoordinateCollection(lstLeftBorder); lineStrSP.Coordinates = new CoordinateCollection(lstSP); lineStrFP.Coordinates = new CoordinateCollection(lstFP); lineStrNBLine.Coordinates = new CoordinateCollection(lstNBLine); lineStrOrigNBLine.Coordinates = new CoordinateCollection(lstOrigNBLine); lineStrChannel.Coordinates = new CoordinateCollection(lstChannel); var polygLeftBorderForbiddenArea = makeSimplePolygon(lstLeftBorderForbiddenArea, AltitudeMode.ClampToGround); var polygRightBorderForbiddenArea = makeSimplePolygon(lstRightBorderForbiddenArea, AltitudeMode.ClampToGround); var polySP = makeSimplePolygon(lineStrSP, AltitudeMode.RelativeToGround); var polyFP = makeSimplePolygon(lineStrFP, AltitudeMode.RelativeToGround); var polyChannel = makeSimplePolygon(lineStrChannel, AltitudeMode.ClampToGround); var polyNBLine = new Polygon(); if (lstNBLine.Count > 0) { polyNBLine = makeSimplePolygon(lineStrNBLine, AltitudeMode.RelativeToGround); } // Route itself var plm = new SharpKml.Dom.Placemark(); plm = makeSimplePlacemark(lineStrRoute, routeName); folderGeneral.AddFeature(plm); plm = makeSimplePlacemark(polyChannel, "CHANNEL-" + routeName, styleNames[1]); lstFeaturesChannel.Add(plm); // original hand-made NBLine if (lstNBLine.Count > 0) { plm = new SharpKml.Dom.Placemark(); plm = makeSimplePlacemark(lineStrOrigNBLine, "NBLINE-" + routeName + " (orig)"); folderGeneral.AddFeature(plm); } // Right border line plm = makeSimplePlacemark(lineStrRightBorder, routeName + "_RightBorder"); folderBorders.AddFeature(plm); // Left border line plm = makeSimplePlacemark(lineStrLeftBorder, routeName + "_LeftBorder"); folderBorders.AddFeature(plm); // SP line plm = makeSimplePlacemark(lineStrSP, "STARTPOINT-" + routeName); folderBorders.AddFeature(plm); // FP line plm = makeSimplePlacemark(lineStrFP, "ENDPOINT-" + routeName); folderBorders.AddFeature(plm); // calculated NB line if (lstNBLine.Count > 0) { plm = makeSimplePlacemark(lineStrNBLine, "NBLINE-" + routeName); folderBorders.AddFeature(plm); } plm = makeSimplePlacemark(polySP, "STARTPOINT-" + routeName, styleNames[0]); lstFeaturesSP.Add(plm); plm = makeSimplePlacemark(polyFP, "ENDPOINT-" + routeName, styleNames[0]); lstFeaturesFP.Add(plm); if (lstNBLine.Count > 0) { plm = makeSimplePlacemark(polyNBLine, "NBLINE-" + routeName, styleNames[0]); lstFeaturesNBLine.Add(plm); } folderGeneral.AddFeature(folderBorders); if (showForbiddenArea) { //Folder folder = new Folder(); //folder.Name = "PROH-Areas " + routeName; // add forbidden Area (Polygon area) if (lstRightBorderForbiddenArea.Count > 0) { var placemarkPolyg = makeSimplePlacemark(polygRightBorderForbiddenArea, "PROH " + routeName + " Right", styleNames[0]); lstFeaturesPROHPolygon.Add(placemarkPolyg); } if (lstLeftBorderForbiddenArea.Count > 0) { var placemarkPolyg = makeSimplePlacemark(polygLeftBorderForbiddenArea, "PROH " + routeName + " Left", styleNames[0]); lstFeaturesPROHPolygon.Add(placemarkPolyg); } } if (hasMarkers) { // OPTIONAL: add markers if required for all route points Folder folder = new Folder(); folder.Name = routeName + "_RouteMarkers"; for (int i = 0; i < routePoints.Count; i++) { Placemark pm = new Placemark(); SharpKml.Dom.Point pt = new SharpKml.Dom.Point(); pt.Coordinate = new Vector(routePoints[i].Latitude, routePoints[i].Longitude); pm.Geometry = pt; pm.Name = String.Format("TP_{0}_{1}", i.ToString().PadLeft(2, '0'), routeName); if (i == 0) { pm.Name = String.Format("SP_{0}", routeName); } if (i == routePoints.Count - 1) { pm.Name = String.Format("FP_{0}", routeName); } folder.AddFeature(pm); } if (lstNBLine.Count > 0) { Placemark pm = new Placemark(); SharpKml.Dom.Point pt = new SharpKml.Dom.Point(); pt.Coordinate = new Vector(NBLPointOnRoute.Latitude, NBLPointOnRoute.Longitude); pm.Geometry = pt; pm.Name = String.Format("NBLINE_{0}", routeName); folder.AddFeature(pm); } folderGeneral.AddFeature(folder); } #endregion } #region Create Kml document for (int i = 0; i < lstFeaturesPROHPolygon.Count; i++) { folderLiveTracking.AddFeature(lstFeaturesPROHPolygon[i].Clone()); } for (int i = 0; i < lstFeaturesSP.Count; i++) { folderLiveTracking.AddFeature(lstFeaturesSP[i].Clone()); } for (int i = 0; i < lstFeaturesFP.Count; i++) { folderLiveTracking.AddFeature(lstFeaturesFP[i].Clone()); } for (int i = 0; i < lstFeaturesChannel.Count; i++) { folderLiveTracking.AddFeature(lstFeaturesChannel[i].Clone()); } for (int i = 0; i < lstFeaturesNBLine.Count; i++) { folderLiveTracking.AddFeature(lstFeaturesNBLine[i].Clone()); } document.AddFeature(folderGeneral); document.AddFeature(folderLiveTracking); #endregion }