Dato un insieme di coordinate, come posso calcolare i limiti minimi?


13

Ho un set di coordinate in lon / lat. Esistono sempre almeno 3 coordinate ordinate che formano un poli (se proiettate piatte). Come posso calcolare i limiti minimi per queste coordinate come un insieme di intervalli di longitudine e latitudine validi? (per "valido" intendo gli intervalli che spiegano esplicitamente l'antimeridiano). È un po 'difficile spiegare cosa sto cercando, quindi ho una foto.

inserisci qui la descrizione dell'immagine

Il caso nella foto è banale; trovi solo il minimo e il massimo assoluto per tutti i punti. Questo non funziona per tutti i casi però. C'è una soluzione generica?

Modifica: per chiarire cosa intendo per 'valido', supponiamo di avere tre valori di longitudine nel mio set di dati: -76, -135 e 164. I valori attraversano l'antimeridiano e vorrei che gli intervalli risultanti fossero divisi: -76 a -180 E da 164 a 180.

Qualche chiarimento in più. I punti formano un poligono, quindi in alcuni casi l'intervallo richiesto potrebbe essere compreso tra -180 e +180 (ovvero i 360 gradi completi):

inserisci qui la descrizione dell'immagine

L'immagine a sinistra mostra la longitudine di quattro coordinate che si verificano su una 'metà' della Terra. Immaginalo come se stessi guardando verso il basso sul polo nord (punto nero). Il rosa mostra l'intervallo longitudinale minimo che racchiude il poligono (il poligono è mostrato tra i quattro punti in viola). Il caso a sinistra avrebbe due intervalli longitudinali: [da -180 a -120] e [da 135 a 180] (solo per stima visiva)

L'immagine a destra mostra un altro caso in cui i punti vanno fino in fondo alla Terra. Questo intervallo sarebbe [da -180 a 180].


1
Non ho mai considerato questo problema prima, è una grande domanda. Ancora un altro esempio di dove una terra piatta faciliterebbe il nostro lavoro! Non vedo l'ora di vedere alcune soluzioni a questo.
sgrieve

Penso che tu debba essere più esplicito su "(per 'valido' intendo intervalli che spiegano esplicitamente l'antimeridiano)" - Immagino che la parola minima debba andare oltre i limiti della domanda.
Ian Turton

puoi aggiungere di nuovo la tua immagine per spiegare il tuo problema.
Mapperz

1
iant: Mapperz 'valido' esplicitamente chiarito: aggiungere nuovamente? non si presenta? Posso vederlo bene.
Pris,

1
Bene, le coordinate sono in lon / lat e sono usate per interrogare un database per recuperare dati geografici. A rigor di termini puoi convertirlo in un puro problema di matematica (anche se si può dire di molte cose in GIS)
Pris,

Risposte:


5

Spero di capire correttamente la domanda ...

Possiamo risolvere il problema per longitudine e latitudine separatamente, quindi prenderò il tuo esempio con le lunghezze: -76, -135 e 164.

Per prima cosa li ordino:

-135, -76, 164

Quindi aggiungerei nuovamente le coordinate più a sinistra a destra: -135 + 360 = 225

-135, -76, 164, 225

Ora possiamo calcolare gli spazi tra le coordinate:

-135 (59) -76 (240) 164 (61) 225
             .......

Lo spazio maggiore (240) deve essere il limite del riquadro di delimitazione minimo, la parte che non appartiene al riquadro. La linea tratteggiata è la parte più grande del cerchio che possiamo risparmiare. Nel nostro esempio ciò significa che il riquadro di selezione inizia con 164, include -135 e termina con -76.


Questo funziona per la maggior parte dei casi, penso. Ma considera il mio esempio con la longitudine aggiuntiva (+60) [come il quarto punto nel poli]. In questo caso vorrei -180 a 180. Usando il tuo metodo, otterrei 61 a 180 e -76 a -180.
Pris,

@Pris - Quindi vuoi che la longitudine 180 / -180 (dopo tutto sia lo stesso punto), sia sempre parte del riquadro, anche se non è il riquadro più piccolo possibile?
martinstoeckli,

Penso che la differenza chiave qui sia che i punti formano un poligono. Vedi la mia modifica.
Pris,

@Pris - Oh beh, sembra davvero complicato. È come se ogni punto di un bordo tra due punti contasse anche come punto di vertice.
martinstoeckli,

1

Questo è davvero facile da fare in Javascript con l'API di Google Maps. Ecco come lo faresti sul lato client con quell'API:

var bounds = new google.maps.LatLngBounds();

//Recursively loop through your coordinate list
    latLng = new google.maps.LatLng(<YourLat>, <YourLon>);
    bounds.extend(latLng);
//

extentBox = new google.maps.Rectangle({
    bounds: bounds,
    strokeColor: "#FF0000",
    strokeOpacity: 0.8,
    strokeWeight: 2,
    fillColor: "#FF0000",
    fillOpacity: 0.35
});
extentBox.setMap(map);

Ehi, grazie per la risposta, tuttavia sto cercando il metodo effettivo piuttosto che chiamare un'API o utilizzare una soluzione preesistente.
Pris,

Mi hai dato il metodo bounds.extend, stavo cercando questa soluzione esatta, quindi grazie!
Thomson Comer,

Funziona con i poligoni? Ti vedo usare Rectangle.
Danny G,

1

Penso che avrei potuto trovare un modo per farlo. La mia implementazione preliminare funziona, ma non sono sicuro che ci siano casi limite che mi sono perso. Se c'è qualcosa che non va in questa soluzione, segnalalo.

Dato che mi preoccupo di ottenere le gamme lon / lat per il poligono piuttosto che solo i punti che lo compongono, un modo per tentare il problema è in realtà 'camminare' lungo l'insieme delle coordinate ordinate dall'inizio alla fine. Tieni traccia di quanto in senso orario e antiorario hai viaggiato rispetto al centro della Terra dato un punto di partenza e continua fino a quando non completi il ​​poligono:

inserisci qui la descrizione dell'immagine

Puoi ottenere una gamma di quanto CW e CCW viaggino dal tuo punto di partenza ... questo ti dà abbastanza informazioni per derivare i limiti corretti nel caso normale (a sinistra nell'immagine). Nel caso in cui il poligono giri completamente o tagli attraverso il centro, l'angolo di spostamento restituito sarà di 360 gradi.

Questo metodo funziona anche quando il poligono "abbraccia" la superficie della Terra invece di tagliarla. Quindi se hai un poligono che mostra qualcuno che viaggia lungo la superficie della Terra da Toronto (lon: -79) a Londra (lon: -5) a Tokyo (lon: 139) e ritorno (nello stesso ordine), avrai ottenere l'intervallo [da -79 a 139].

Se il poligono attraversa il centro (immagina due punti adiacenti a +90 e -90), considero questo uno sweep completo (360 gradi) sebbene tu possa andare in entrambi i modi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.