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");
}
}