2013-10-15 6 views
10

Ho una lista di punti (in realtà le coordinate dei negozi) e ho bisogno di determinare se si trovano entro certi limiti.Come trovare se un punto GeoCoordinate rientra nei limiti

In C# Io so come creare un punto dal lat & lng

var point = new GeoCoordinate(latitude, longitude); 

ma come posso controllare se quel punto è contenuto nel rettangolo definito da questi altri due punti:

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

C'è qualche metodo di classe che posso usare?

+0

Non puoi semplicemente controllare che il punto di lat/long sia> = il punto di sw lat/long e <= il punto del lat/long? –

+0

Abbiamo bisogno di maggiori dettagli. Stai usando http://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.geolocation.geocoordinate o http://msdn.microsoft.com/en-us/library/system.device .location.geocoordinate.aspx? – philologon

+0

Sì, sto usando System.Device.Location.GeoCoordinate, ma se non è la soluzione giusta posso usare qualcos'altro. –

risposta

10

Se si utilizza http://msdn.microsoft.com/en-us/library/system.device.location.geocoordinate.aspx

Dovrete scrivere il proprio metodo per rendere questo controllo. Si consiglia di renderlo un metodo di estensione (Lotto di risorse disponibili su Metodi di estensione in linea.)

, allora è quasi semplice come

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 
} 

C'è un caso angolo di prendere in considerazione. Il metodo sopra avrà esito negativo se la casella definita da sw, ne attraversa la longitudine di 180 gradi. Quindi sarà necessario scrivere un codice aggiuntivo per coprire il caso, rallentando così le prestazioni del metodo.

+0

La vostra soluzione non sta prendendo in considerazione quando si attraversa l'equatore, penso, se i confini si estendessero attraverso l'equatore non funzionerebbe. –

+0

In realtà l'attraversamento dell'equatore non è un problema per la soluzione data poiché le latitudini a sud dell'equatore sono semplicemente numeri negativi. Solo l'attraversamento della linea a 180-longitudine richiede più codice. – philologon

+0

@Max Favilli Ma io/ero/sbagliato nel dire che c'è un solo caso d'angolo. Se la tua casella di inclusione lat/long copre uno dei poli, allora è necessario un altro controllo. Ma, curiosamente, quel caso non può essere rappresentato con il solo passaggio in due angoli, quindi non è un grosso problema se non si sa che è necessario spiegarlo. Se è necessario disporre di una casella che può contenere pali, è necessario riunire i due punti in una classe e aggiungere uno span booleanoPolo; membro. – philologon