public MeterCoordinate FindMeterCoordinateFromOrigin(MeterCoordinate originM, GeoCoordinate origin, GeoCoordinate point) { MeterCoordinate result = new MeterCoordinate(); decimal dlon = point.Longitude - origin.Longitude; decimal dlat = point.Latitude - origin.Latitude; decimal latitudeCircumference = 40075160 * Convert.ToDecimal(Math.Cos(Convert.ToDouble(ToRad(origin.Latitude)))); result.X = dlon * latitudeCircumference / 360; result.Y = dlat * 40008000 / 360; result.X += originM.X; result.Y += originM.Y; return(result); }
/// <summary> /// ryals special sauce. not sure if its working or not. /// </summary> /// <param name="end"></param> /// <param name="originMeter"></param> /// <param name="originGeo"></param> /// <returns></returns> private decimal FindLongitude(MeterCoordinate end, MeterCoordinate originMeter, GeoCoordinate originGeo) { //int earthRadius = 63781370; //meters //double complimentAngle = 90 - Math.Abs(originGeo.Latitude); //double radius = Math.Sin(complimentAngle) * earthRadius; //double circumference = Math.PI * 2 * radius; //double deltaY = end.Y - originMeter.Y; //return (deltaY / circumference) * 360 + originGeo.Longitude; end.X -= originMeter.X; decimal latC = 40075160 * (decimal)Math.Cos(Convert.ToDouble(ToRad(originGeo.Latitude))); decimal dLon = end.X * (360 / latC); decimal pLon = dLon + originGeo.Longitude; return(pLon); }
public void Export() { // init variables string firstLine; // stores the first line string secondLine; // stores second line StringBuilder lineBuilder = new StringBuilder(); int lineNum = 1; // keeps track of the line number string line; MeterCoordinate xy = new MeterCoordinate(); decimal z; GeoCoordinate latlon = new GeoCoordinate(); MeterCoordinate originMeter = new MeterCoordinate(Convert.ToDecimal(originPoint.transform.position.x), Convert.ToDecimal(originPoint.transform.position.z)); CoordinateConverter converter = new CoordinateConverter(); // infile/outfile System.IO.StreamReader inFile = new System.IO.StreamReader(@"SloanTest.waypoints"); System.IO.StreamWriter outFile = new System.IO.StreamWriter(@"SloanTestOutput.waypoints"); //Ignoring header if ((firstLine = inFile.ReadLine()) == null) { print("Blank File!!!"); } //Ignoring sealevel? if ((secondLine = inFile.ReadLine()) == null) { print("Blank File!!!"); } outFile.WriteLine(firstLine); outFile.WriteLine(secondLine); print("Exported:"); foreach (Waypoint point in points.points) { outFile.WriteLine(point.export()); print(point.export()); } inFile.Close(); outFile.Close(); }
/// <summary> /// the main function to find lat long from a geo coordinate /// </summary> /// <param name="originGeo"></param> /// <param name="originMeter"></param> /// <param name="end"></param> /// <returns></returns> public GeoCoordinate MeterCoordtoGeoCoord(GeoCoordinate originGeo, MeterCoordinate originMeter, MeterCoordinate end) { /* * δ = distance r / Earth radius(both in the same units) * * lat_P2 = asin(sin lat_O ⋅ cos δ + cos lat_O ⋅ sin δ ⋅ cos θ) * lon_P2 = lon_O + atan((sin θ ⋅ sin δ ⋅ cos lat_O) / (cos δ − sin lat_O ⋅ sin lat_P2)) */ GeoCoordinate result = new GeoCoordinate(); result.Latitude = FindLatitude(end, originMeter, originGeo); result.Longitude = FindLongitude(end, originMeter, originGeo); Console.WriteLine(result.Latitude.ToString()); Console.WriteLine(result.Longitude.ToString()); return(result); }
/// <summary> /// ryals special sauce. not sure if its working or not /// </summary> /// <param name="end"></param> /// <param name="originMeter"></param> /// <param name="originGeo"></param> /// <returns></returns> private decimal FindLatitude(MeterCoordinate end, MeterCoordinate originMeter, GeoCoordinate originGeo) { //int earthRadius = 63781370; //meters //double complimentAngle = 90 - Math.Abs(originGeo.Longitude); //double radius = Math.Sin(complimentAngle) * earthRadius; //double circumference = Math.PI * 2 * radius; //double deltaX = end.X - originMeter.X; //return (deltaX / circumference) * 360 + originGeo.Latitude; end.Y -= originMeter.Y; Console.WriteLine(Convert.ToString(end.Y)); decimal dlat = (360 * end.Y) / 40008000; Console.WriteLine(Convert.ToString(dlat)); decimal plat = dlat + originGeo.Latitude; return(plat); }