Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将度/分/秒转换为十进制坐标_C# - Fatal编程技术网

C# 将度/分/秒转换为十进制坐标

C# 将度/分/秒转换为十进制坐标,c#,C#,在我的代码的一部分中,我将十进制坐标转换为度/分/秒,并使用: 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; 如何将度/分/秒转换回十进制坐标?试试以下方法: public double ConvertDegreeAngleToDouble( do

在我的代码的一部分中,我将十进制坐标转换为度/分/秒,并使用:

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;
如何将度/分/秒转换回十进制坐标?

试试以下方法:

public double ConvertDegreeAngleToDouble( double degrees, double minutes, double seconds )
{
    //Decimal degrees = 
    //   whole number of degrees, 
    //   plus minutes divided by 60, 
    //   plus seconds divided by 3600

    return degrees + (minutes/60) + (seconds/3600);
}

由于度值等于坐标总数的1,分钟值等于坐标总数的1/60,秒值等于坐标总数的1/3600,因此您应该能够将它们重新组合在一起:

new_coord = deg + min/60 + sec/3600

不过,请注意,由于浮点舍入,它将与原始答案不完全相同。

为了节省其他人的时间,我想补充拜伦的答案。如果该点为字符串形式(例如“17.21.18S”),则可以使用以下方法:

public double ConvertDegreeAngleToDouble(string point)
{
    //Example: 17.21.18S

    var multiplier = (point.Contains("S") || point.Contains("W")) ? -1 : 1; //handle south and west

    point = Regex.Replace(point, "[^0-9.]", ""); //remove the characters

    var pointArray = point.Split('.'); //split the string.

    //Decimal degrees = 
    //   whole number of degrees, 
    //   plus minutes divided by 60, 
    //   plus seconds divided by 3600

    var degrees = Double.Parse(pointArray[0]);
    var minutes = Double.Parse(pointArray[1]) / 60;
    var seconds = Double.Parse(pointArray[2]) / 3600;

    return (degrees + minutes + seconds) * multiplier;
}

通常,西半球和南半球表示为负度数,秒包含精度小数:-86:44:52.892记住经度是X坐标,纬度是Y坐标。这经常会被混淆,因为人们经常将它们称为lat/lon和X/Y。我修改了下面的代码以获得上述格式

private double ConvertDegreesToDecimal(string coordinate)
{
    double decimalCoordinate;
    string[] coordinateArray = coordinate.Split(':');
    if (3 == coordinateArray.Length)
    {
        double degrees = Double.Parse(coordinateArray[0]);
        double minutes = Double.Parse(coordinateArray[1]) / 60;
        double seconds = Double.Parse(coordinateArray[2]) / 3600;

        if (degrees > 0)
        {
            decimalCoordinate = (degrees + minutes + seconds);
        }
        else
        {
            decimalCoordinate = (degrees - minutes - seconds);
        }
    }
    return decimalCoordinate;
}

到目前为止,公认的答案是不准确的,并且没有考虑将负数添加到正数时会发生什么。下面的代码解决了该问题,并将正确转换

    public double ConvertDegreeAngleToDouble(double degrees, double minutes, double seconds)
    {
        var multiplier = (degrees < 0 ? -1 : 1);
        var _deg = (double)Math.Abs(degrees);
        var result = _deg + (minutes / 60) + (seconds / 3600);
        return result * multiplier;
    }
public double ConvertDegreeAngleToDouble(双度、双分、双秒)
{
var乘数=(度数<0?-1:1);
var_deg=(双)数学绝对值(度);
var结果=_度+(分/60)+(秒/3600);
返回结果*乘数;
}
作为Nuget软件包提供,可以为您处理坐标转换。它甚至可以进行UTM/MGRS转换,并提供相对于输入位置的太阳/月球时间。它真的很容易使用

Coordinate c = new Coordinate(40.465, -75.089);

//Display DMS Format
c.FormatOptions.Format = CoordinateFormatType.Degree_Minutes_Seconds;
c.ToString();//N 40º 27' 54" W 75º 5' 20.4"
c.Latitude.ToString();//N 40º 27' 54"
c.Latitude.ToDouble();//40.465

坐标属性也是可观察的。因此,例如,如果更改纬度分钟值,其他所有内容都将更新。

