问题 如何查找GeoCoordinate点是否在边界内


我有一个点列表(实际上是商店坐标),我需要确定它们是否位于某些边界内。

在C#中,我知道如何从lat&lng创建一个点

var point = new GeoCoordinate(latitude, longitude);

但是如何检查该点是否包含在由其他两点定义的矩形中:

    var swPoint = new GeoCoordinate(bounds.swlat, bounds.swlng);
    var nePoint = new GeoCoordinate(bounds.nelat, bounds.nelng);

我可以使用任何课程方法吗?


9028
2017-10-15 00:59


起源

难道你不能只检查你的点的纬度/经度是> = sw点的纬度/经度和<= ne点的纬度/经度? - Preston Guillot
我们需要更多细节。你正在用吗 msdn.microsoft.com/en-us/library/windows/apps/... 要么 msdn.microsoft.com/en-us/library/... ? - philologon
是的我正在使用System.Device.Location.GeoCoordinate,但如果这不是正确的解决方案,我可以使用其他东西。 - Max Favilli


答案:


如果你正在使用 http://msdn.microsoft.com/en-us/library/system.device.location.geocoordinate.aspx

您必须编写自己的方法来进行此检查。您可能希望将其作为扩展方法(在线扩展方法可用的资源数量。)

然后它几乎一样简单

public static Boolean isWithin(this GeoCoordinate pt, GeoCoordinate sw, GeoCoordinate ne)
{
   return pt.Latitude >= sw.Latitude &&
          pt.Latitude <= ne.Latitude &&
          pt.Longitude >= sw.Longitude &&
          pt.Longitude <= ne.Longitude
}

有一个角落需要考虑。如果由sw,ne定义的框穿过180度经度,则上述方法将失败。因此,必须编写额外的代码来覆盖该情况,从而降低该方法的性能。


10
2017-10-15 01:27



你认为,如果越过赤道的边界不起作用,你的解决方案就不会考虑越过赤道。 - Max Favilli
实际上越过赤道对于给定的解决方案来说不是问题,因为赤道以南的纬度只是负数。只穿越180经度线需要更多代码。 - philologon
@Max Favilli但我说/只有一个角落案例是错误的。如果你的纬度/长度包含盒覆盖其中一个极点,则需要另外检查。但是,有趣的是,这种情况不能仅仅通过两个角来表示,所以除非你知道你需要考虑它,否则它不是一个大问题。如果你需要一个可以包含极点的盒子,你需要将两个点聚集到一个类中并添加一个布尔spansPole;会员。 - philologon
谢谢!我正在建立一个商店定位器所以我不需要关心杆。 - Max Favilli
这是在大海洋中拥有180度线的一个优势。那里的商店很少。 - philologon