Come calcolare il rettangolo di selezione di più livelli in lat / long?


11

Sto scrivendo un'applicazione per testare le prestazioni di tutti i tipi di servizi cartografici, principalmente AGS 9.x, AGS 10 e WMS 1.x.

Parte dell'applicazione prevede la generazione di caselle di delimitazione casuali per le singole richieste, nella misura massima del servizio. Questa parte funziona perfettamente per i sistemi di coordinate geografiche e proiettate quando è nota la portata del servizio (ad es. Tramite la proprietà fullExtent di un servizio AGS).

Il mio problema è con WMS: ogni livello in una risposta GetCapabilities può definire la sua area di delimitazione in> = 1 CRS. Alcune parti dell'applicazione devono sapere se il CRS di un servizio è geografico o proiettato, quindi per rimuovere l'ambiguità in WMS utilizzo sempre il LatLonBoundingBox del livello che è sempre definito e in EPSG: 4326. Devo quindi calcolare un riquadro di delimitazione del servizio completo basato su tutti i livelli che vanno in una singola richiesta (che sono randomizzati). Questo è dove diventa difficile.

Mi sto perdendo perché per ogni riquadro di delimitazione lat / lon LLx (longitudine inferiore sinistra) potrebbe essere un numero maggiore o minore di URx (longitudine superiore destra), a seconda di quali meridiani si estende. Ogni volta che inizio a disegnare diagrammi quadrati o circolari penso di avere un approccio capito, quindi trovo un caso che lo rovina e il mio cervello si trasforma in poltiglia.

Continuerò a battere fino a quando non funzionerà, e se ottengo una soluzione pubblicarla qui, ma sono sicuro che ci deve essere un approccio accettato e pienamente testato che mi renderebbe la vita più semplice. Non riesco proprio a trovarlo in questo momento.


OK, in questo articolo: stonybrook.edu/libmap/coordinates/seriesa/no2/a2.htm (sezione Global Gotchas) Ho letto "Sfortunatamente, non esiste una soluzione semplice ed elegante per risolvere i Global Gotchas". Sto pensando di scansionare tutti gli strati e se URx <LLx imposta semplicemente l'estensione a -180 +180. Lo stesso articolo suggerisce che la maggior parte dei GIS dividerebbe un poligono con queste coordinate in due funzioni distinte.
Tomfumb

Qualche parola chiave in più per i motori di ricerca, poiché ho appena avuto difficoltà a trovare di nuovo questo eccellente post: riquadro di delimitazione minimo, unione di più riquadri di limite, riga della data internazionale, discontinuità, segmento minimo del cerchio
letmaik,

Risposte:


6

L'articolo di riferimento è ponderato. Tuttavia, credo che ci sia una soluzione "semplice ed elegante": per dati geografici, ci sono due tipi di scatole di delimitazione. Quelli che non si trovano a cavallo del meridiano + -180 possono essere memorizzati e cercati come sempre. Quelli che si trovano a cavallo del meridiano + -180 possono essere memorizzati in una forma semi-complementare : vale a dire, memorizzare l'intervallo di latitudini come al solito, ma invece memorizzare l'intervallo di longitudini non incluso nella casella (e alternare un po 'per indicare quale forma di archiviazione è in uso). In sostanza, non è necessario apportare modifiche agli indici geografici o alle strutture degli alberi di ricerca; è necessaria solo una leggera modifica per gli algoritmi di ricerca.

Ad ogni modo, ecco una soluzione alla domanda stessa.


Presumo che anticipi che l'input è una sequenza di descrittori del riquadro di selezione ((LLx, LLy), (URx, URy)) dove:

  • -540 <= LLx, -180 <= URx, LLx <= 180 e URx <= 180. Anche -90 <= LLy <= URy <= 90.

  • un punto a (longitudine, latitudine) = (x, y) è considerato all'interno del BB se e solo se

    1. LLy <= y <= URy e

    2. sia LLx <= x <= URX o LLx - 360 <= x <= URX.

Per l'output si desidera parametri per il riquadro di delimitazione più piccolo contenente l'unione di tutti gli input.

Chiaramente i limiti y del riquadro di delimitazione minimo (MBR) saranno il minimo e il massimo dei valori y. Per i limiti x, usa uno sweep di linea per trovare il gap più grande .

Ecco una descrizione dell'algoritmo. Per illustrarlo, supponiamo che l'input sia composto da quattro caselle,

