【问题标题】:latitude and longitude bounding box for C#?C#的纬度和经度边界框?
【发布时间】:2011-03-17 04:48:58
【问题描述】:

我只想找到一个简单的 C# 类,它接受起始纬度和经度以及距离并找到边界框(最大纬度、最小纬度、最大经度、最小经度)。在 SO 上还有其他类似的问题,但没有一个能真正回答这个问题,而且 C# 中也没有。

帮助。

【问题讨论】:

  • 浏览了一些相关的帖子,似乎有足够多的信息和参考资料来拼凑您自己在 C# 中的实现。如果您要求某人为您编写代码以便您不必这样做,那么您可能在这里运气不佳。
  • 如果没有具体的帖子链接,我很乐意忽略您的评论。我已经完成了我的搜索,它不在 C# 中
  • 好吧,让我为您复制本页右侧的第一个相关链接。 stackoverflow.com/questions/1648917/… 翻阅它,您至少会找到对 Java 实现的参考,以及几篇关于该问题的数学方法的文章。您可能无法以您喜欢的确切语言找到所需的确切实现。这个想法是得到帮助来思考它,而不是让人们为你思考和编码,然后只使用第一个编译的类。

标签: c# geolocation geocoding latitude-longitude


【解决方案1】:

这就是您的要求。感谢 Federico A. Ramponi,他用 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));
}

【讨论】:

  • 这里的halfSideInKm是什么?
  • @DharmikBhandari:这是你想要的边界框的一半长度。
  • 我应该以公里为单位传递距离吗?
  • 是的,因为它是直接从 Python 代码移植而来的。随意以您想要的方式修改这些单位。这很简单。
  • halfSideInKm 是半径
【解决方案2】:

我知道我要重新提出一个两年前的问题,但如果有人从 Google 那里得到这里,我已经编写了一个 C# 类库,它完全可以做到这一点以及更多。我创建了一个Github repository 来托管代码,并将很快写一篇博客文章来介绍它。

Geolocation repository

【讨论】:

  • 可能想查看另一个包含整个 Google Maps API 而不仅仅是地理编码的项目:github.com/maximnovak/google-maps。可能值得分叉
  • 实际上这个 repo 根本没有利用 Google API。它只是使用数学公式来确定距离、方向、边界框等。但是,我编写了一个相关的地理编码 API(也在 Github 上),它可以处理地理编码位置。不过,我会查看您提到的回购协议,这很有趣。谢谢!
【解决方案3】:

如果您只有起始纬度、经度和海拔高度,则没有边界框,因为您只定义了空间中的一个点。任何矩形/边界框都需要至少两个点来定义它!

【讨论】:

  • 是的,但这就是距离的意义......在该点周围生成边界框,距离为该点的半径
  • 没有信息'以距离为半径',正如我指出的那样,这个问题毫无意义。使用地理点时的距离通常是指海拔高度(与地球的距离)。如果你只有点 lat 和 lng 而没有高度,那么你怎么可能计算出适合它的盒子!?
猜你喜欢
  • 2020-05-04
  • 2011-07-29
  • 2014-08-29
  • 1970-01-01
  • 2013-03-17
  • 2013-01-16
  • 1970-01-01
  • 2013-10-27
  • 2012-09-07
相关资源
最近更新 更多