Mapserver Luftbilder sortieren

Ich habe nun bereits eine umfangreiche Sammlung von Luftbildern angesammelt und im Index.
Allerdings ärgert mich dabei dass die zu letzt zum Index hinzugefügten Bilder immer oben drauf liegen.
Gibt es eine Möglichkeit den Index zu sortieren? So dass die Bilder im Nordwesten von den Bildern aus dem Südosten überdeckt werden und nicht nach der Reihenfolge in der sie dem Index hinzugefügt werden?

Du redest sicher vom Shapefile, das mit gdaltindex erzeugt wird. Der Mapserver kann da nichts mehr sortieren. Bei neuen Bildern lösche ich daher das Shapefile und lege ein neues an. Dafür habe ich ein Perl-Script, das die World-Dateien liest und nach der Auflösung sortiert. Also Bilder mit niedriger Auflösung zuerst und welche mit hoher Auflösung zuletzt dem Shapefile hinzufügt. Wenn du nach Himmelsrichtung sortieren willst kannst du auch die Koordinaten des Worldfiles auswerten. Ich beschneide die Bilder vorher, um nicht von Norden nach Süden sortieren zu müssen :slight_smile:

Ja ich hoffte das man den gdaltindex sortieren könnte.
Wie genau geht dein Perlskript vor? Ich habe das Problem, dass ich unter Windows arbeite. Das unterstütz ja Perl nicht einfach so. Daher die Frage ob man das auch irgendwie anders machen kann.
Wie ermittelst du die Auflösung der Bilder? Ich habe die eigentlich immer im gleichen Maßstab runtergeladen. Aber in waldgegenden wäre es vielleicht sinnvoller auch einen größeren Maßstab zu nehmen.

Ich suche nach allen *.jgw Dateien, lese jeweils Zeile 1, in der die Breite eines Pixels in Metern (==Auflösung) steht, sortiere diese Zahlen, ersetze .jgw mit .jpg, und rufe dann gdaltindex mit der sortierten Dateiliste auf.

Hi,
an welcher Stelle setzt ihr denn mit dem Perl-Skript an?

Als kleiner Windoofer habe ich es mit mir einem Excel-Makro gelöst. Es werden einfach alle Dateinamen aus dem Ordner in eine Tabelle gelesen, dann jeweils eine *.jgw geöffnet, die Auflösung und Koordinaten übernommen. Damit sie mit gdaltindex richtig eingelesen werden setze ich einfach einen Parameter (aus der Auflösung) davor und überlasse Windows die Sortierung. Damit ich nicht jedesmal alle .jgw öffnen muss, merke ich mir die Paramter im Dateinamen: z.B. 99903_a00097_r441046_h581031_d2007-05-04_exportimg2012217153011299190.

Anschließend mit einem Batch die drei Bilder.* löschen und neu aufbauen… Funktioniert bis jetzt problemlos.

Doppelte Bilder (Auflösung und Koordinaten gleich) kann ich damit eliminieren - gibt es aber eine “einfache” Möglichkeit, doppelt abgedeckte Gebiete zu erkennen und auszusortieren, d.h. wenn ich ein Gebiet sowohl in 1:2000 als auch komplett in höheren Auflösungen habe, könnte ich die 1:2000 von mapserver rausnehmen…

Hintergrund ist, dass ich zu Anfang nur die Bilder in unterschiedlichster Auflösung geladen habe, wo ich gerade was bearbeitet habe und sie mit Piclayer angezeigt. Später bin ich dann dazu übergegangen sie nicht einfach “wegzuschmeißen” sondern zu sammeln - und inzwischen funktioniert (Dank eurer Hilfe hier und in der Wiki) der Mapserver auch rund… nur habe ich keinen Überblick, wo ich welche Bilder in welcher Auflösung habe oder sogar mehrfach abdeckend…

Gruß
Stefan

Natürlich kannst du das rausfinden. Allerdings wird das nicht so einfach gehen wie bisher.
Du könntest für jedes Bild berechnen welchen Bereich es abdeckt. Danach suchst du dir alle Bilder die diesen Bereich berühren und versuchst alle Teilflächen abzudecken. Wenn danach kannst du dieses Bild löschen. Allerdings musst du dabei sicherstellen, dass du kein Bild löschst welches eine bessere Auflösung hat, weil zum Beispiel eines mit niedrigere Auflösung das Bild komplett einschließt.
Ebenfalls schwierig wird es herauszufinden ob das Bild im Bild liegt oder eben nicht.

