通过c#将十进制坐标转换为度、分和秒

问题描述 投票:0回答:5

有谁知道简单的短代码来转换它而不使用额外的库?

c# coordinates
5个回答
9
投票

像这样:

double coord = 59.345235;
int sec = (int)Math.Round(coord * 3600);
int deg = sec / 3600;
sec = Math.Abs(sec % 3600);
int min = sec / 60;
sec %= 60;

编辑:添加了 Abs 调用,以便它也适用于负角度。


4
投票

你可以使用时间跨度:(很棘手,但它有效)

   double coord = 123.312312;   
   var ts = TimeSpan.FromHours(Math.Abs(coord));
   int degrees = Math.Sign(coord) * Math.Floor(ts.TotalHours);
   int minutes = ts.Minutes;
   int seconds = ts.Seconds;

2
投票

我从你的问题推断你想从笛卡尔坐标转换为极坐标。

如果是这种情况,您需要的基本公式是:

r = √ (x2 + y2)

θ = atan( y / x )

其中 r 是距离,θ 是与 x = 0(关于原点)的角度

这有帮助吗?


2
投票

我想出了以下内容。它正确处理负坐标(南纬或西经)并返回未均匀划分为分钟或秒的余数(以度为单位)。

public static double ConvertDecimalToDegMinSec(double value, out int deg, out int min, out int sec)
{
    deg = (int)value;
    value = Math.Abs(value - deg);
    min = (int)(value * 60);
    value = value - (double)min / 60;
    sec = (int)(value * 3600);
    value = value - (double)sec / 3600;
    return value;
}

0
投票

位置的字符串表示,即

51°09'48.2"N 10°07'28.6"E

public static string ToDMS(this Location location)
{
    var (lat, lon) = (location.Latitude, location.Longitude);
    var latSec = Math.Abs(lat) % 1.0 * 3600.0;
    var lonSec = Math.Abs(lon) % 1.0 * 3600.0;
    return FormattableString.Invariant(
      $@"{Math.Abs((int)lat)}°{(int)latSec / 60}'{latSec % 60:F1}\"{(lat >= 0 ? "N" : "S")
       } {Math.Abs((int)lon)}°{(int)lonSec / 60}'{lonSec % 60:F1}\"{(lon >= 0 ? "E" : "W")}");
}

你可能不喜欢这句话:)

public static string ToDMS(double lat, double lon) => FormattableString.Invariant($"{Math.Abs((int)lat)}°{(int)(Math.Abs(lat) % 1.0 * 60.0)}'{Math.Abs(lat) * 3600.0 % 60:F1}\"{(lat >= 0 ? "N" : "S")} {Math.Abs((int)lon)}°{(int)(Math.Abs(lon) % 1.0 * 60.0)}'{Math.Abs(lon) * 3600.0 % 60:F1}\"{(lon >= 0 ? "E" : "W")}" );

欢迎提出任何改进建议...

© www.soinside.com 2019 - 2024. All rights reserved.