latitude and longitude bounding box for C#?

后端 未结 3 795
后悔当初
后悔当初 2021-01-01 00:20

I just want to find a straightforward, C# class that takes in a starting latitude and longitude and a distance and finds the bounding box (max lat, min lat, max lon, min lon

相关标签:
3条回答
  • 2021-01-01 00:51

    I know I'm resurrecting a two year old question, but in the event that anyone gets here from Google, I've written a C# class library that does exactly this and a little more. I've created a Github repository to host the code and will be writing a blog post covering it shortly.

    Geolocation repository

    0 讨论(0)
  • 2021-01-01 00:54

    If you only have a starting latitude, longitude and altitude then there is no bounding box as you have only defined a single point in space. Any rectangle/bounding box would require at least two points to define it!

    0 讨论(0)
  • 2021-01-01 01:00

    Here's what you are asking for. Kudos to Federico A. Ramponi who wrote the original in Python here.

    public class MapPoint
    {
        public double Longitude { get; set; } // In Degrees
        public double Latitude { get; set; } // In Degrees
    }
    
    public class BoundingBox
    {
        public MapPoint MinPoint { get; set; }
        public MapPoint MaxPoint { get; set; }
    }        
    
    // Semi-axes of WGS-84 geoidal reference
    private const double WGS84_a = 6378137.0; // Major semiaxis [m]
    private const double WGS84_b = 6356752.3; // Minor semiaxis [m]
    
    // 'halfSideInKm' is the half length of the bounding box you want in kilometers.
    public static BoundingBox GetBoundingBox(MapPoint point, double halfSideInKm)
    {            
        // Bounding box surrounding the point at given coordinates,
        // assuming local approximation of Earth surface as a sphere
        // of radius given by WGS84
        var lat = Deg2rad(point.Latitude);
        var lon = Deg2rad(point.Longitude);
        var halfSide = 1000 * halfSideInKm;
    
        // Radius of Earth at given latitude
        var radius = WGS84EarthRadius(lat);
        // Radius of the parallel at given latitude
        var pradius = radius * Math.Cos(lat);
    
        var latMin = lat - halfSide / radius;
        var latMax = lat + halfSide / radius;
        var lonMin = lon - halfSide / pradius;
        var lonMax = lon + halfSide / pradius;
    
        return new BoundingBox { 
            MinPoint = new MapPoint { Latitude = Rad2deg(latMin), Longitude = Rad2deg(lonMin) },
            MaxPoint = new MapPoint { Latitude = Rad2deg(latMax), Longitude = Rad2deg(lonMax) }
        };            
    }
    
    // degrees to radians
    private static double Deg2rad(double degrees)
    {
        return Math.PI * degrees / 180.0;
    }
    
    // radians to degrees
    private static double Rad2deg(double radians)
    {
        return 180.0 * radians / Math.PI;
    }
    
    // Earth radius at a given latitude, according to the WGS-84 ellipsoid [m]
    private static double WGS84EarthRadius(double lat)
    {
        // http://en.wikipedia.org/wiki/Earth_radius
        var An = WGS84_a * WGS84_a * Math.Cos(lat);
        var Bn = WGS84_b * WGS84_b * Math.Sin(lat);
        var Ad = WGS84_a * Math.Cos(lat);
        var Bd = WGS84_b * Math.Sin(lat);
        return Math.Sqrt((An*An + Bn*Bn) / (Ad*Ad + Bd*Bd));
    }
    
    0 讨论(0)
提交回复
热议问题