有谁知道简单的短代码来转换它而不使用额外的库?
像这样:
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 调用,以便它也适用于负角度。
你可以使用时间跨度:(很棘手,但它有效)
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;
我从你的问题推断你想从笛卡尔坐标转换为极坐标。
如果是这种情况,您需要的基本公式是:
r = √ (x2 + y2)
θ = atan( y / x )
其中 r 是距离,θ 是与 x = 0(关于原点)的角度
这有帮助吗?
我想出了以下内容。它正确处理负坐标(南纬或西经)并返回未均匀划分为分钟或秒的余数(以度为单位)。
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;
}
位置的字符串表示,即
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")}" );
欢迎提出任何改进建议...