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
LLy <= y <= URy e
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.
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.
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.)
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.
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.)
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).
Usa il minimo e il massimo dei valori y per gli angoli dell'MBR.
((-283, -85), (-36, 81))