Ich denke der Aufwand dafür ist recht hoch. Ob du davon wirklich profitierst wage ich zu bezweifeln, wenn das schlecht aufgelöste Bild ohnehin im Hintergrund liegt nimmt es allenfalls Festplattenplatz in Anspruch.

klingt nicht so trivial… aber solange “nur” Plattenplatz belegt wird, ist es wohl egal. Ist es dem mapserver egal (Performance), wenn er mehrere übereinanderliegene Bilder liefern müsste?

Das Perl-Skript hat er übrigens hier veröffentlicht:
http://forum.openstreetmap.org/viewtopic.php?pid=220471#p220471

Gruß,
Mondschein

Ohne es probiert zu haben sage ich einfachmal ja. Denn er legt später eingefügte nicht mehr über das ursprüngliche Bild. Das spricht dafür, dass Mapserver aufhört zu suchen, sobald alle Lücken geschlossen sind. Egal was noch kommt.

Arbeitet er nicht zuerst mit den “zuletzt” eingefügten Bildern?

Aber wenn er dann quasi einfach aufhört, dann kann man es wirklich lassen…

Hat jemand schonmal versucht, ein Art abstrakte Übersichtskarte zu erstellen, wo Bilder in welcher Auflösung vorhanden sind?

Das wäre ja schön, wenn er die zuletzt eingefügten Bilder nehmen würde. Dann fügt man einfach die bessere Auflösung nochmal ein wenn man es braucht. Aber leider war die Reihenfolge bei mir immer so wie eingefügt. Egal ob später noch was besseres kam.

Komisch, dann würde ja die ganze Geschichte mit dem Unbenennen nach Auflösung keinen Sinn machen - aber genau da nimmt er die Bilder schön der Reihe nach. Und die mit der höchsten Auflösung zeigt er mir an - und die werden ja m.M. als letztes eingelesen (da sie nach Windows-Sortierung ganz unten stehen).

Vielleicht kann uns da noch mal jemand aufklären…

Kannst du uns das etwas genauer erläutern?

Gruß,
Mondschein

Ich lade ein paar Bilder herunter. Diese werden in den Index aufgenommen. Später lade ich ein weiteres Bild aus dem gleichen Bereich. Auch das lese ich in den Index ein. Wenn ich mir jetzt den Bereich anschaue, werden mir die Bilder angezeigt, welche zuerst im Index aufgenommen wurden. Spätere Bilder werden nur in Bereichen angezeigt, welche nicht bereits bedeckt waren.
Das dies so funktioniert habe ich selbst probiert und damit damals auch den Vergleich zwischen die verschiedenen Maßstäben beim herunterladen der Bilder gemacht. Dort musst das Bild mit dem kleinsten Maßstab immer zu erst eingelesen werden, damit es nicht von dem größeren verdeckt wird.

Ich habe das hier nachgestellt.

Ok, 1:1000.

[1] Ok, ZIPs entpackt und “gdaltindex test.shp *.jpg”.

Ok, neue Bilder 1:500 1:1000 und 1:1500 heruntergeladen, zwei liegen hierbei vollständig im Bereich der alten Bilder, eines nur halb und eines gar nicht.

Ok, zuerst nur die 1:1000 hinzugefügt ([1] schon ausgeführt).
Getestet.
WMS-Cache gelöscht.
Dann Index gelöscht und alles von vorne (los bei [1]), dieses mal die 1:500 hinzugefügt.
Getestet.
WMS-Cache gelöscht.
Dann Index gelöscht und alles von vorne (los bei [1]), dieses mal die 1:1500 hinzugefügt.
Getestet.
WMS-Cache gelöscht.
Dann Index gelöscht und alles von vorne (los bei [1]), dieses mal die 1:1500 und danach 1:1000 hinzugefügt.
Getestet.
WMS-Cache gelöscht.
Dann Index gelöscht und alles von vorne (los bei [1]), dieses mal die 1:1000 und danach 1:500 hinzugefügt.
Getestet.
WMS-Cache gelöscht.
Dann Index gelöscht und alles von vorne (los bei [1]), dieses mal die 1:500 und danach 1:1000 hinzugefügt.
Getestet.
WMS-Cache gelöscht.
Dann Index gelöscht und alles von vorne (los bei [1]), dieses mal die 1:500 und danach 1:1500 hinzugefügt.
Getestet.
WMS-Cache gelöscht.
Dann Index gelöscht und alles von vorne (los bei [1]), dieses mal die 1:1500, danach 1:1000 und danach 1:500 hinzugefügt.
Getestet.

