Как узнать, находится ли точка GeoCoordinate в пределах границ

У меня есть список точек (на самом деле координаты магазинов), и мне нужно определить, лежат ли они в определенных границах.

В С# я знаю, как создать точку из широты и долготы

var point = new GeoCoordinate(latitude, longitude);

Но как я могу проверить, содержится ли эта точка в прямоугольнике, определяемом этими двумя другими точками:

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

Есть ли какой-либо метод класса, который я могу использовать?


person Max Favilli    schedule 15.10.2013    source источник
comment
Разве вы не можете просто проверить, что широта/долгота вашей точки ›= широта/долгота точки юго-запада и ‹= широта/долгота точки ne?   -  person Preston Guillot    schedule 15.10.2013
comment
Нам нужно больше деталей. Используете ли вы msdn.microsoft.com/en -us/library/windows/apps/ или msdn.microsoft.com/en-us/library/?   -  person philologon    schedule 15.10.2013
comment
Да, я использую System.Device.Location.GeoCoordinate, но если это не правильное решение, я могу использовать что-то другое.   -  person Max Favilli    schedule 15.10.2013


Ответы (1)


Если вы используете 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-градусную долготу. Таким образом, для покрытия этого случая необходимо будет написать дополнительный код, что замедлит производительность метода.

person philologon    schedule 15.10.2013
comment
Ваше решение не учитывается при пересечении экватора, я думаю, если бы границы, проходящие через экватор, не сработали бы. - person Max Favilli; 15.10.2013
comment
На самом деле пересечение экватора не является проблемой для данного решения, поскольку широты к югу от экватора — это просто отрицательные числа. Только пересечение 180-градусной линии требует дополнительного кода. - person philologon; 15.10.2013
comment
@Max Favilli Но я /был/ неправ, говоря, что есть только один угловой случай. Если ваш блок включения широты/долготы закрывает один из полюсов, то это требует еще одной проверки. Но, что интересно, этот случай не может быть представлен простым прохождением двух углов, так что это не является большой проблемой, если только вы не знаете, что вам нужно это учитывать. Если вам нужно иметь поле, которое может содержать полюса, вам нужно будет собрать две точки в класс и добавить логическое значение spansPole; член. - person philologon; 15.10.2013
comment
Спасибо! Я создаю локатор магазинов, поэтому мне не нужно заботиться о столбах. - person Max Favilli; 15.10.2013
comment
Это одно из преимуществ 180-градусной линии в большом океане. Там очень мало магазинов. - person philologon; 15.10.2013
comment
Нет ни одной дороги, пересекающей исходную границу (180 градусов). - person AlexWien; 16.10.2013