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 CreateReportFiles(Dictionary<string, PictureInformation> listPhotosWithInfo, string dirWithImages, float offset) { // Write report files Document kml = new Document(); // Clear Stations IDs JXL_StationIDs.Clear(); using (StreamWriter swlogloccsv = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "loglocation.csv")) using (StreamWriter swlockml = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.kml")) using (StreamWriter swloctxt = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.txt")) using (StreamWriter swloctel = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.tel")) using (XmlTextWriter swloctrim = new XmlTextWriter(dirWithImages + Path.DirectorySeparatorChar + "location.jxl", Encoding.ASCII)) { swloctrim.Formatting = Formatting.Indented; swloctrim.WriteStartDocument(false); swloctrim.WriteStartElement("JOBFile"); swloctrim.WriteAttributeString("jobName", "MPGeoRef"); swloctrim.WriteAttributeString("product", "Gatewing"); swloctrim.WriteAttributeString("productVersion", "1.0"); swloctrim.WriteAttributeString("version", "5.6"); // enviro swloctrim.WriteStartElement("Environment"); swloctrim.WriteStartElement("CoordinateSystem"); swloctrim.WriteElementString("SystemName", "Default"); swloctrim.WriteElementString("ZoneName", "Default"); swloctrim.WriteElementString("DatumName", "WGS 1984"); swloctrim.WriteStartElement("Ellipsoid"); swloctrim.WriteElementString("EarthRadius", "6378137"); swloctrim.WriteElementString("Flattening", "0.00335281067183"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("Projection"); swloctrim.WriteElementString("Type", "NoProjection"); swloctrim.WriteElementString("Scale", "1"); swloctrim.WriteElementString("GridOrientation", "IncreasingNorthEast"); swloctrim.WriteElementString("SouthAzimuth", "false"); swloctrim.WriteElementString("ApplySeaLevelCorrection", "true"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("LocalSite"); swloctrim.WriteElementString("Type", "Grid"); swloctrim.WriteElementString("ProjectLocationLatitude", ""); swloctrim.WriteElementString("ProjectLocationLongitude", ""); swloctrim.WriteElementString("ProjectLocationHeight", ""); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("Datum"); swloctrim.WriteElementString("Type", "ThreeParameter"); swloctrim.WriteElementString("GridName", "WGS 1984"); swloctrim.WriteElementString("Direction", "WGS84ToLocal"); swloctrim.WriteElementString("EarthRadius", "6378137"); swloctrim.WriteElementString("Flattening", "0.00335281067183"); swloctrim.WriteElementString("TranslationX", "0"); swloctrim.WriteElementString("TranslationY", "0"); swloctrim.WriteElementString("TranslationZ", "0"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("HorizontalAdjustment"); swloctrim.WriteElementString("Type", "NoAdjustment"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("VerticalAdjustment"); swloctrim.WriteElementString("Type", "NoAdjustment"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("CombinedScaleFactor"); swloctrim.WriteStartElement("Location"); swloctrim.WriteElementString("Latitude", ""); swloctrim.WriteElementString("Longitude", ""); swloctrim.WriteElementString("Height", ""); swloctrim.WriteEndElement(); swloctrim.WriteElementString("Scale", ""); swloctrim.WriteEndElement(); swloctrim.WriteEndElement(); swloctrim.WriteEndElement(); // fieldbook swloctrim.WriteStartElement("FieldBook"); swloctrim.WriteRaw(@" <CameraDesignRecord ID='00000001'> <Type>GoPro </Type> <HeightPixels>2400</HeightPixels> <WidthPixels>3200</WidthPixels> <PixelSize>0.0000022</PixelSize> <LensModel>Rectilinear</LensModel> <NominalFocalLength>0.002</NominalFocalLength> </CameraDesignRecord> <CameraRecord2 ID='00000002'> <CameraDesignID>00000001</CameraDesignID> <CameraPosition>01</CameraPosition> <Optics> <IdealAngularMagnification>1.0</IdealAngularMagnification> <AngleSymmetricDistortion> <Order3>-0.35</Order3> <Order5>0.15</Order5> <Order7>-0.033</Order7> <Order9> 0</Order9> </AngleSymmetricDistortion> <AngleDecenteringDistortion> <Column>0</Column> <Row>0</Row> </AngleDecenteringDistortion> </Optics> <Geometry> <PerspectiveCenterPixels> <PrincipalPointColumn>-1615.5</PrincipalPointColumn> <PrincipalPointRow>-1187.5</PrincipalPointRow> <PrincipalDistance>-2102</PrincipalDistance> </PerspectiveCenterPixels> <VectorOffset> <X>0</X> <Y>0</Y> <Z>0</Z> </VectorOffset> <BiVectorAngle> <XX>0</XX> <YY>0</YY> <ZZ>-1.5707963268</ZZ> </BiVectorAngle> </Geometry> </CameraRecord2>"); // 2mm fl // res 2400 * 3200 = 7,680,000 // sensor size = 1/2.5" - 5.70 × 4.28 mm // 2.2 μm // fl in pixels = fl in mm * res / sensor size swloctrim.WriteStartElement("PhotoInstrumentRecord"); swloctrim.WriteAttributeString("ID", "0000000E"); swloctrim.WriteElementString("Type", "Aerial"); swloctrim.WriteElementString("Model", "X100"); swloctrim.WriteElementString("Serial", "000-000"); swloctrim.WriteElementString("FirmwareVersion", "v0.0"); swloctrim.WriteElementString("UserDefinedName", "Prototype"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("AtmosphereRecord"); swloctrim.WriteAttributeString("ID", "0000000F"); swloctrim.WriteElementString("Pressure", ""); swloctrim.WriteElementString("Temperature", ""); swloctrim.WriteElementString("PPM", ""); swloctrim.WriteElementString("ApplyEarthCurvatureCorrection", "false"); swloctrim.WriteElementString("ApplyRefractionCorrection", "false"); swloctrim.WriteElementString("RefractionCoefficient", "0"); swloctrim.WriteElementString("PressureInputMethod", "ReadFromInstrument"); swloctrim.WriteEndElement(); swloctel.WriteLine("version=1"); swloctel.WriteLine("#seconds offset - " + offset); swloctel.WriteLine("#longitude and latitude - in degrees"); swloctel.WriteLine("#name utc longitude latitude height"); swloctxt.WriteLine("#name longitude/X latitude/Y height/Z yaw pitch roll"); TXT_outputlog.AppendText("Start Processing\n"); // Dont know why but it was 10 in the past so let it be. Used to generate jxl file simulating x100 from trimble int lastRecordN = JXL_ID_OFFSET; // path CoordinateCollection coords = new CoordinateCollection(); foreach (var item in vehicleLocations.Values) { coords.Add(new SharpKml.Base.Vector(item.Lat, item.Lon, item.AltAMSL)); } var ls = new LineString() { Coordinates = coords, AltitudeMode = AltitudeMode.Absolute }; SharpKml.Dom.Placemark pm = new SharpKml.Dom.Placemark() { Geometry = ls, Name = "path" }; kml.AddFeature(pm); foreach (PictureInformation picInfo in listPhotosWithInfo.Values) { string filename = Path.GetFileName(picInfo.Path); string filenameWithoutExt = Path.GetFileNameWithoutExtension(picInfo.Path); SharpKml.Dom.Timestamp tstamp = new SharpKml.Dom.Timestamp(); tstamp.When = picInfo.Time; kml.AddFeature( new Placemark() { Time = tstamp, Visibility = true, Name = filenameWithoutExt, Geometry = new SharpKml.Dom.Point() { Coordinate = new Vector(picInfo.Lat, picInfo.Lon, picInfo.AltAMSL), AltitudeMode = AltitudeMode.Absolute }, Description = new Description() { Text = "<table><tr><td><img src=\"" + filename.ToLower() + "\" width=500 /></td></tr></table>" }, StyleSelector = new Style() { Balloon = new BalloonStyle() { Text = "$[name]<br>$[description]" } } } ); double lat = picInfo.Lat; double lng = picInfo.Lon; double alpha = picInfo.Yaw + (double)num_camerarotation.Value;; RectangleF rect = getboundingbox(lat, lng, alpha, (double)num_hfov.Value, (double)num_vfov.Value); Console.WriteLine(rect); //http://en.wikipedia.org/wiki/World_file /* using (StreamWriter swjpw = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(filename) + ".jgw")) { swjpw.WriteLine((rect.Height / 2448.0).ToString("0.00000000000000000")); swjpw.WriteLine((0).ToString("0.00000000000000000")); // swjpw.WriteLine((0).ToString("0.00000000000000000")); // swjpw.WriteLine((rect.Width / -3264.0).ToString("0.00000000000000000")); // distance per pixel swjpw.WriteLine((rect.Left).ToString("0.00000000000000000")); swjpw.WriteLine((rect.Top).ToString("0.00000000000000000")); swjpw.Close(); }*/ kml.AddFeature( new GroundOverlay() { Name = filenameWithoutExt, Visibility = false, Time = tstamp, AltitudeMode = AltitudeMode.ClampToGround, Bounds = new LatLonBox() { Rotation = -alpha % 360, North = rect.Bottom, East = rect.Right, West = rect.Left, South = rect.Top, }, Icon = new SharpKml.Dom.Icon() { Href = new Uri(filename.ToLower(), UriKind.Relative), }, } ); swloctxt.WriteLine(filename + " " + picInfo.Lat + " " + picInfo.Lon + " " + picInfo.getAltitude(useAMSLAlt) + " " + picInfo.Yaw + " " + picInfo.Pitch + " " + picInfo.Roll); swloctel.WriteLine(filename + "\t" + picInfo.Time.ToString("yyyy:MM:dd HH:mm:ss") + "\t" + picInfo.Lon + "\t" + picInfo.Lat + "\t" + picInfo.getAltitude(useAMSLAlt)); swloctel.Flush(); swloctxt.Flush(); lastRecordN = GenPhotoStationRecord(swloctrim, picInfo.Path, picInfo.Lat, picInfo.Lon, picInfo.getAltitude(useAMSLAlt), 0, 0, picInfo.Yaw, picInfo.Width, picInfo.Height, lastRecordN); log.InfoFormat(filename + " " + picInfo.Lon + " " + picInfo.Lat + " " + picInfo.getAltitude(useAMSLAlt) + " "); } Serializer serializer = new Serializer(); serializer.Serialize(kml); swlockml.Write(serializer.Xml); Utilities.httpserver.georefkml = serializer.Xml; Utilities.httpserver.georefimagepath = dirWithImages + Path.DirectorySeparatorChar; writeGPX(dirWithImages + Path.DirectorySeparatorChar + "location.gpx", listPhotosWithInfo); // flightmission GenFlightMission(swloctrim, lastRecordN); swloctrim.WriteEndElement(); // fieldbook swloctrim.WriteEndElement(); // job swloctrim.WriteEndDocument(); TXT_outputlog.AppendText("Done \n\n"); } }
public void dowork(string logFile, string dirWithImages, float offsetseconds, bool dooffset) { DateTime localmin = DateTime.MaxValue; DateTime localmax = DateTime.MinValue; DateTime startTime = DateTime.MinValue; photocoords = new Hashtable(); timecoordcache = new Hashtable(); imagetotime = new Hashtable(); //logFile = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM\2011-10-01 11-48 1.log"; TXT_outputlog.AppendText("Read Log\n"); List <string[]> list = readLog(logFile); TXT_outputlog.AppendText("Log Read\n"); //dirWithImages = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM"; TXT_outputlog.AppendText("Read images\n"); string[] files = Directory.GetFiles(dirWithImages); TXT_outputlog.AppendText("images read\n"); Document kml = new Document(); StreamWriter sw4 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "loglocation.csv"); StreamWriter sw3 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.kml"); StreamWriter sw2 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.txt"); StreamWriter sw = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.tel"); sw.WriteLine("version=1"); sw.WriteLine("#seconds offset - " + TXT_offsetseconds.Text); sw.WriteLine("#longitude and latitude - in degrees"); sw.WriteLine("#name utc longitude latitude height"); int first = 0; int matchs = 0; int lastmatchindex = 0; TXT_outputlog.AppendText("start Processing\n"); foreach (string filename in files) { if (filename.ToLower().EndsWith(".jpg") && !filename.ToLower().Contains("_geotag")) { DateTime photodt = getPhotoTime(filename); if (startTime == DateTime.MinValue) { startTime = new DateTime(photodt.Year, photodt.Month, photodt.Day, 0, 0, 0, 0, DateTimeKind.Utc).ToLocalTime(); foreach (string[] arr in list) { DateTime crap = startTime.AddMilliseconds(int.Parse(arr[1])).AddSeconds(offsetseconds); if (localmin > crap) { localmin = crap; } if (localmax < crap) { localmax = crap; } } log.InfoFormat("min " + localmin + " max " + localmax); TXT_outputlog.AppendText("Log min " + localmin + " max " + localmax + "\r\n"); } TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " time " + photodt + "\r\n"); //Application.DoEvents(); int a = 0; foreach (string[] arr in list) { a++; if (lastmatchindex > (a)) { continue; } if (a % 1000 == 0) { Application.DoEvents(); } DateTime logdt = startTime.AddMilliseconds(int.Parse(arr[1])).AddSeconds(offsetseconds); if (first == 0) { TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + " vs Log " + logdt + "\r\n"); TXT_outputlog.AppendText("offset should be about " + (photodt - logdt).TotalSeconds + "\r\n"); if (dooffset) { return; } first++; } // time has past, logs are in time order if (photodt < logdt.AddSeconds(-1)) { lastmatchindex = a; break; } //Console.Write("ph " + dt + " log " + crap + " \r"); timecoordcache[(long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]) }; sw4.WriteLine("ph " + filename + " " + photodt + " log " + logdt); if (photodt.ToString("yyyy-MM-ddTHH:mm:ss") == logdt.ToString("yyyy-MM-ddTHH:mm:ss")) { lastmatchindex = a; TXT_outputlog.AppendText("MATCH Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + "\r\n"); matchs++; SharpKml.Dom.Timestamp tstamp = new SharpKml.Dom.Timestamp(); tstamp.When = photodt; kml.AddFeature( new Placemark() { Time = tstamp, Name = Path.GetFileNameWithoutExtension(filename), Geometry = new SharpKml.Dom.Point() { Coordinate = new Vector(double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos])) }, Description = new Description() { Text = "<table><tr><td><img src=\"" + Path.GetFileName(filename).ToLower() + "\" width=500 /></td></tr></table>" }, StyleSelector = new Style() { Balloon = new BalloonStyle() { Text = "$[name]<br>$[description]" } } } ); photocoords[filename] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]), double.Parse(arr[cogpos]) }; imagetotime[filename] = (long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds; sw2.WriteLine(Path.GetFileNameWithoutExtension(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos]); sw.WriteLine(Path.GetFileNameWithoutExtension(filename) + "\t" + logdt.ToString("yyyy:MM:dd HH:mm:ss") + "\t" + arr[lngpos] + "\t" + arr[latpos] + "\t" + arr[altpos]); sw.Flush(); sw2.Flush(); log.InfoFormat(Path.GetFileNameWithoutExtension(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " "); break; } //Console.WriteLine(crap); } } } Serializer serializer = new Serializer(); serializer.Serialize(kml); sw3.Write(serializer.Xml); sw3.Close(); MainV2.instance.georefkml = serializer.Xml; writeGPX(dirWithImages + Path.DirectorySeparatorChar + "location.gpx"); sw4.Close(); sw2.Close(); sw.Close(); TXT_outputlog.AppendText("Done " + matchs + " matchs"); }
private void writeKML(string filename) { SharpKml.Dom.AltitudeMode altmode = SharpKml.Dom.AltitudeMode.Absolute; if (MainV2.cs.firmware == MainV2.Firmwares.ArduPlane) { altmode = SharpKml.Dom.AltitudeMode.Absolute; } else if (MainV2.cs.firmware == MainV2.Firmwares.ArduCopter2) { altmode = SharpKml.Dom.AltitudeMode.RelativeToGround; } 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() { 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); Style stylet = new Style(); stylet.Id = "track"; SharpKml.Dom.IconStyle ico = new SharpKml.Dom.IconStyle(); LabelStyle lst = new LabelStyle(); lst.Scale = 0; stylet.Icon = ico; ico.Icon = new IconStyle.IconLink(new Uri("http://earth.google.com/images/kml-icons/track-directional/track-none.png")); stylet.Icon.Scale = 0.5; stylet.Label = lst; kml.AddStyle(stylet); // create sub folders Folder planes = new Folder(); planes.Name = "Planes"; kml.AddFeature(planes); Folder points = new Folder(); points.Name = "Points"; kml.AddFeature(points); // 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 = altmode; 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 = altmode; 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 = "Point " + 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; if (loc.Altitude < 0) { loc.Altitude = 0.01; } 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 = altmode; model.Scale = sca; try { Description desc = new Description(); desc.Text = @"<![CDATA[ <table> <tr><td>Roll: " + model.Orientation.Roll.Value.ToString("0.00") + @" </td></tr> <tr><td>Pitch: " + model.Orientation.Tilt.Value.ToString("0.00") + @" </td></tr> <tr><td>Yaw: " + model.Orientation.Heading.Value.ToString("0.00") + @" </td></tr> <tr><td>Time: " + cs.datetime.ToString("HH:mm:sszzzzzz") + @" </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); /// Placemark pmt = new Placemark(); SharpKml.Dom.Point pnt = new SharpKml.Dom.Point(); pnt.AltitudeMode = altmode; pnt.Coordinate = new Vector(cs.lat, cs.lng, cs.alt); pmt.Name = "" + a; pmt.Description = pmplane.Description; pmt.Time = tstamp; pmt.Geometry = pnt; pmt.StyleUrl = new Uri("#track", UriKind.Relative); points.AddFeature(pmt); 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(); flightdata.Clear(); }
public void dowork(string logFile, string dirWithImages, float offsetseconds, bool dooffset) { DateTime localmin = DateTime.MaxValue; DateTime localmax = DateTime.MinValue; DateTime startTime = DateTime.MinValue; photocoords = new Hashtable(); timecoordcache = new Hashtable(); imagetotime = new Hashtable(); //logFile = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM\2011-10-01 11-48 1.log"; TXT_outputlog.AppendText("Read Log\n"); List<string[]> list = readLog(logFile); TXT_outputlog.AppendText("Log Read\n"); //dirWithImages = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM"; TXT_outputlog.AppendText("Read images\n"); string[] files = Directory.GetFiles(dirWithImages); TXT_outputlog.AppendText("images read\n"); Document kml = new Document(); using (StreamWriter swlogloccsv = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "loglocation.csv")) using (StreamWriter swlockml = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.kml")) using (StreamWriter swloctxt = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.txt")) using (StreamWriter swloctel = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.tel")) { swloctel.WriteLine("version=1"); swloctel.WriteLine("#seconds offset - " + TXT_offsetseconds.Text); swloctel.WriteLine("#longitude and latitude - in degrees"); swloctel.WriteLine("#name utc longitude latitude height"); swloctxt.WriteLine("#name longitude/X latitude/Y height/Z yaw pitch roll"); swloctxt.WriteLine("#seconds_offset: " + TXT_offsetseconds.Text); int first = 0; int matchs = 0; int lastmatchindex = 0; TXT_outputlog.AppendText("start Processing\n"); foreach (string filename in files) { if (filename.ToLower().EndsWith(".jpg") && !filename.ToLower().Contains("_geotag")) { DateTime photodt = getPhotoTime(filename); // get log min and max time if (startTime == DateTime.MinValue) { startTime = new DateTime(photodt.Year, photodt.Month, photodt.Day, 0, 0, 0, 0, DateTimeKind.Utc).ToLocalTime(); foreach (string[] arr in list) { DateTime crap = startTime.AddMilliseconds(int.Parse(arr[timepos])).AddSeconds(offsetseconds); if (localmin > crap) localmin = crap; if (localmax < crap) localmax = crap; } log.InfoFormat("min " + localmin + " max " + localmax); TXT_outputlog.AppendText("Log min " + localmin + " max " + localmax + "\r\n"); } TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " time " + photodt + "\r\n"); //Application.DoEvents(); int a = 0; foreach (string[] arr in list) { a++; if (lastmatchindex > (a)) continue; if (a % 1000 == 0) Application.DoEvents(); DateTime logdt = startTime.AddMilliseconds(int.Parse(arr[timepos])).AddSeconds(offsetseconds); if (first == 0) { TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + " vs Log " + logdt + "\r\n"); TXT_outputlog.AppendText("offset should be about " + (photodt - logdt).TotalSeconds + "\r\n"); if (dooffset) { swlockml.Close(); swloctel.Close(); swloctxt.Close(); swlogloccsv.Close(); return; } first++; } // time has past, logs are in time order if (photodt < logdt.AddSeconds(-1)) { lastmatchindex = a; break; } //Console.Write("ph " + dt + " log " + crap + " \r"); timecoordcache[(long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]) }; swlogloccsv.WriteLine("ph " + filename + " " + photodt + " log " + logdt); if (photodt.ToString("yyyy-MM-ddTHH:mm:ss") == logdt.ToString("yyyy-MM-ddTHH:mm:ss")) { lastmatchindex = a; TXT_outputlog.AppendText("MATCH Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + "\r\n"); matchs++; // int fixme; // if (matchs > 50) // break; ; SharpKml.Dom.Timestamp tstamp = new SharpKml.Dom.Timestamp(); tstamp.When = photodt; kml.AddFeature( new Placemark() { Time = tstamp, Name = Path.GetFileNameWithoutExtension(filename), Geometry = new SharpKml.Dom.Point() { Coordinate = new Vector(double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos])) }, Description = new Description() { Text = "<table><tr><td><img src=\"" + Path.GetFileName(filename).ToLower() + "\" width=500 /></td></tr></table>" }, StyleSelector = new Style() { Balloon = new BalloonStyle() { Text = "$[name]<br>$[description]" } } } ); double lat = double.Parse(arr[latpos]); double lng = double.Parse(arr[lngpos]); double alpha = 0; if (arr.Length > yawATT) { alpha = ((double.Parse(arr[yawATT]) / 100.0) + 180) + (double)num_camerarotation.Value; } else { alpha = double.Parse(arr[cogpos]) + (double)num_camerarotation.Value; } RectangleF rect = getboundingbox(lat, lng, alpha, (double)num_hfov.Value, (double)num_vfov.Value); Console.WriteLine(rect); //http://en.wikipedia.org/wiki/World_file /* using (StreamWriter swjpw = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(filename) + ".jgw")) { swjpw.WriteLine((rect.Height / 2448.0).ToString("0.00000000000000000")); swjpw.WriteLine((0).ToString("0.00000000000000000")); // swjpw.WriteLine((0).ToString("0.00000000000000000")); // swjpw.WriteLine((rect.Width / -3264.0).ToString("0.00000000000000000")); // distance per pixel swjpw.WriteLine((rect.Left).ToString("0.00000000000000000")); swjpw.WriteLine((rect.Top).ToString("0.00000000000000000")); swjpw.Close(); }*/ kml.AddFeature( new GroundOverlay() { Name = Path.GetFileNameWithoutExtension(filename), Visibility = false, Time = tstamp, AltitudeMode = AltitudeMode.ClampToGround, Bounds = new LatLonBox() { Rotation = -alpha % 360, North = rect.Bottom, East = rect.Right, West = rect.Left, South = rect.Top, }, Icon = new SharpKml.Dom.Icon() { Href = new Uri(Path.GetFileName(filename).ToLower(), UriKind.Relative), }, } ); photocoords[filename] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]), double.Parse(arr[cogpos]) }; imagetotime[filename] = (long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds; if (arr.Length > yawATT) { swloctxt.WriteLine(Path.GetFileName(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " " + ((double.Parse(arr[yawATT]) / 100.0) + 180) % 360 + " " + ((double.Parse(arr[pitchATT]) / 100.0)) + " " + (-double.Parse(arr[rollATT]) / 100.0)); } else { swloctxt.WriteLine(Path.GetFileName(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos]); } swloctel.WriteLine(Path.GetFileName(filename) + "\t" + logdt.ToString("yyyy:MM:dd HH:mm:ss") + "\t" + arr[lngpos] + "\t" + arr[latpos] + "\t" + arr[altpos]); swloctel.Flush(); swloctxt.Flush(); log.InfoFormat(Path.GetFileName(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " "); break; } //Console.WriteLine(crap); } } } Serializer serializer = new Serializer(); serializer.Serialize(kml); swlockml.Write(serializer.Xml); swlockml.Close(); Utilities.httpserver.georefkml = serializer.Xml; Utilities.httpserver.georefimagepath = dirWithImages + Path.DirectorySeparatorChar; writeGPX(dirWithImages + Path.DirectorySeparatorChar + "location.gpx"); swlogloccsv.Close(); swloctxt.Close(); swloctel.Close(); TXT_outputlog.AppendText("Done " + matchs + " matchs"); } }
public void dowork(string logFile, string dirWithImages, float offsetseconds, bool dooffset) { timepos = (int)NUM_time.Value; latpos = (int)NUM_latpos.Value; lngpos = (int)NUM_lngpos.Value; altpos = (int)NUM_altpos.Value; cogpos = (int)NUM_headingpos.Value; DateTime localmin = DateTime.MaxValue; DateTime localmax = DateTime.MinValue; DateTime startTime = DateTime.MinValue; recordno = 10; photostnrecord = new List<int>(); photocoords = new Hashtable(); timecoordcache = new Hashtable(); imagetotime = new Hashtable(); //logFile = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM\2011-10-01 11-48 1.log"; TXT_outputlog.AppendText("Read Log\n"); List<string[]> list = readLog(logFile); TXT_outputlog.AppendText("Log Read\n"); //dirWithImages = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM"; TXT_outputlog.AppendText("Read images\n"); string[] files = Directory.GetFiles(dirWithImages); TXT_outputlog.AppendText("images read\n"); Document kml = new Document(); using (StreamWriter swlogloccsv = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "loglocation.csv")) using (StreamWriter swlockml = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.kml")) using (StreamWriter swloctxt = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.txt")) using (StreamWriter swloctel = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.tel")) using (XmlTextWriter swloctrim = new XmlTextWriter(dirWithImages + Path.DirectorySeparatorChar + "location.jxl",Encoding.ASCII)) { swloctrim.Formatting = Formatting.Indented; swloctrim.WriteStartDocument(false); swloctrim.WriteStartElement("JOBFile"); swloctrim.WriteAttributeString("jobName", "MPGeoRef"); swloctrim.WriteAttributeString("product", "Gatewing"); swloctrim.WriteAttributeString("productVersion", "1.0"); swloctrim.WriteAttributeString("version", "5.6"); // enviro swloctrim.WriteStartElement("Environment"); swloctrim.WriteStartElement("CoordinateSystem"); swloctrim.WriteElementString("SystemName", "Default"); swloctrim.WriteElementString("ZoneName", "Default"); swloctrim.WriteElementString("DatumName", "WGS 1984"); swloctrim.WriteStartElement("Ellipsoid"); swloctrim.WriteElementString("EarthRadius", "6378137"); swloctrim.WriteElementString("Flattening", "0.00335281067183"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("Projection"); swloctrim.WriteElementString("Type", "NoProjection"); swloctrim.WriteElementString("Scale", "1"); swloctrim.WriteElementString("GridOrientation", "IncreasingNorthEast"); swloctrim.WriteElementString("SouthAzimuth", "false"); swloctrim.WriteElementString("ApplySeaLevelCorrection", "true"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("LocalSite"); swloctrim.WriteElementString("Type", "Grid"); swloctrim.WriteElementString("ProjectLocationLatitude", ""); swloctrim.WriteElementString("ProjectLocationLongitude", ""); swloctrim.WriteElementString("ProjectLocationHeight", ""); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("Datum"); swloctrim.WriteElementString("Type", "ThreeParameter"); swloctrim.WriteElementString("GridName", "WGS 1984"); swloctrim.WriteElementString("Direction", "WGS84ToLocal"); swloctrim.WriteElementString("EarthRadius", "6378137"); swloctrim.WriteElementString("Flattening", "0.00335281067183"); swloctrim.WriteElementString("TranslationX", "0"); swloctrim.WriteElementString("TranslationY", "0"); swloctrim.WriteElementString("TranslationZ", "0"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("HorizontalAdjustment"); swloctrim.WriteElementString("Type", "NoAdjustment"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("VerticalAdjustment"); swloctrim.WriteElementString("Type", "NoAdjustment"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("CombinedScaleFactor"); swloctrim.WriteStartElement("Location"); swloctrim.WriteElementString("Latitude", ""); swloctrim.WriteElementString("Longitude", ""); swloctrim.WriteElementString("Height", ""); swloctrim.WriteEndElement(); swloctrim.WriteElementString("Scale", ""); swloctrim.WriteEndElement(); swloctrim.WriteEndElement(); swloctrim.WriteEndElement(); // fieldbook swloctrim.WriteStartElement("FieldBook"); swloctrim.WriteRaw(@" <CameraDesignRecord ID='00000001'> <Type>GoPro </Type> <HeightPixels>2400</HeightPixels> <WidthPixels>3200</WidthPixels> <PixelSize>0.0000022</PixelSize> <LensModel>Rectilinear</LensModel> <NominalFocalLength>0.002</NominalFocalLength> </CameraDesignRecord> <CameraRecord2 ID='00000002'> <CameraDesignID>00000001</CameraDesignID> <CameraPosition>01</CameraPosition> <Optics> <IdealAngularMagnification>1.0</IdealAngularMagnification> <AngleSymmetricDistortion> <Order3>-0.35</Order3> <Order5>0.15</Order5> <Order7>-0.033</Order7> <Order9> 0</Order9> </AngleSymmetricDistortion> <AngleDecenteringDistortion> <Column>0</Column> <Row>0</Row> </AngleDecenteringDistortion> </Optics> <Geometry> <PerspectiveCenterPixels> <PrincipalPointColumn>-1615.5</PrincipalPointColumn> <PrincipalPointRow>-1187.5</PrincipalPointRow> <PrincipalDistance>-2102</PrincipalDistance> </PerspectiveCenterPixels> <VectorOffset> <X>0</X> <Y>0</Y> <Z>0</Z> </VectorOffset> <BiVectorAngle> <XX>0</XX> <YY>0</YY> <ZZ>-1.5707963268</ZZ> </BiVectorAngle> </Geometry> </CameraRecord2>"); // 2mm fl // res 2400 * 3200 = 7,680,000 // sensor size = 1/2.5" - 5.70 × 4.28 mm // 2.2 μm // fl in pixels = fl in mm * res / sensor size swloctrim.WriteStartElement("PhotoInstrumentRecord"); swloctrim.WriteAttributeString("ID", "0000000E"); swloctrim.WriteElementString("Type", "Aerial"); swloctrim.WriteElementString("Model", "X100"); swloctrim.WriteElementString("Serial", "000-000"); swloctrim.WriteElementString("FirmwareVersion", "v0.0"); swloctrim.WriteElementString("UserDefinedName", "Prototype"); swloctrim.WriteEndElement(); swloctrim.WriteStartElement("AtmosphereRecord"); swloctrim.WriteAttributeString("ID", "0000000F"); swloctrim.WriteElementString("Pressure", ""); swloctrim.WriteElementString("Temperature", ""); swloctrim.WriteElementString("PPM", ""); swloctrim.WriteElementString("ApplyEarthCurvatureCorrection", "false"); swloctrim.WriteElementString("ApplyRefractionCorrection", "false"); swloctrim.WriteElementString("RefractionCoefficient", "0"); swloctrim.WriteElementString("PressureInputMethod", "ReadFromInstrument"); swloctrim.WriteEndElement(); swloctel.WriteLine("version=1"); swloctel.WriteLine("#seconds offset - " + TXT_offsetseconds.Text); swloctel.WriteLine("#longitude and latitude - in degrees"); swloctel.WriteLine("#name utc longitude latitude height"); swloctxt.WriteLine("#name longitude/X latitude/Y height/Z yaw pitch roll"); swloctxt.WriteLine("#seconds_offset: " + TXT_offsetseconds.Text); int first = 0; int matchs = 0; int lastmatchindex = 0; TXT_outputlog.AppendText("start Processing\n"); foreach (string filename in files) { if (filename.ToLower().EndsWith(".jpg") && !filename.ToLower().Contains("_geotag")) { DateTime photodt = getPhotoTime(filename); // get log min and max time if (startTime == DateTime.MinValue) { startTime = new DateTime(photodt.Year, photodt.Month, photodt.Day, 0, 0, 0, 0, DateTimeKind.Utc).ToLocalTime(); foreach (string[] arr in list) { DateTime crap = startTime.AddMilliseconds(int.Parse(arr[timepos])).AddSeconds(offsetseconds); if (localmin > crap) localmin = crap; if (localmax < crap) localmax = crap; } log.InfoFormat("min " + localmin + " max " + localmax); TXT_outputlog.AppendText("Log min " + localmin + " max " + localmax + "\r\n"); } TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " time " + photodt + "\r\n"); //Application.DoEvents(); int a = 0; foreach (string[] arr in list) { a++; if (lastmatchindex > (a)) continue; if (a % 1000 == 0) Application.DoEvents(); DateTime logdt = startTime.AddMilliseconds(int.Parse(arr[timepos])).AddSeconds(offsetseconds); if (first == 0) { TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + " vs Log " + logdt + "\r\n"); TXT_outputlog.AppendText("offset should be about " + (photodt - logdt).TotalSeconds + "\r\n"); if (dooffset) { return; } first++; } // time has past, logs are in time order if (photodt < logdt.AddSeconds(-1)) { lastmatchindex = a; break; } //Console.Write("ph " + dt + " log " + crap + " \r"); timecoordcache[(long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]) }; swlogloccsv.WriteLine("ph " + filename + " " + photodt + " log " + logdt); if (photodt.ToString("yyyy-MM-ddTHH:mm:ss") == logdt.ToString("yyyy-MM-ddTHH:mm:ss")) { lastmatchindex = a; TXT_outputlog.AppendText("MATCH Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + "\r\n"); matchs++; // int fixme; // if (matchs < 150 || matchs > 170) // break; ; SharpKml.Dom.Timestamp tstamp = new SharpKml.Dom.Timestamp(); tstamp.When = photodt; kml.AddFeature( new Placemark() { Time = tstamp, Name = Path.GetFileNameWithoutExtension(filename), Geometry = new SharpKml.Dom.Point() { Coordinate = new Vector(double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos])) }, Description = new Description() { Text = "<table><tr><td><img src=\"" + Path.GetFileName(filename).ToLower() + "\" width=500 /></td></tr></table>" }, StyleSelector = new Style() { Balloon = new BalloonStyle() { Text = "$[name]<br>$[description]" } } } ); double lat = double.Parse(arr[latpos]); double lng = double.Parse(arr[lngpos]); double alpha = 0; if (arr.Length > yawATT) { alpha = ((double.Parse(arr[yawATT]) / 100.0) + 180) + (double)num_camerarotation.Value; } else { alpha = double.Parse(arr[cogpos]) + (double)num_camerarotation.Value; } RectangleF rect = getboundingbox(lat, lng, alpha, (double)num_hfov.Value, (double)num_vfov.Value); Console.WriteLine(rect); //http://en.wikipedia.org/wiki/World_file /* using (StreamWriter swjpw = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(filename) + ".jgw")) { swjpw.WriteLine((rect.Height / 2448.0).ToString("0.00000000000000000")); swjpw.WriteLine((0).ToString("0.00000000000000000")); // swjpw.WriteLine((0).ToString("0.00000000000000000")); // swjpw.WriteLine((rect.Width / -3264.0).ToString("0.00000000000000000")); // distance per pixel swjpw.WriteLine((rect.Left).ToString("0.00000000000000000")); swjpw.WriteLine((rect.Top).ToString("0.00000000000000000")); swjpw.Close(); }*/ kml.AddFeature( new GroundOverlay() { Name = Path.GetFileNameWithoutExtension(filename), Visibility = false, Time = tstamp, AltitudeMode = AltitudeMode.ClampToGround, Bounds = new LatLonBox() { Rotation = -alpha % 360, North = rect.Bottom, East = rect.Right, West = rect.Left, South = rect.Top, }, Icon = new SharpKml.Dom.Icon() { Href = new Uri(Path.GetFileName(filename).ToLower(), UriKind.Relative), }, } ); photocoords[filename] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]), double.Parse(arr[cogpos]) }; imagetotime[filename] = (long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds; if (arr.Length > yawATT) { swloctxt.WriteLine(Path.GetFileName(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " " + ((double.Parse(arr[yawATT]) / 100.0) + 180) % 360 + " " + ((double.Parse(arr[pitchATT]) / 100.0)) + " " + (-double.Parse(arr[rollATT]) / 100.0)); } else { swloctxt.WriteLine(Path.GetFileName(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos]); } swloctel.WriteLine(Path.GetFileName(filename) + "\t" + logdt.ToString("yyyy:MM:dd HH:mm:ss") + "\t" + arr[lngpos] + "\t" + arr[latpos] + "\t" + arr[altpos]); swloctel.Flush(); swloctxt.Flush(); GenPhotoStationRecord(swloctrim, filename, double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]), 0, 0, double.Parse(arr[cogpos]), 3200, 2400); log.InfoFormat(Path.GetFileName(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " "); break; } //Console.WriteLine(crap); } } } Serializer serializer = new Serializer(); serializer.Serialize(kml); swlockml.Write(serializer.Xml); Utilities.httpserver.georefkml = serializer.Xml; Utilities.httpserver.georefimagepath = dirWithImages + Path.DirectorySeparatorChar; writeGPX(dirWithImages + Path.DirectorySeparatorChar + "location.gpx"); // flightmission GenFlightMission(swloctrim); swloctrim.WriteEndElement(); // fieldbook swloctrim.WriteEndElement(); // job swloctrim.WriteEndDocument(); TXT_outputlog.AppendText("Done " + matchs + " matchs"); } }
// function that writes out KML file based on the flight chosen by the user private void CreateKMLButton_Click(object sender, EventArgs e) { int nCount; int nFlightID; string sfilename; long lprevTimestamp; bLoggingEnabled = false; if (FlightPickerLV.SelectedItems.Count < 1) { MessageBox.Show("Please choose a flight before exporting.", "Export KML File"); return; } if (KMLFilePathTBRO.Text.Length == 0) { MessageBox.Show("Please choose a folder location before exporting.", "Export KML File"); return; } nFlightID = (int)FlightPickerLV.SelectedItems[0].Tag; // This is the root element of the file var kml = new Kml(); Folder mainFolder = new Folder(); mainFolder.Name = String.Format("{0} {1}", FlightPickerLV.SelectedItems[0].SubItems[1].Text, FlightPickerLV.SelectedItems[0].SubItems[0].Text); mainFolder.Description = new Description { Text = "Overall Data for the flight" }; kml.Feature = mainFolder; // start of Flight Path Line var placemarkLine = new Placemark(); mainFolder.AddFeature(placemarkLine); placemarkLine.Name = "Flight Path Line"; placemarkLine.Description = new Description { Text = "Line of the flight" }; var linestring = new LineString(); var coordinatecollection = new CoordinateCollection(); linestring.Coordinates = coordinatecollection; linestring.AltitudeMode = AltitudeMode.Absolute; SharpKml.Dom.LineStyle lineStyle = new SharpKml.Dom.LineStyle(); lineStyle.Color = Color32.Parse("ff0000ff"); lineStyle.Width = 5; Style flightStyle = new Style(); flightStyle.Id = "FlightStyle"; flightStyle.Line = lineStyle; linestring.Extrude = false; mainFolder.AddStyle(flightStyle); SharpKml.Dom.Style waypointStyle = new SharpKml.Dom.Style(); waypointStyle.Id = "WaypointStyle"; waypointStyle.Icon = new SharpKml.Dom.IconStyle(); waypointStyle.Icon.Icon = new SharpKml.Dom.IconStyle.IconLink(new System.Uri("https://maps.google.com/mapfiles/kml/paddle/grn-square.png")); mainFolder.AddStyle(waypointStyle); SharpKml.Dom.Style pushpinblueStyle = new SharpKml.Dom.Style(); pushpinblueStyle.Id = "PushPinBlueStyle"; pushpinblueStyle.Icon = new SharpKml.Dom.IconStyle(); pushpinblueStyle.Icon.Icon = new SharpKml.Dom.IconStyle.IconLink(new System.Uri("https://maps.google.com/mapfiles/kml/pushpin/blue-pushpin.png")); mainFolder.AddStyle(pushpinblueStyle); SharpKml.Dom.Style pushpingreenStyle = new SharpKml.Dom.Style(); pushpingreenStyle.Id = "PushPinGreenStyle"; pushpingreenStyle.Icon = new SharpKml.Dom.IconStyle(); pushpingreenStyle.Icon.Icon = new SharpKml.Dom.IconStyle.IconLink(new System.Uri("https://maps.google.com/mapfiles/kml/pushpin/grn-pushpin.png")); mainFolder.AddStyle(pushpingreenStyle); placemarkLine.StyleUrl = new Uri("#FlightStyle", UriKind.Relative); List <FlightPathData> FlightPath = new List <FlightPathData>(); FlightPath = FlightPathDB.GetFlightPathData(nFlightID); foreach (FlightPathData fpd in FlightPath) { coordinatecollection.Add(new Vector(fpd.latitude, fpd.longitude, fpd.altitude * 0.3048)); } placemarkLine.Geometry = linestring; // start of Flight Plan Waypoints List <FlightWaypointData> FlightWaypoints = new List <FlightWaypointData>(); FlightWaypoints = FlightPathDB.GetFlightWaypoints(nFlightID); if (FlightWaypoints.Count > 0) { Folder FlightPlanFolder = new Folder(); FlightPlanFolder.Name = "Flight Plan"; FlightPlanFolder.Description = new Description { Text = "Waypoints along the flight plan" }; mainFolder.AddFeature(FlightPlanFolder); foreach (FlightWaypointData waypointData in FlightWaypoints) { var placemarkPoint = new Placemark(); placemarkPoint.Name = waypointData.gps_wp_name; placemarkPoint.StyleUrl = new System.Uri("#WaypointStyle", UriKind.Relative); placemarkPoint.Geometry = new SharpKml.Dom.Point { Coordinate = new Vector(waypointData.gps_wp_latitude, waypointData.gps_wp_longitude, (double)waypointData.gps_wp_altitude * 0.3048), AltitudeMode = AltitudeMode.Absolute }; placemarkPoint.Description = new Description { Text = String.Concat(String.Format("Coordinates ({0:0.0000}, {1:0.0000}, {2} feet)", waypointData.gps_wp_longitude, waypointData.gps_wp_latitude, waypointData.gps_wp_altitude)) }; FlightPlanFolder.AddFeature(placemarkPoint); } } // start of Flight Data Points Folder DataPointsfolder = new Folder(); DataPointsfolder.Name = "Flight Path Data Points"; DataPointsfolder.Visibility = false; DataPointsfolder.Description = new Description { Text = "Data Points along the flight path" }; mainFolder.AddFeature(DataPointsfolder); nCount = 0; foreach (FlightPathData fpd in FlightPath) { var placemarkPoint = new Placemark(); string descriptioncard; bool bAnyLightsOn = false; nCount++; // if Google Earth App then you need to turn off visibility on each data point also if (GoogleEarthAppRB.Checked == true) { placemarkPoint.Visibility = false; } placemarkPoint.Name = String.Concat("Flight Data Point ", nCount.ToString()); placemarkPoint.Id = nCount.ToString(); descriptioncard = String.Concat("<br>Timestamp = ", new DateTime(fpd.timestamp).ToString()); descriptioncard += String.Concat(String.Format("<br><br>Coordinates ({0:0.0000}, {1:0.0000}, {2} feet)", fpd.latitude, fpd.longitude, fpd.altitude)); descriptioncard += String.Format("<br>Temperature: {0:0.00}C / {1:0.00}F", fpd.ambient_temperature, fpd.ambient_temperature * 9 / 5 + 32); descriptioncard += String.Format("<br>Wind: {0:0.00} knts from {1:0.00} degrees", fpd.ambient_wind_velocity, fpd.ambient_wind_direction); descriptioncard += String.Format("<br>Altitude Above Ground: {0} feet", fpd.altitudeaboveground); if (fpd.sim_on_ground == 1) { descriptioncard += String.Format("<br>Plane Is On The Ground"); } descriptioncard += String.Format("<br><br>Heading Indicator: {0:0.00} degrees", fpd.heading_indicator); descriptioncard += String.Format("<br>True Heading: {0:0.00} degrees", fpd.plane_heading_true); descriptioncard += String.Format("<br>Magnetic Heading {0:0.00} degrees", fpd.plane_heading_magnetic); descriptioncard += string.Format("<br><br>Airspeed Indicated: {0:0.00 knts}", fpd.plane_airspeed_indicated); descriptioncard += string.Format("<br>Airspeed True: {0:0.00} knts", fpd.airspeed_true); descriptioncard += string.Format("<br>Ground Velocity: {0:0.00} knts", fpd.ground_velocity); descriptioncard += string.Format("<br>Engine 1: {0} RPM", fpd.Eng1Rpm); if (fpd.Eng2Rpm > 0) { descriptioncard += string.Format("<br>Engine 2: {0} RPM", fpd.Eng2Rpm); } if (fpd.Eng3Rpm > 0) { descriptioncard += string.Format("<br>Engine 3: {0} RPM", fpd.Eng3Rpm); } if (fpd.Eng4Rpm > 0) { descriptioncard += string.Format("<br>Engine 4: {0} RPM", fpd.Eng4Rpm); } descriptioncard += string.Format("<br><br>Pitch: {0:0.00} degrees {1}", Math.Abs(fpd.plane_pitch), fpd.plane_pitch < 0 ? "Up" : "Down"); descriptioncard += string.Format("<br>Bank: {0:0.00} degrees {1}", Math.Abs(fpd.plane_bank), fpd.plane_bank < 0 ? "Right" : "Left"); descriptioncard += string.Format("<br>Vertical Speed: {0:0} feet per minute", fpd.vertical_speed); descriptioncard += string.Concat("<br>Flaps Position: ", fpd.flaps_handle_position); descriptioncard += string.Concat("<br><br>Lights On: "); // go thru mask and set lights that are on if ((fpd.LightsMask & (int)FlightPathData.LightStates.Nav) == (int)FlightPathData.LightStates.Nav) { descriptioncard += string.Concat("Nav, "); bAnyLightsOn = true; } if ((fpd.LightsMask & (int)FlightPathData.LightStates.Beacon) == (int)FlightPathData.LightStates.Beacon) { descriptioncard += string.Concat("Beacon, "); bAnyLightsOn = true; } if ((fpd.LightsMask & (int)FlightPathData.LightStates.Landing) == (int)FlightPathData.LightStates.Landing) { descriptioncard += string.Concat("Landing, "); bAnyLightsOn = true; } if ((fpd.LightsMask & (int)FlightPathData.LightStates.Taxi) == (int)FlightPathData.LightStates.Taxi) { descriptioncard += string.Concat("Taxi, "); bAnyLightsOn = true; } if ((fpd.LightsMask & (int)FlightPathData.LightStates.Strobe) == (int)FlightPathData.LightStates.Strobe) { descriptioncard += string.Concat("Strobe, "); bAnyLightsOn = true; } if ((fpd.LightsMask & (int)FlightPathData.LightStates.Panel) == (int)FlightPathData.LightStates.Panel) { descriptioncard += string.Concat("Panel, "); bAnyLightsOn = true; } // commented out the following lights because most planes don't use them and it messes up the GA aircraft /* if ((fpd.LightsMask & (int)FlightPathData.LightStates.Recognition) == (int)FlightPathData.LightStates.Recognition) * { * descriptioncard += string.Concat("Recognition, "); * bAnyLightsOn = true; * } * if ((fpd.LightsMask & (int)FlightPathData.LightStates.Wing) == (int)FlightPathData.LightStates.Wing) * { * descriptioncard += string.Concat("Wing, "); * bAnyLightsOn = true; * } * if ((fpd.LightsMask & (int)FlightPathData.LightStates.Logo) == (int)FlightPathData.LightStates.Logo) * { * descriptioncard += string.Concat("Logo, "); * bAnyLightsOn = true; * }*/ if ((fpd.LightsMask & (int)FlightPathData.LightStates.Cabin) == (int)FlightPathData.LightStates.Cabin) { descriptioncard += string.Concat("Cabin, "); bAnyLightsOn = true; } // if there are no masks then put none else remove last two characters which are the comma and the space from above if (bAnyLightsOn == false) { descriptioncard += string.Concat("None"); } else { descriptioncard = descriptioncard.Remove(descriptioncard.Length - 2, 2); } if (fpd.is_gear_retractable == 1) { descriptioncard += String.Concat("<br>Gear Position: ", fpd.gear_handle_position == 1 ? "Down" : "Up"); } if (fpd.spoiler_available == 1) { descriptioncard += String.Concat("<br>Spoiler Position: ", fpd.spoilers_handle_position == 1 ? "On" : "Off"); } if (fpd.stall_warning == 1) { descriptioncard += "<br>Stall Warning"; } if (fpd.overspeed_warning == 1) { descriptioncard += "<br>Overspeed Warning"; } placemarkPoint.Description = new Description { Text = descriptioncard }; // turned off showing time with data points as it caused issues of not showing in Google Earth // if user turned them off and then back on /* placemarkPoint.Time = new SharpKml.Dom.Timestamp * { * When = new DateTime(fpd.timestamp) * };*/ if (fpd.sim_on_ground == 1) { placemarkPoint.StyleUrl = new System.Uri("#PushPinGreenStyle", UriKind.Relative); } else { placemarkPoint.StyleUrl = new System.Uri("#PushPinBlueStyle", UriKind.Relative); } placemarkPoint.Geometry = new SharpKml.Dom.Point { Coordinate = new Vector(fpd.latitude, fpd.longitude, (double)fpd.altitude * 0.3048), AltitudeMode = AltitudeMode.Absolute }; DataPointsfolder.AddFeature(placemarkPoint); } // add 1st person feature SharpKml.Dom.GX.Tour tour = new SharpKml.Dom.GX.Tour(); tour.Name = "First Person View of Flight"; kml.AddNamespacePrefix("gx", "http://www.google.com/kml/ext/2.2"); SharpKml.Dom.GX.Playlist playlist = new SharpKml.Dom.GX.Playlist(); tour.Playlist = playlist; mainFolder.AddFeature(tour); lprevTimestamp = 0; nCount = 0; foreach (FlightPathData fpd in FlightPath) { nCount++; SharpKml.Dom.GX.FlyTo flyto = new SharpKml.Dom.GX.FlyTo(); // assume duration will be based on difference between timestamps // if first time thru loop and don't have old time or user wants to speed up video playback above threshold // then set duration to 1 if it is greater than 1 else leave as-is flyto.Duration = (new DateTime(fpd.timestamp) - new DateTime(lprevTimestamp)).TotalMilliseconds / 1000; if ((lprevTimestamp == 0) || (SpeedUpVideoPlaybackCB.Checked == true)) { if (flyto.Duration > 1) { flyto.Duration = 1; } } lprevTimestamp = fpd.timestamp; flyto.Mode = SharpKml.Dom.GX.FlyToMode.Smooth; SharpKml.Dom.Camera cam = new SharpKml.Dom.Camera(); cam.AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute; cam.Latitude = fpd.latitude; cam.Longitude = fpd.longitude; cam.Altitude = fpd.altitude * 0.3048; cam.Heading = fpd.plane_heading_true; if (GoogleEarthAppRB.Checked == true) { cam.Roll = fpd.plane_bank; } else { cam.Roll = fpd.plane_bank * -1; } cam.Tilt = (90 - fpd.plane_pitch); SharpKml.Dom.Timestamp tstamp = new SharpKml.Dom.Timestamp(); tstamp.When = new DateTime(fpd.timestamp); cam.GXTimePrimitive = tstamp; flyto.View = cam; playlist.AddTourPrimitive(flyto); // change it so balloons show during first person view (for potential future use) /* * var placemarkPoint = new Placemark(); * placemarkPoint.TargetId = nCount.ToString(); * placemarkPoint.GXBalloonVisibility = true; * SharpKml.Dom.Update update = new SharpKml.Dom.Update(); * update.AddUpdate(new ChangeCollection() { placemarkPoint }); * SharpKml.Dom.GX.AnimatedUpdate animatedUpdate = new SharpKml.Dom.GX.AnimatedUpdate(); * animatedUpdate.Update = update; * playlist.AddTourPrimitive(animatedUpdate);*/ } // write out KML file char[] invalidFileNameChars = Path.GetInvalidFileNameChars(); sfilename = String.Format("{0}_{1}.kml", FlightPickerLV.SelectedItems[0].SubItems[1].Text, FlightPickerLV.SelectedItems[0].SubItems[0].Text); var validfilename = new string(sfilename.Select(ch => invalidFileNameChars.Contains(ch) ? '_' : ch).ToArray()); sfilename = string.Concat(KMLFilePathTBRO.Text, "\\"); sfilename += validfilename; System.IO.File.Delete(sfilename); KmlFile kmlfile = KmlFile.Create(kml, true); using (var stream = System.IO.File.OpenWrite(sfilename)) { kmlfile.Save(stream); } MessageBox.Show(String.Format("Flight successfully exported to {0}", sfilename), "Export KML File"); }
public void dowork(string logFile, string dirWithImages, float offsetseconds, bool dooffset) { DateTime localmin = DateTime.MaxValue; DateTime localmax = DateTime.MinValue; DateTime startTime = DateTime.MinValue; photocoords = new Hashtable(); timecoordcache = new Hashtable(); imagetotime = new Hashtable(); //logFile = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM\2011-10-01 11-48 1.log"; TXT_outputlog.AppendText("Read Log\n"); List<string[]> list = readLog(logFile); TXT_outputlog.AppendText("Log Read\n"); //dirWithImages = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM"; TXT_outputlog.AppendText("Read images\n"); string[] files = Directory.GetFiles(dirWithImages); TXT_outputlog.AppendText("images read\n"); Document kml = new Document(); StreamWriter sw4 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "loglocation.csv"); StreamWriter sw3 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.kml"); StreamWriter sw2 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.txt"); StreamWriter sw = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.tel"); sw.WriteLine("version=1"); sw.WriteLine("#seconds offset - " + TXT_offsetseconds.Text); sw.WriteLine("#longitude and latitude - in degrees"); sw.WriteLine("#name utc longitude latitude height"); int first = 0; int matchs = 0; int lastmatchindex = 0; TXT_outputlog.AppendText("start Processing\n"); foreach (string filename in files) { if (filename.ToLower().EndsWith(".jpg") && !filename.ToLower().Contains("_geotag")) { DateTime photodt = getPhotoTime(filename); if (startTime == DateTime.MinValue) { startTime = new DateTime(photodt.Year, photodt.Month, photodt.Day, 0, 0, 0, 0, DateTimeKind.Utc).ToLocalTime(); foreach (string[] arr in list) { DateTime crap = startTime.AddMilliseconds(int.Parse(arr[1])).AddSeconds(offsetseconds); if (localmin > crap) localmin = crap; if (localmax < crap) localmax = crap; } log.InfoFormat("min " + localmin + " max " + localmax); TXT_outputlog.AppendText("Log min " + localmin + " max " + localmax + "\r\n"); } TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " time " + photodt + "\r\n"); //Application.DoEvents(); int a = 0; foreach (string[] arr in list) { a++; if (lastmatchindex > (a)) continue; if (a % 1000 == 0) Application.DoEvents(); DateTime logdt = startTime.AddMilliseconds(int.Parse(arr[1])).AddSeconds(offsetseconds); if (first == 0) { TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + " vs Log " + logdt + "\r\n"); TXT_outputlog.AppendText("offset should be about " + (photodt - logdt).TotalSeconds + "\r\n"); if (dooffset) return; first++; } // time has past, logs are in time order if (photodt < logdt.AddSeconds(-1)) { lastmatchindex = a; break; } //Console.Write("ph " + dt + " log " + crap + " \r"); timecoordcache[(long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]) }; sw4.WriteLine("ph " + filename + " " + photodt + " log " + logdt); if (photodt.ToString("yyyy-MM-ddTHH:mm:ss") == logdt.ToString("yyyy-MM-ddTHH:mm:ss")) { lastmatchindex = a; TXT_outputlog.AppendText("MATCH Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + "\r\n"); matchs++; SharpKml.Dom.Timestamp tstamp = new SharpKml.Dom.Timestamp(); tstamp.When = photodt; kml.AddFeature( new Placemark() { Time = tstamp, Name = Path.GetFileNameWithoutExtension(filename), Geometry = new SharpKml.Dom.Point() { Coordinate = new Vector(double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos])) }, Description = new Description() { Text = "<table><tr><td><img src=\"" + Path.GetFileName(filename).ToLower() + "\" width=500 /></td></tr></table>" }, StyleSelector = new Style() { Balloon = new BalloonStyle() { Text = "$[name]<br>$[description]" } } } ); photocoords[filename] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]), double.Parse(arr[cogpos]) }; imagetotime[filename] = (long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds; sw2.WriteLine(Path.GetFileNameWithoutExtension(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos]); sw.WriteLine(Path.GetFileNameWithoutExtension(filename) + "\t" + logdt.ToString("yyyy:MM:dd HH:mm:ss") + "\t" + arr[lngpos] + "\t" + arr[latpos] + "\t" + arr[altpos]); sw.Flush(); sw2.Flush(); log.InfoFormat(Path.GetFileNameWithoutExtension(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " "); break; } //Console.WriteLine(crap); } } } Serializer serializer = new Serializer(); serializer.Serialize(kml); sw3.Write(serializer.Xml); sw3.Close(); MainV2.instance.georefkml = serializer.Xml; writeGPX(dirWithImages + Path.DirectorySeparatorChar + "location.gpx"); sw4.Close(); sw2.Close(); sw.Close(); TXT_outputlog.AppendText("Done " + matchs + " matchs"); }
public void dowork(string logFile, string dirWithImages, float offsetseconds, bool dooffset) { DateTime localmin = DateTime.MaxValue; DateTime localmax = DateTime.MinValue; DateTime startTime = DateTime.MinValue; photocoords = new Hashtable(); timecoordcache = new Hashtable(); imagetotime = new Hashtable(); //logFile = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM\2011-10-01 11-48 1.log"; TXT_outputlog.AppendText("Read Log\n"); List <string[]> list = readLog(logFile); TXT_outputlog.AppendText("Log Read\n"); //dirWithImages = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM"; TXT_outputlog.AppendText("Read images\n"); string[] files = Directory.GetFiles(dirWithImages); TXT_outputlog.AppendText("images read\n"); Document kml = new Document(); using (StreamWriter swlogloccsv = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "loglocation.csv")) using (StreamWriter swlockml = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.kml")) using (StreamWriter swloctxt = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.txt")) using (StreamWriter swloctel = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.tel")) { swloctel.WriteLine("version=1"); swloctel.WriteLine("#seconds offset - " + TXT_offsetseconds.Text); swloctel.WriteLine("#longitude and latitude - in degrees"); swloctel.WriteLine("#name utc longitude latitude height"); swloctxt.WriteLine("#name longitude/X latitude/Y height/Z yaw pitch roll"); swloctxt.WriteLine("#seconds_offset: " + TXT_offsetseconds.Text); int first = 0; int matchs = 0; int lastmatchindex = 0; TXT_outputlog.AppendText("start Processing\n"); foreach (string filename in files) { if (filename.ToLower().EndsWith(".jpg") && !filename.ToLower().Contains("_geotag")) { DateTime photodt = getPhotoTime(filename); // get log min and max time if (startTime == DateTime.MinValue) { startTime = new DateTime(photodt.Year, photodt.Month, photodt.Day, 0, 0, 0, 0, DateTimeKind.Utc).ToLocalTime(); foreach (string[] arr in list) { DateTime crap = startTime.AddMilliseconds(int.Parse(arr[timepos])).AddSeconds(offsetseconds); if (localmin > crap) { localmin = crap; } if (localmax < crap) { localmax = crap; } } log.InfoFormat("min " + localmin + " max " + localmax); TXT_outputlog.AppendText("Log min " + localmin + " max " + localmax + "\r\n"); } TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " time " + photodt + "\r\n"); //Application.DoEvents(); int a = 0; foreach (string[] arr in list) { a++; if (lastmatchindex > (a)) { continue; } if (a % 1000 == 0) { Application.DoEvents(); } DateTime logdt = startTime.AddMilliseconds(int.Parse(arr[timepos])).AddSeconds(offsetseconds); if (first == 0) { TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + " vs Log " + logdt + "\r\n"); TXT_outputlog.AppendText("offset should be about " + (photodt - logdt).TotalSeconds + "\r\n"); if (dooffset) { swlockml.Close(); swloctel.Close(); swloctxt.Close(); swlogloccsv.Close(); return; } first++; } // time has past, logs are in time order if (photodt < logdt.AddSeconds(-1)) { lastmatchindex = a; break; } //Console.Write("ph " + dt + " log " + crap + " \r"); timecoordcache[(long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]) }; swlogloccsv.WriteLine("ph " + filename + " " + photodt + " log " + logdt); if (photodt.ToString("yyyy-MM-ddTHH:mm:ss") == logdt.ToString("yyyy-MM-ddTHH:mm:ss")) { lastmatchindex = a; TXT_outputlog.AppendText("MATCH Photo " + Path.GetFileNameWithoutExtension(filename) + " " + photodt + "\r\n"); matchs++; // int fixme; // if (matchs > 50) // break; ; SharpKml.Dom.Timestamp tstamp = new SharpKml.Dom.Timestamp(); tstamp.When = photodt; kml.AddFeature( new Placemark() { Time = tstamp, Name = Path.GetFileNameWithoutExtension(filename), Geometry = new SharpKml.Dom.Point() { Coordinate = new Vector(double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos])) }, Description = new Description() { Text = "<table><tr><td><img src=\"" + Path.GetFileName(filename).ToLower() + "\" width=500 /></td></tr></table>" }, StyleSelector = new Style() { Balloon = new BalloonStyle() { Text = "$[name]<br>$[description]" } } } ); double lat = double.Parse(arr[latpos]); double lng = double.Parse(arr[lngpos]); double alpha = 0; if (arr.Length > yawATT) { alpha = ((double.Parse(arr[yawATT]) / 100.0) + 180) + (double)num_camerarotation.Value; } else { alpha = double.Parse(arr[cogpos]) + (double)num_camerarotation.Value; } RectangleF rect = getboundingbox(lat, lng, alpha, (double)num_hfov.Value, (double)num_vfov.Value); Console.WriteLine(rect); //http://en.wikipedia.org/wiki/World_file /* using (StreamWriter swjpw = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(filename) + ".jgw")) * { * swjpw.WriteLine((rect.Height / 2448.0).ToString("0.00000000000000000")); * swjpw.WriteLine((0).ToString("0.00000000000000000")); // * swjpw.WriteLine((0).ToString("0.00000000000000000")); // * swjpw.WriteLine((rect.Width / -3264.0).ToString("0.00000000000000000")); // distance per pixel * swjpw.WriteLine((rect.Left).ToString("0.00000000000000000")); * swjpw.WriteLine((rect.Top).ToString("0.00000000000000000")); * * swjpw.Close(); * }*/ kml.AddFeature( new GroundOverlay() { Name = Path.GetFileNameWithoutExtension(filename), Visibility = false, Time = tstamp, AltitudeMode = AltitudeMode.ClampToGround, Bounds = new LatLonBox() { Rotation = -alpha % 360, North = rect.Bottom, East = rect.Right, West = rect.Left, South = rect.Top, }, Icon = new SharpKml.Dom.Icon() { Href = new Uri(Path.GetFileName(filename).ToLower(), UriKind.Relative), }, } ); photocoords[filename] = new double[] { double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos]), double.Parse(arr[cogpos]) }; imagetotime[filename] = (long)(logdt.AddSeconds(-offsetseconds) - DateTime.MinValue).TotalSeconds; if (arr.Length > yawATT) { swloctxt.WriteLine(Path.GetFileName(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " " + ((double.Parse(arr[yawATT]) / 100.0) + 180) % 360 + " " + ((double.Parse(arr[pitchATT]) / 100.0)) + " " + (-double.Parse(arr[rollATT]) / 100.0)); } else { swloctxt.WriteLine(Path.GetFileName(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos]); } swloctel.WriteLine(Path.GetFileName(filename) + "\t" + logdt.ToString("yyyy:MM:dd HH:mm:ss") + "\t" + arr[lngpos] + "\t" + arr[latpos] + "\t" + arr[altpos]); swloctel.Flush(); swloctxt.Flush(); log.InfoFormat(Path.GetFileName(filename) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " "); break; } //Console.WriteLine(crap); } } } Serializer serializer = new Serializer(); serializer.Serialize(kml); swlockml.Write(serializer.Xml); swlockml.Close(); Utilities.httpserver.georefkml = serializer.Xml; Utilities.httpserver.georefimagepath = dirWithImages + Path.DirectorySeparatorChar; writeGPX(dirWithImages + Path.DirectorySeparatorChar + "location.gpx"); swlogloccsv.Close(); swloctxt.Close(); swloctel.Close(); TXT_outputlog.AppendText("Done " + matchs + " matchs"); } }
public void dowork(string logFile, string dirWithImages, float offsetseconds, bool dooffset) { DateTime localmin = DateTime.MaxValue; DateTime localmax = DateTime.MinValue; DateTime startTime = DateTime.MinValue; //logFile = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM\2011-10-01 11-48 1.log"; List<string[]> list = readLog(logFile); //dirWithImages = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM"; string[] files = Directory.GetFiles(dirWithImages); Document kml = new Document(); StreamWriter sw4 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "loglocation.csv"); StreamWriter sw3 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.kml"); StreamWriter sw2 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.txt"); StreamWriter sw = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.tel"); sw.WriteLine("version=1"); sw.WriteLine("#longitude and latitude - in degrees"); sw.WriteLine("#name utc longitude latitude height"); int first = 0; int matchs = 0; foreach (string file in files) { if (file.ToLower().EndsWith(".jpg")) { DateTime dt = getPhotoTime(file); if (startTime == DateTime.MinValue) { startTime = new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0, 0, DateTimeKind.Utc).ToLocalTime(); foreach (string[] arr in list) { DateTime crap = startTime.AddMilliseconds(int.Parse(arr[1])).AddSeconds(offsetseconds); if (localmin > crap) localmin = crap; if (localmax < crap) localmax = crap; } log.InfoFormat("min " + localmin + " max " + localmax); TXT_outputlog.AppendText("Log min " + localmin + " max " + localmax + "\r\n"); } TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(file) + " time " + dt + "\r\n"); foreach (string[] arr in list) { //Application.DoEvents(); DateTime crap = startTime.AddMilliseconds(int.Parse(arr[1])).AddSeconds(offsetseconds); if (first == 0) { TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(file) + " " + dt + " vs Log " + crap + "\r\n"); TXT_outputlog.AppendText("offset should be about " + (dt - crap).TotalSeconds + "\r\n"); if (dooffset) return; first++; } Console.Write("ph " + dt + " log " + crap + " \r"); sw4.WriteLine("ph " + file + " " + dt + " log " + crap); if (dt.ToString("yyyy-MM-ddTHH:mm:ss") == crap.ToString("yyyy-MM-ddTHH:mm:ss")) { TXT_outputlog.AppendText("MATCH Photo " + Path.GetFileNameWithoutExtension(file) + " " + dt + "\r\n"); matchs++; SharpKml.Dom.Timestamp tstamp = new SharpKml.Dom.Timestamp(); tstamp.When = dt; kml.AddFeature( new Placemark() { Time = tstamp , Name = Path.GetFileNameWithoutExtension(file), Geometry = new SharpKml.Dom.Point() { Coordinate = new Vector(double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos])) } } ); sw2.WriteLine(Path.GetFileNameWithoutExtension(file) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos]); sw.WriteLine(Path.GetFileNameWithoutExtension(file) + "\t" + crap.ToString("yyyy:MM:dd HH:mm:ss") + "\t" + arr[lngpos] + "\t" + arr[latpos] + "\t" + arr[altpos]); sw.Flush(); sw2.Flush(); log.InfoFormat(Path.GetFileNameWithoutExtension(file) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " "); break; } //Console.WriteLine(crap); } } } Serializer serializer = new Serializer(); serializer.Serialize(kml); sw3.Write(serializer.Xml); sw3.Close(); sw4.Close(); sw2.Close(); sw.Close(); CustomMessageBox.Show("Done " + matchs + " matchs"); }
public void dowork(string logFile, string dirWithImages, float offsetseconds, bool dooffset) { DateTime localmin = DateTime.MaxValue; DateTime localmax = DateTime.MinValue; DateTime startTime = DateTime.MinValue; //logFile = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM\2011-10-01 11-48 1.log"; List <string[]> list = readLog(logFile); //dirWithImages = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM"; string[] files = Directory.GetFiles(dirWithImages); Document kml = new Document(); StreamWriter sw4 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "loglocation.csv"); StreamWriter sw3 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.kml"); StreamWriter sw2 = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.txt"); StreamWriter sw = new StreamWriter(dirWithImages + Path.DirectorySeparatorChar + "location.tel"); sw.WriteLine("version=1"); sw.WriteLine("#longitude and latitude - in degrees"); sw.WriteLine("#name utc longitude latitude height"); int first = 0; int matchs = 0; foreach (string file in files) { if (file.ToLower().EndsWith(".jpg")) { DateTime dt = getPhotoTime(file); if (startTime == DateTime.MinValue) { startTime = new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0, 0, DateTimeKind.Utc).ToLocalTime(); foreach (string[] arr in list) { DateTime crap = startTime.AddMilliseconds(int.Parse(arr[1])).AddSeconds(offsetseconds); if (localmin > crap) { localmin = crap; } if (localmax < crap) { localmax = crap; } } log.InfoFormat("min " + localmin + " max " + localmax); TXT_outputlog.AppendText("Log min " + localmin + " max " + localmax + "\r\n"); } TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(file) + " time " + dt + "\r\n"); foreach (string[] arr in list) { //Application.DoEvents(); DateTime crap = startTime.AddMilliseconds(int.Parse(arr[1])).AddSeconds(offsetseconds); if (first == 0) { TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(file) + " " + dt + " vs Log " + crap + "\r\n"); TXT_outputlog.AppendText("offset should be about " + (dt - crap).TotalSeconds + "\r\n"); if (dooffset) { return; } first++; } Console.Write("ph " + dt + " log " + crap + " \r"); sw4.WriteLine("ph " + file + " " + dt + " log " + crap); if (dt.ToString("yyyy-MM-ddTHH:mm:ss") == crap.ToString("yyyy-MM-ddTHH:mm:ss")) { TXT_outputlog.AppendText("MATCH Photo " + Path.GetFileNameWithoutExtension(file) + " " + dt + "\r\n"); matchs++; SharpKml.Dom.Timestamp tstamp = new SharpKml.Dom.Timestamp(); tstamp.When = dt; kml.AddFeature( new Placemark() { Time = tstamp, Name = Path.GetFileNameWithoutExtension(file), Geometry = new SharpKml.Dom.Point() { Coordinate = new Vector(double.Parse(arr[latpos]), double.Parse(arr[lngpos]), double.Parse(arr[altpos])) } } ); sw2.WriteLine(Path.GetFileNameWithoutExtension(file) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos]); sw.WriteLine(Path.GetFileNameWithoutExtension(file) + "\t" + crap.ToString("yyyy:MM:dd HH:mm:ss") + "\t" + arr[lngpos] + "\t" + arr[latpos] + "\t" + arr[altpos]); sw.Flush(); sw2.Flush(); log.InfoFormat(Path.GetFileNameWithoutExtension(file) + " " + arr[lngpos] + " " + arr[latpos] + " " + arr[altpos] + " "); break; } //Console.WriteLine(crap); } } } Serializer serializer = new Serializer(); serializer.Serialize(kml); sw3.Write(serializer.Xml); sw3.Close(); sw4.Close(); sw2.Close(); sw.Close(); CustomMessageBox.Show("Done " + matchs + " matchs"); }