Kann ich nicht nachvollziehen, hier mein Ergebnis:
Alle Billder wurden exakt in der hinzugefügten Reihenfolge angezeigt, das ist gut an der Aerowest-Schrift und dem OSM-Logo zu erkennen.
Verwendet habe ich GDAL 1.6.3.
Hast du deinen WMS-Cache auch gelöscht, damit keine veralteten Kacheln ausgeliefert werden?

Kleiner Tip:
Mit Quantum GIS kannst du dir auch die SHP-Datei ansehen, dann siehst du auch direkt, wie die Bilder im Index angeordnet sind.

Gruß,
Mondschein

Du hast getestet aber nicht geschrieben welches Bild du gesehen hast. Interessant wären die beiden Zeilen:

Welches Bild liegt nun über welchem? Beim ersten Test dürftest du von dem 1:500 Bild nur sehen was von dem 1:1000 Bild nicht abgedeckt ist.
In der zweiten Zeile genau anders rum.

Schrieb ich doch schon:
“Alle Bilder wurden exakt in der hinzugefügten Reihenfolge angezeigt”

Nein, es ist genau anders herum, so wie ich es auch erwartet habe:

Versuch 1 (4x1:1000 → 1x1:1000 → 1x1:500):

gdaltindex 1.shp 1.jpg 2.jpg 3.jpg 4.jpg
gdaltindex 1.shp g.jpg
gdaltindex 1.shp k.jpg

Ergebnis:

Versuch 2 (4x1:1000 → 1x1:500 → 1x1:1000):

gdaltindex 2.shp 1.jpg 2.jpg 3.jpg 4.jpg
gdaltindex 2.shp k.jpg
gdaltindex 2.shp g.jpg

Ergebnis:

Anmerkung:

1:1000 Bilder:
1.jpg, 2.jpg, 3.jpg und 4.jpg

1:1000 Bild:
g.jpg

1:500 Bild:
k.jpg

Gruß,
Mondschein

Ok entweder täusche ich mich jetzt, weil es schon so lange her ist, oder aber es hat sich verändert. Wobei ersteres wahrscheinlicher ist.

Ich habe mir ein Lazarus-Programm (Pascal) geschrieben, dass für mich fast alles ereldigt:


type
  TDatenrecord = record
    DateinameJGW: string;
    DateinameJPG: string;
    DateinameOvr: string;
    Ort: string;
    Groesse: double;
    GroesseGerundet: double;
    Reihenfolge: integer;
    XKoord: double;
    YKoord: double;

[...]   

procedure Sortieren (var Datenarray:TDatenarray);
  procedure Vertauschen (var Datenarray:TDatenarray;i,j:integer);
  var
    ZwSpeicher: TDatenrecord;
  begin
    ZwSpeicher:= Datenarray[i];
    Datenarray[i]:=Datenarray[j];
    Datenarray[j]:=ZwSpeicher;
  end;

var
  i,j:integer;
  begin
    For i:= Length(Datenarray)-1 downto 1 do
      For j:=1 to i do
        begin
          if Datenarray[j-1].GroesseGerundet < Datenarray[j].GroesseGerundet
            then begin
              Vertauschen(Datenarray, j-1,j);
            end;
          if Datenarray[j-1].GroesseGerundet = Datenarray[j].GroesseGerundet
            then if Datenarray[j-1].YKoord < Datenarray[j].YKoord
              then begin
                Vertauschen(Datenarray, j-1,j);
              end;
        end;
  end; 

Da die Auflösungen nicht immer gleich sind habe ich diese gerundet und sortiere sie im ersten Schritt nach der Größe. Sollte die Größe gleich sein sortiere ich nach der Y-Koordinate, sodass das nördliche Bild immer zuerst gezeichnet wird.

gdaltindex macht es sich beim Zeichen sehr einfach: Was zuerst im Index ist wird zuerst gezeichnet. Das hat den Vorteil, dass man Übersichtsbilder an den Anfang stellen kann, welcher Schnell sichtbar wird und die Deteilbilder am Ende werden danach drüber gelegt.

Sollten Fragen zu meinem Code sein oder der Wunsch den ganzen Code zu bekommen gerne bei mir melden.

In diesem Sinne,
AJoNee