((-81,-16),(-77,80)),
((77,-19),(156,5)),
((-149,-45),(-90,81)),
((-69,-85),(-36,-76))

Ecco un diagramma delle caselle (in rosso) e degli MBR (in nero) del primo, quindi dei primi due, poi dei primi tre, quindi di tutti i riquadri.

inserisci qui la descrizione dell'immagine

Nota come nel secondo passaggio, le caselle negli emisferi est e ovest sono circondate da un MBR che attraversa il meridiano + -180 gradi, facendolo apparire come due caselle separate su questa mappa. All'ultimo passo, quell'MBR deve essere espanso verso est per ospitare una piccola scatola tra il Sud America e l'Antartide.

  1. Estrarre tutte le coordinate x delle caselle, calcolarle modulo 360 (per posizionarle nell'intervallo -180..180), ordinarle in ordine crescente e aggiungere il primo valore (incrementato di 360 gradi) alla fine per farle avvolgere in giro:

    -149, -90, -81, -77, -69, -36, 77, 156, 211
    

    (Notare che 211 e -149 sono lo stesso meridiano.)

  2. Pensa a ciascuna coordinata x come a rappresentare l'intervallo tra la coordinata precedente (ma non includendo quel valore precedente) e esso. Ad esempio, -77 rappresenta tutti i valori da -81 a -77 ma non include -81. Per ognuno di questi dopo il primo, conta il numero di caselle che contengono quell'intervallo.

    1, 0, 1, 0, 1, 0, 1, 0
    

    Ad esempio, il primo "1" indica che una casella copre l'intervallo da -149 a -90. (È la terza scatola.)

    Come ottimizzazione, puoi interrompere il conteggio non appena trovi una casella che copre un intervallo x e passare al successivo intervallo x. Stiamo solo cercando di determinare quali intervalli potrebbero non essere coperti da nessuna casella.

  3. Calcola le prime differenze delle coordinate x ordinate in (1).

     59, 9, 4, 8, 33, 113, 79, 55
    

    Abbina questi ai conteggi della copertura in (2). Trova la differenza più grande per la quale il conteggio della copertura è 0. Qui, è uguale 113, il sesto elemento dell'array precedente. Questo è il più grande divario nella longitudine lasciato dalla collezione di scatole.

    (È interessante notare che la possibilità che si verifichi il massimo in più di una posizione mostra che la soluzione non è necessariamente unica! Ci può essere più di un MBR per un set di caselle. Puoi definirne uno unico aggiungendo condizioni aggiuntive, come richiedere che la distanza media tra l'MBR e il meridiano + -180 sia il più grande possibile; per risolvere un pareggio, scegliere (diciamo) la soluzione più orientale.)

  4. Trova l'intervallo corrispondente: qui, va da -36 a 77. Questa è la gamma di longitudini non presente nell'MBR. Pertanto, prendi il suo complemento nell'intervallo da -180 a 180. Qui, il complemento è di due intervalli disgiunti, uno da -180 a -36 e un altro da 77 a 180. In alternativa, rappresentano il complemento come un singolo rettangolo possibilmente a cavallo del + Meridiano di -180 gradi: da -283 a -36 qui (o, equivalentemente, da 77 a 324).

  5. Usa il minimo e il massimo dei valori y per gli angoli dell'MBR.

    ((-283, -85), (-36, 81))
    

Nell'ultima frase del punto 4, perché scrivi "da -283 a -36". Perché non da 77 a -36?
Letmaik,

1
@neo Perché "77 a -36" è un intervallo vuoto. (Per definizione, un intervallo [a, b] è costituito da tutti i numeri x tali che a <= x <= b. Con a = 77 e b = -36, non ci sono tali numeri.) Si potrebbe reagire dicendo "bene , per quanto riguarda la longitudine, da 77 a -36 è perfettamente chiaro ". Il problema è che non lo è: andrebbe da 77 a 180 = -180 e continuerebbe fino a -36 o scenderà da 77 a -36? Per evitare tali ambiguità ho scelto di stare attento.
whuber

Ho fatto una rapida implementazione della tua risposta (vedi l' essenza ). Per verificare se una scatola contiene un intervallo, ho dovuto scartare le lunghezze della scatola, altrimenti non avrebbe funzionato per le scatole che attraversavano la discontinuità. Essendo un principiante questo non era del tutto ovvio per me :)
letmaik,
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.