Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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# 计算SW&;距离中心纬度/长X英里的东北纬度/长_C#_Geography_Geographic Distance - Fatal编程技术网

C# 计算SW&;距离中心纬度/长X英里的东北纬度/长

C# 计算SW&;距离中心纬度/长X英里的东北纬度/长,c#,geography,geographic-distance,C#,Geography,Geographic Distance,我正在从Noaa API获取数据 当与Noaa API交谈时,你可以得到一个广场内的气象站列表。它们称为“区段”,是两组横向/纵向。左下/长和右上/长 详情如下: 我已经收到了一份美国许多城市的lat/LONG列表,我正在努力找出放置盒子的最佳方式 所以,我的第一个猜测是取中心的纬度/长度,计算出向西75英里的纬度/长度,然后计算出该点以南75英里处的纬度/长度 理想情况下,我希望将其作为c#函数 请问有没有人对编写此代码的最佳方法有什么想法 谢谢你找到了解决方案 首先是一个简单的类: pub

我正在从Noaa API获取数据

当与Noaa API交谈时,你可以得到一个广场内的气象站列表。它们称为“区段”,是两组横向/纵向。左下/长和右上/长

详情如下:

我已经收到了一份美国许多城市的lat/LONG列表,我正在努力找出放置盒子的最佳方式

所以,我的第一个猜测是取中心的纬度/长度,计算出向西75英里的纬度/长度,然后计算出该点以南75英里处的纬度/长度

理想情况下,我希望将其作为c#函数

请问有没有人对编写此代码的最佳方法有什么想法


谢谢你找到了解决方案

首先是一个简单的类:

public class LatLonAlt
    {
        public double Latitude { get; set; }
        public double Longitude { get; set; }
        public double Altitude { get; set; }
    }
然后是一个计算新位置的函数:

public static HelpersModel.LatLonAlt CalculateDerivedPosition(HelpersModel.LatLonAlt source, double range, double bearing)
    {
        double latA = Convert.ToDouble(source.Latitude) * (Math.PI / 180);
        double lonA = Convert.ToDouble(source.Longitude) * (Math.PI / 180);
        double angularDistance = range / 6371;
        double trueCourse = bearing * (Math.PI / 180);

        double lat = Math.Asin(
            Math.Sin(latA) * Math.Cos(angularDistance) +
            Math.Cos(latA) * Math.Sin(angularDistance) * Math.Cos(trueCourse));

        double dlon = Math.Atan2(
            Math.Sin(trueCourse) * Math.Sin(angularDistance) * Math.Cos(latA),
            Math.Cos(angularDistance) - Math.Sin(latA) * Math.Sin(lat));

        double lon = ((lonA + dlon + Math.PI) % (Math.PI * 2)) - Math.PI;

        HelpersModel.LatLonAlt results = new HelpersModel.LatLonAlt();
        results.Latitude = lat * (180 / Math.PI);
        results.Longitude = lon * (180 / Math.PI);
        results.Altitude = source.Altitude;

        return results;
    }
然后,我知道我可以做得更好。。但它现在起作用了

计算左上右范围的两个函数:

public static HelpersModel.LatLonAlt FindBottomLeftExtent(HelpersModel.LatLonAlt startpoint)
    {
        // first move left
        HelpersModel.LatLonAlt movedleft = CalculateDerivedPosition(startpoint, 72.42, 270);
        // move down
        HelpersModel.LatLonAlt moveddown = CalculateDerivedPosition(movedleft, 72.42, 180);

        return moveddown;
    }
    public static HelpersModel.LatLonAlt FindTopRightExtent(HelpersModel.LatLonAlt startpoint)
    {
        // first move right
        HelpersModel.LatLonAlt movedright = CalculateDerivedPosition(startpoint, 72.42, 90);
        // move up
        HelpersModel.LatLonAlt movedup = CalculateDerivedPosition(movedright, 72.42, 0);

        return movedup;
    }


Trev

因为您多次重复某些计算,为了清晰起见,您可能会发现为它们定义常数很有用-例如,将
Math.PI/180
替换为
degreestoradis
@adrianwragim!