可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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). There are other, similar, questions here on SO but none of them really answer this and the ones that do are not in C#.
Help.
回答1:
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)); }
回答2:
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
回答3:
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!