计算SW& NE Lat / Longs of Square X英里距离Lat / Long中心

时间:2014-05-14 11:18:34

标签: c# geography geographic-distance

我正在努力从Noaa API中获取数据。

在与Noaa API交谈时,您可以获得一个广场内的气象站列表。他们称他们为"范围"它们是2套纬线/长线。左下角lat / long和右上角lat / long

详情如下:

http://www.ncdc.noaa.gov/cdo-web/webservices/v2#stations

我已经获得了美国一些城市的纬度/长度列表,我正在尝试找出最好的方法。

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

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

有没有人对最好的编码方法有什么想法?

由于

1 个答案:

答案 0 :(得分:1)

yippee的! - 找到了解决方案......

首先是一个简单的类:

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;
    }

然后,我知道我可以做得更好..但它现在有用......

2个能够解决底部和顶部范围的功能:

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;
    }

HTH!

崔佛