对于那些喜欢正则表达式并处理DDMMSS.dddS等格式的人 此函数可以很容易地更新以处理其他格式

#

[码码>Regex Regex reg=新的Regex(<码>码>Regex Regex)Regex(<码>Regex)Regex Regex regregregreg=新的Regex(((<码>码>Regex)Regex((<码>>Regex)Regex)Regex(新的Regex(((((?))及(((((????????????????????????????))及[[[[[[[[[SN))))))))及(((((((((((((((((((()))))))))))及及[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[2?\d{2}(?\d{2}(\.\d+)?([WE]))$”; 专用双DMS2Decimal(字符串dms) { 双结果=double.NaN; var匹配=注册匹配(dms); 如果(匹配成功) { 变量度=double.Parse(“0”+匹配.Groups[“D”]); var minutes=double.Parse(“0”+match.Groups[“M”]); var seconds=double.Parse(“0”+match.Groups[“S”]); var direction=match.Groups[“W”].ToString(); var dec=(数学绝对绝对值+分/60d+秒/3600d)*(方向=“S”|方向=“W”?-1:1); var absDec=数学绝对值(dec);
如果(((方向==“W”|方向==“E”)&°rees快速提问,将
sec/3600
分配给
deg
与将
coord
分配给它不一样吗?谢谢!这里的大多数人都很好,但MVP之所以成为这样是有原因的,他们整天都在论坛上,他们本应该工作,而且对标题太认真了……你对sec/3600 b的看法是正确的和coord一样,我实际上从这个网站上得到了这个公式,并没有仔细检查。现在我正试图扭转它,但我没有足够清晰地思考它。@Justin:StackOverflow如此好的原因之一是社区努力让你在所有其他编程形式中看到的BS离开这里。所以,请不要在标题中添加标签,不要使用问候语和标语,也不要对他人无礼。如果您对我们为什么要这样做有任何疑问,请转到@Will-堆栈溢出有时有点糟糕的原因之一是因为商场警察执行了太多愚蠢的规则,如“不要使用问候语”.我们在这里都是人,不是机器人(当然机器人除外)。我认为让人们表达一点礼貌和感激之情是值得的。我不想坐着看人们的生活故事,而只是简单的“你好”很好,甚至是受欢迎的。堆栈溢出是一个很好的资源,我想保持这种方式,所以我们不要让钟摆摆摆得太远。这没有考虑半球。使用谷歌地图时,让我困惑的一件事是当我试图将MinDec转换为WGS84基准十进制时。现在很明显,它是以度为单位的我的公式最终类似于:返回度+(分钟/60)+(秒/6000);注意,这是AGPL许可证!它是。如果不满足AGPL要求,您可以购买价格合理的终身许可证,用于无限的使用和分发。
Regex reg = new Regex(@"^((?<D>\d{1,2}(\.\d+)?)(?<W>[SN])|(?<D>\d{2})(?<M>\d{2}(\.\d+)?)(?<W>[SN])|(?<D>\d{2})(?<M>\d{2})(?<S>\d{2}(\.\d+)?)(?<W>[SN])|(?<D>\d{1,3}(\.\d+)?)(?<W>[WE])|(?<D>\d{3})(?<M>\d{2}(\.\d+)?)(?<W>[WE])|(?<D>\d{3})(?<M>\d{2})(?<S>\d{2}(\.\d+)?)(?<W>[WE]))$");

private double DMS2Decimal(string dms)
            {
                double result = double.NaN;            

                var match = reg.Match(dms);

                if (match.Success)
                {
                    var degrees = double.Parse("0" + match.Groups["D"]);
                    var minutes = double.Parse("0" + match.Groups["M"]);
                    var seconds = double.Parse("0" + match.Groups["S"]);
                    var direction = match.Groups["W"].ToString();
                    var dec = (Math.Abs(degrees) + minutes / 60d + seconds / 3600d) * (direction == "S" || direction == "W" ? -1 : 1);
                    var absDec = Math.Abs(dec);

                    if ((((direction == "W" || direction == "E") && degrees <= 180 & absDec <= 180) || (degrees <= 90 && absDec <= 90)) && minutes < 60 && seconds < 60)
                    {
                        result = dec;
                    }

                }

                return result;

            }