Ich schreibe eine Anwendung zum Testen der Leistung aller Arten von Kartendiensten, hauptsächlich AGS 9.x, AGS 10 und WMS 1.x.
Ein Teil der Anwendung besteht darin, zufällige Begrenzungsrahmen für einzelne Anforderungen im vollen Umfang des Dienstes zu generieren. Dieser Teil funktioniert gut für geografische und projizierte Koordinatensysteme, wenn der volle Umfang des Dienstes bekannt ist (z. B. über die Eigenschaft fullExtent eines AGS-Dienstes).
Mein Problem ist mit WMS: Jede Schicht in einer GetCapabilities-Antwort kann ihren Begrenzungsbereich in> = 1 CRS definieren. Einige Teile der Anwendung müssen wissen, ob das CRS eines Dienstes geografisch oder projiziert ist. Um Unklarheiten in WMS zu beseitigen, verwende ich immer die LatLonBoundingBox der Ebene, die immer definiert ist und in EPSG: 4326. Ich muss dann einen Full-Service-Begrenzungsrahmen basierend auf allen Ebenen berechnen, die in eine einzelne Anforderung eingehen (die zufällig ausgewählt werden). Hier wird es schwierig.
Ich verliere mich, weil für jeden Lat / Lon-Begrenzungsrahmen der LLx (untere linke Länge) eine größere oder kleinere Zahl sein kann als der URx (obere rechte Länge), je nachdem, welche Meridiane er überspannt. Jedes Mal, wenn ich anfange, quadratische oder kreisförmige Diagramme zu zeichnen, denke ich, dass ich einen Ansatz gefunden habe, und finde dann einen Fall, der ihn ruiniert und mein Gehirn verwandelt sich in Brei.
Ich werde weiter daran arbeiten, bis es funktioniert, und wenn ich eine Lösung bekomme, poste sie hier, aber ich bin sicher, dass es einen akzeptierten und vollständig getesteten Ansatz geben muss, der mein Leben leichter machen würde. Ich kann es gerade nicht finden.
Antworten:
Der Artikel, auf den verwiesen wird, ist nachdenklich. Aber ich glaube , es ist eine „einfache und elegante“ Lösung: für geografische Datensätze gibt es zwei Arten von Zeichen - Boxen. Diejenigen, die den + -180-Meridian nicht überspannen, können wie immer gespeichert und durchsucht werden. Diejenigen, die den + -180-Meridian überspannen, können in einer halbkomplementären Form gespeichert werden : Speichern Sie den Breitengradbereich wie gewohnt, aber speichern Sie stattdessen den Längengradbereich, der nicht in der Box enthalten ist (und schalten Sie ein wenig um, um anzugeben, welche Form vorliegt Speicherplatz verwendet wird). Grundsätzlich müssen keine Änderungen an geografischen Indizes oder Suchbaumstrukturen vorgenommen werden. Für die Suchalgorithmen ist nur eine geringfügige Änderung erforderlich.
Hier ist auf jeden Fall eine Lösung für die Frage selbst.
Ich gehe davon aus, dass Sie davon ausgehen, dass die Eingabe eine Folge von Bounding-Box-Deskriptoren ((LLx, LLy), (URx, URy)) ist, wobei:
-540 <= LLx, -180 <= URx, LLx <= 180 und URx <= 180. Auch -90 <= LLy <= URy <= 90.
Ein Punkt bei (Längengrad, Breitengrad) = (x, y) liegt genau dann innerhalb des BB, wenn
LLy <= y <= URy und
entweder LLx <= x <= URx oder LLx - 360 <= x <= URx.
Für die Ausgabe möchten Sie Parameter für den kleinsten Begrenzungsrahmen, der die Vereinigung aller Eingaben enthält.
Es ist klar, dass die y-Grenzen des minimalen Begrenzungsrahmens (MBR) das Minimum und Maximum der y-Werte sind. Verwenden Sie für die x-Grenzen einen Linien-Sweep, um die größte Lücke zu finden .
Hier ist eine Beschreibung des Algorithmus. Angenommen, die Eingabe besteht aus vier Feldern.
Hier ist ein Diagramm der Boxen (in Rot) und der MBRs (in Schwarz) der ersten, dann der ersten beiden, dann der ersten drei und dann aller Boxen.
Beachten Sie, dass im zweiten Schritt die Kästchen in der östlichen und westlichen Hemisphäre von einem MBR umgeben sind, der den Meridian von + -180 Grad kreuzt und auf dieser Karte als zwei separate Kästchen angezeigt wird. Im letzten Schritt muss dieser MBR nach Osten erweitert werden, um eine kleine Box zwischen Südamerika und der Antarktis aufzunehmen.
Extrahieren Sie alle x-Koordinaten der Felder, berechnen Sie sie modulo 360 (um sie im Bereich von -180..180 zu platzieren), sortieren Sie sie aufsteigend und fügen Sie den ersten Wert (inkrementiert um 360 Grad) an das Ende an, damit sie umbrochen werden um:
(Beachten Sie, dass 211 und -149 der gleiche Meridian sind.)
Stellen Sie sich jede x-Koordinate als das Intervall zwischen der vorhergehenden Koordinate (ohne den vorhergehenden Wert) und dieser vor. Beispielsweise repräsentiert -77 alle Werte von -81 bis -77, jedoch ohne -81. Zählen Sie für jedes dieser Felder nach dem ersten die Anzahl der Felder, die dieses Intervall enthalten.
Zum Beispiel bedeutet die erste "1", dass ein Feld das Intervall von -149 bis -90 abdeckt. (Es ist die dritte Box.)
Als Optimierung können Sie die Zählung stoppen, sobald Sie ein Feld finden , das ein x-Intervall abdeckt, und mit dem nächsten x-Intervall fortfahren. Wir versuchen nur festzustellen, welche Intervalle möglicherweise nicht von Kästchen abgedeckt werden.
Berechnen Sie die ersten Differenzen der sortierten x-Koordinaten in (1).
Ordnen Sie diese den Abdeckungszählungen in (2) zu. Finden Sie die größte Differenz, für die die Abdeckungszahl 0 ist. Hier entspricht sie
113
dem sechsten Element des vorhergehenden Arrays. Dies ist die größte Längenlücke, die die Sammlung von Kisten hinterlässt.(Interessanterweise zeigt die Möglichkeit, dass das Maximum an mehr als einem Ort auftritt, dass die Lösung nicht unbedingt eindeutig ist! Es kann mehr als einen MBR für eine Reihe von Boxen geben. Sie können einen eindeutigen definieren, indem Sie zusätzliche Bedingungen hinzufügen, z. B. Anforderungen dass der mittlere Abstand innerhalb des MBR zum + -180-Meridian so groß wie möglich ist; um ein Unentschieden aufzulösen, wählen Sie (sagen wir) die östlichste Lösung.)
Suchen Sie das entsprechende Intervall: Hier liegt es zwischen -36 und 77. Dies ist der Längenbereich, der nicht im MBR enthalten ist. Nehmen Sie daher das Komplement im Bereich von -180 bis 180. Hier besteht das Komplement aus zwei disjunkten Intervallen, eines von -180 bis -36 und eines von 77 bis 180. Alternativ können Sie das Komplement als ein einzelnes Rechteck darstellen, das möglicherweise das + überspannt -180 Grad Meridian: von -283 bis -36 hier (oder äquivalent von 77 bis 324).
Verwenden Sie die Min- und Max-Werte der y-Werte für die Ecken des MBR.
quelle