How To
Zugriff auf ESRI Geodatabase

Zugriff auf ESRI Geodatabase

Iwan ist in der Lage binär gespeicherte Informationen aus ODBC Datenbanken zu lesen. Dabei handelt es sich um ein Format, welches dem der ESRI Shapedateien ähnelt. Dieses Format existiert bei uns seit einigen Jahren. Die Firma ESRI hat mit der Einführung der ArcGIS Produktfamilie ebenfalls eine datenbankbasierte Speicherfrom für Geodaten ermöglicht, die "Personal Geodatabase". Es handelt sich dabei um eine JET Datenbank (auch bekannt als Access Datenbank). Die binären Daten werden dabei in einer der Shape-Datei ähnlichen Struktur abgelegt. Der Zugriff (mit Einschränkungen) durch iwan ist mit dem Befehl "AddTheODBCLayer" möglich.

Verbindungsparameter

Bei der Datenquelle handelt es sich um eine JET Datenbank. Für diese stehen auf jedem Rechner die ODBC Provider von Microsoft zur Verfügung. Die Verbindungszeichenfolge lautet dabei:

Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\myDb.mdb;

Datenquellen

Iwan erwartet für eine ODBC Datenquelle vom Typ "BLOB" (Binary-Large-Objects) immer vier weitere Spalten für die Abfrage der räumlichen Ausdehung eines jeden Objekts. In der GDB muss für diese Abfrage ein View (Abfrage) bereitgestellt werden. Die Informationen sind über eine Tabelle mit dem Präfix "_Shape_index" zu beziehen.

Die Ausdehnung für jedes Objekt kann als ganzzahliges Vielfaches der Index-Gridsize gespeichert werden. Dabei muss der Wert aus der Tabelle GDB_GeomColumns ermittelt und in der Abfrage berücksichtigt werden.

SELECT 
([MinGX]-1)*1228.5 AS XMIN,
([MinGY]-1)*1228.5 AS YMIN,
([MaxGX]+1)*1228.5 AS XMAX,
([MaxGY]+1)*1228.5 AS YMAX,
skn_l.*
FROM
skn_l_Shape_Index 
INNER JOIN
skn_l ON skn_l_Shape_Index.IndexedObjectId = skn_l.OBJECTID;

Bei dieser Abfrage wird die Tabelle SKN_L gegen die Indextabelle SKN_L_SHAPE_INDEX verknüpft. Die Index-Gridsize beträgt 1228.5 und wurde für die Ermittlung des Extent berücksichtigt.

Alternativ kann die Gridsize natürlich in der Abfrage durch eine Verknüpfung eingefügt werden:

SELECT 
([MinGX]-1)*gz.IdxGridSize AS XMIN,
([MinGY]-1)*gz.IdxGridSize AS YMIN,
([MaxGX]+1)*gz.IdxGridSize AS XMAX,
([MaxGY]+1)*gz.IdxGridSize AS YMAX,
FuPoly.*
FROM
(SELECT IdxGridSize 
FROM GDB_GeomColumns 
WHERE TableName = 'FuPoly') gz,
FuPoly
INNER JOIN FuPoly_Shape_Index ON 
FuPoly_Shape_Index.IndexedObjectId = FuPoly.OBJECTID;

 

Beispiel(e)
connStr="Driver={Microsoft Access Driver (*.mdb)};";
+"Dbq=C:\Temp\THS\geometrie.mdb;"




ret=ExecOld("AddTheODBCLayer", theServer:connStr, theLayer:"VW_SKN", theType:"BINARY", theField:"XMIN|YMIN|XMAX|YMAX|SHAPE", theSymbol:"12", UseDrawSel:true, theName:{toCreate}, theDescription:"SKN - MDB", theFormatString:"ESRISHAPE");
Kartenausgestaltung

Kartenausgestaltung

Mit der Version 3.4.1.23 stehen die neuen Designlayer zur Verfügung. Mit Hilfe von dieser Layer kann für fast jeden Ebenentyp eine Ausgestaltung definiert werden. Der Befehl AddTheDesignLayer dient der Erstellung einer solchen Ebene.

Der Designlayer ...

... erlaubt das Hinzufügen von weiteren Darstellungselementen an der Geometrie einer bereits vorhandenen Ebene. Dabei gilt die folgende Regel:

  • wird ein Designlayer ohne den sonst üblichen Parameter "theName" definiert, so wird dieser zum Bestandteil der Quellebene,
  • wird ein Name vergeben, dann wird dieser Layer als eigenständige Ebene innerhalb des Projekts behandelt und muss der Zeichenliste mit übergeben werden.

Letzgenanntes ist sinnvoll, wenn z.B. die Reihenfolge explizit festgelegt werden soll oder das Abschalten der Darstellung notwendig ist.

Durch die generelle Unterstützung von COM in Iwanscript stehen nahezu unbegrenzte Möglichkeiten zur Verfügung, beispielsweise die Darstellung von Diagrammen in der Karte.

Konzept

Für jeden Datensatz der Quellebene kann eine Aktion definiert werden, um an eine vorgegebene Position der Geometrie eine Zeichenaktion auszuführen.

Der einfachste Fall besteht in der Defintion einer Beschriftung. Alle zu definierenden Werte können mit einem der folgenden Werte vorgegeben werden:

  • der Name einer Spalte,
  • einem konstanten Wert,
  • einem Skript-Ausdruck (Expression).

Jede Spalte der Datenquelle kann Verwendung finden. Datentypen werden automatisch in ein für die Anforderung passendes Datenformat konvertiert (Text-Zahl usw.).

Die Zeichenoperation unterscheidet in Funktionen, welche als Zeichenelement einen Text zurückliefern und in Funktionen, welche die Zeichenarbeit selbständig übernehmen.

Die Laufzeitumgebung stellt den Skripten alle Attribute des jeweiligen Datensatzes als Variablen zur Verfügung. Des Weiteren werden Paramter wie der aktuelle Kartenmaßstab oder die X/Y Koordinaten übergeben. In einem Skript können diese Variablen über den Präfix $ angesprochen werden. Diese Variablen sind immer in Großbuchstaben zu adressieren.

Als Beispiel eine Kartenausgabe aus dem cardo System mit einem integriertem Diagramm für die Darstellung statistischer Daten:

Beispieldiagramm

Designlayer zur Darstellung von Diagrammen

Designlayer zur Darstellung von Diagrammen

Das folgende Beispiel erstellt mit Hilfe eines COM Objekts Diagramme pro Datensatz für die Quellebene "STAT". Als Bezugspunkt wird die Mitte der umschließenden Box jeder Geometrie ausgewählt. (theBasePoint:"EXTEND:CC"). Die Ausrichtung des Bildes erfolgt zentriert an diesem Punkt (theAlign:"CC")

Die Anweisungen werden pro Aufruf der Ebenendarstellung aus einer separaten Datei gelesen, d.h. dass alle Änderungen an der Datei "diag.iws.desing" sofort sichtbar werden.

In Variante 2 wird der Inhalt der Datei einmalig eingelesen und geparst. Änderungen erfordern das Neuladen der Ebene, die Abarbeitung ist dagegen etwas schneller.

Hinweis: Dieses Beispiel verwendete die Komponente ChartDirector. Dabei handelt es sich um ein Produkt der Firma ASE. Diese Komponente muss auf dem Server installiert sein. Natürlich ist auch jede andere Komponente möglich, aber mit dem ChartDirector haben wir im Bereich Diagrammdarstellungen sehr gute Erfahrungen gemacht. 

Hauptdatei, Variante 1

Go;

   srcLayer="STATE";

   ret=ExecOld("AddTheDesignLayer",

                   theLayer:srcLayer,

                   theFile:"diag.iws.design",

                   theSymbol:"302",

                   theAngleField:"0",

                   theXOffset:0,

                   theYOffset:0,

                   theBasePoint:"EXTEND:CC",

                   theSizeField:"200",

                   theScriptMakeImage:true,

                   theAlign:"CC");

   if(not(ret));

       WriteTrace(GetLastError());

       EndScript;

   EndIf;

End;

Hauptdatei, Variante 2

Go;

   srcLayer="STAT";

   ret=LoadTextFile(txt,"diag.iws.design");

   if(not(ret));WriteTrace("Laden ... schlug fehl");EndScript;EndIf;

   txt="EXPRESSION:"+txt;

   ret=ExecOld("AddTheDesignLayer",

                   theLayer:srcLayer,

                   theTextField:txt,

                   theSymbol:"302",

                   theAngleField:"0",

                   theXOffset:0,

                   theYOffset:0,

                   theBasePoint:"EXTEND:CC",

                   theSizeField:"200",

                   theScriptMakeImage:true,

                   theAlign:"CC");

   if(not(ret));

       WriteTrace(GetLastError());

       EndScript;

   EndIf;

End;

Datei "Diag.iws.design"

//StartPerfTimer();

call "Diag";

//WriteTrace(printF(">>>>> DIAG: %.2f ms",StopPerfTimer()));

//----------------------

routine "Diag";

//----------------------

   if(not(firstCall));

       firstCall=true;

       // ChartDirector erzeugen

       ret=CreateObjectOnce(cd,"ChartDirector.API");

       // Breite / Höhe festlegen

       // Ich gehe mal davon aus, dass alle gleich groß sind

       height=MathDiv($CURR_SIZE,$CURR_MAPSCALE)*1000;

       width=height;

       //the tilt angle of the pie

       angle=60;

       ret=CreateObject(data,"ARRAY");

       ret=CreateObject(labels,"ARRAY");

       //the Lables

       labels.Add("Fr.");

       labels.Add("Mr.");

       labels.Add("Jug.");

       labels.Add("Beh.");

       labels.Add("Lang.");

       pieWidth=height*0.5;

       pieHeight=height*0.5;

       pieRadius=width*0.2;

       depth=height/30;

       fntSize=depth*1;

   else;

       ret=data.Empty();

   endif; 

   c=cd.PieChart(int(width),int(height));

   ret=c.setLabelStyle("",fntSize);

   //Create a PieChart object

   //Set the center of the pie and the radius

   ret=c.setPieSize(pieWidth,pieHeight,pieRadius);

   //Set the depth and tilt angle of the 3D pie (-1 means auto depth)

   ret=c.set3D(depth,angle);

   ret=c.setTransparentColor(16777215);

   //Daten aus den Spaltenwerten festlegen

   ret=data.Add($FRAUEN);

   ret=data.Add($MAENNER);

   ret=data.Add($JUG_UNTER25J);

   ret=data.Add($SCHWERBEHINDERT);

   ret=data.Add($LANGZEIT);      

   ret=c.setData(data,labels);

   // zeichnen und als binär ausgeben

   DrawImage(c.makeChart2(0),0,0);

EndRoutine();

Beispiel: Naturschutz

Darstellung eines Schildsymboles, die Buchstaben werden aus der Datenquelle dynamisch belegt.

Folgende Dateien werden benötigt:

Die .iws Datei zum Laden der Ebene

Go;

//Lade des DesignLayer an die Ebene L426

incFile_0=myPath+"NatSchild.design";

   

    ret=ExecOld("AddTheDesignLayer",

            theName:"NATSCHILD_DESING",

            theFile:incFile_0,

            theScriptMakeImage:"TRUE",

            theSizeField:"844.99",

            theSymbolSet:"NatSchild.ipalx",

            theSymbol:"4",

            theAngleField:"0",

            theXOffset:"0",

            theYOffset:"0",

            theBasePoint:"FIRST",

            theAlign:"CC",

            OnlyInUserScope:true,

            theLayer:"L426");

 

    if(not(ret));

        EndScript(GetLastError());

    EndIf;

 

End;

Die Symbolpalette "NatSchild.ipalx"

Go;

    call "SC";

    SetTrueTypeMarker(4,

        "ESRI DEFAULT MARKER",

        "50",

        "NONE",

        "Yellow",

        "36",

        "Black",43);

 

 

    SetAntialias(4,true);

 

    SetTextProp(5,"ARIAL","BLACK","0","10",false,true);

    Routine "SC";

    SetNewSymbolCount(5,false,false);

    EndRoutine;

End;

 

Die Datei "NatSchild.design"

//////////////////////////////////////////

//Beim 1. Aufruf die Symbolpalette laden

//////////////////////////////////////////

if(not(g));

    ret=CreateObjectOnce(g,"Graphics");

    ret=g.LoadSymbolSet($CURR_SYMBOLSETFILE);

    if(not(ret));

        endScript();

    endif;

endIf;

//////////////////////////////////////////

//Das "Schild" ist ein TrueType Marker

//////////////////////////////////////////

geom=printf("gPOINT:%.4f|%.4f",$CURR_GEOMPOSX+25,$CURR_GEOMPOSY);

ret=g.DrawGeom(geom,$CURR_SYMBOL);

txtSizeGeo=18;

xShift=0;

txtSize=ToImageDistance(txtSizeGeo);

x=$CURR_GEOMPOSX+xShift;

y=$CURR_GEOMPOSY-5;

//////////////////////////////////////////

//Den Text für den oberen Buchstaben

//aus dem 1. Zeichen des Inhaltes der Spalte

//THEME_TITLE verwenden

//////////////////////////////////////////

charToDraw=left(1,$THEME_TITLE);

//////////////////////////////////////////

ret=g.DrawText(charToDraw,

    5,//SymbolNummer

    x,

    y,//Position

    txtSize,//Größe

    0,//Winkel

    true,"Normal");

//////////////////////////////////////////

//Der zweite Buchstabe (hier konstant)

//unterhalb des 1.

//////////////////////////////////////////

y=y-MathDiv(txtSizeGeo,2);

y=y-4;

//////////////////////////////////////////

ret=g.DrawText("g",

    5,//SymbolNummer

    x,

    y,//Position

    txtSize,//Größe

    0,//Winkel

    true,"Normal");

Beispiel: Stopschilder

Mit DesignLayern ist u.a. die Darstellung von Punktsymbolen an Linien einfach zu realisieren.

Im folgenden Beispiel sollen alle Straßen mit einer bestimmten ID mit einem "Stopschild" versehen werden.

Dazu kann ein DesignLayer an der Ebene definiert werden. In diesem wird mit dem Graphics Objekt eine Punktgeometrie mit einem konstanten Symbol dargestellt. Das Symbol, wie alle anderen Werte, kann natürlich auch aus einer Spalte der Datenquelle stammen.

In diesem Beispiel werden drei Dateien verwendet. Eine Symbolpalette, die Skriptdatei zum Laden des Designlayer's und der Code für den Designlayer.

Die Ebenendefinition (.iws Datei)

///////////////////////////////////
Go;

myPath=GetScriptFile(true)-GetScriptFile(false);

//Erstelle einen DesignLayer aus Basis der Ebene

//STRASSE. Die Anweisungen, welche pro Datensatz

//die Darstellung realisieren, sind in der Datei

//StopSchild.design ausgelagert (siehe nächste Datei...)
ret=ExecOld("AddTheDesignLayer",

   theFile:"StopSchild.design",

   theScriptMakeImage:"TRUE",

   theSizeField:"1.91",

   theSymbolSet:"Baustellen.ipalx",

   theSymbol:"4",

   theAngleField:"0",

   theXOffset:"0",

   theYOffset:"0",

   theBasePoint:"CENTROID",

   theAlign:"CC",

   theLayer:"STRASSE");

 

//////////////////////////////////

End;

Die Datei für den DesignLayer (StopSchild.design)

if(InList($OBJECTID_1,"7564","6753"));

  if(not(g));

     ret=CreateObjectOnce(g,"Graphics");

     ret=g.LoadSymbolSet($CURR_SYMBOLSETFILE);

     if(not(ret));

        endScript();

     endif;

   endIf;

 

 geom=printf("gPOINT:%.4f|%.4f",$CURR_GEOMPOSX,$CURR_GEOMPOSY);

 ret=g.DrawGeom(geom,$CURR_SYMBOL);

endIf;

Die Symbolpalette (als IPALX Datei zu speichern)

///////////////////////////////////
Go;

call "SC";

//Ein TrueType Marker, bestehend aus 2 Layern
//roter Untergrund, weißes Kreuz

   SetTrueTypeMarker(4,
                     
"WINGDINGS2",
                     "20PX",
                     "NONE",
                     
"RED",
                     
"152",
                     
"WHITE",
                     
"86");

 

   SetAntialias(4,true);

 

Routine "SC";
  
SetNewSymbolCount(4,false,false);

EndRoutine;

//////////////////////////////////

End;

Zugriff auf PostGreSQL / PostGIS

Ab der Iwan Version 3.2.x wird der Zugriff auf Postgres Ebenen unter der Erweiterung Postgis vollständig unterstützt (im folgenden PG). Für den Zugriff wird der Ebenentyp "AddTheODBCLayer" verwendet. Diese zugegebenermaßen etwas verwirrende Bezeichnung hat einen historischen Ursprung. Die Performance mit den ODBC Treibern war nicht sehr gut, daher wurde intern die PG-API verwendet. Um die Ebenentypen gering zu halten findet der Parameter "theDatabase" Verwendung um die Nutzung der PG-API zu aktivieren. Dadurch wurden gegenüber dem ODBC Zugriff deutliche Perfomancesteigerungen erzielt.

Iwan verwendet für den datensatzbasierten Zugriff über die Funktion GetRowByRowId des  Layerobjektes standardmäßig die Spalte "OID" (siehe Parameter "theIdField") . Für diese sollte immer ein Index erstellt werden. Alternativ ist jede andere Spalte oder die Angabe des Wertes "NONE" möglich.

Verbindungsparameter

Bei der Erstellung der Verbindungszeichenfolge muss beachtet werden, dass kein ODBC - ConnectionString, sondern die PG konforme Darstellung erwartet wird. Die PG Konvention erlaubt die Angabe der Parameter in einer durch Leerzeichen separierten Form. Die einzelnen Parameter sind dabei durch ein = - Zeichen zu trennen.

Hier ein Beispiel für eine gültige Verbindunszeichenfolge:

user=postgres password=XXX host=localhost dbname=geo port=5433

Datenquellen

Als Quelle kann jedes Datenbankobjekt verwendet werden, auf welches ein "SELECT * ..." anwendbar ist. D.H., dass für Statements als Datenquelle eine Klammerung und die Definition eines Alias nötig ist.

Beispiele für gültige Datenquellen sind:

tbl_geodaten

(SELECT THE_GEOM,OID,ID FROM TBL_MYGEOM WHERE ...) AS TBL1

Beschriftungen mit PostGIS

Für die Erstellung einer Ebene nur für Beschriftungen können einige Sonderparameter definiert werden. Dabei wird der Erste und der Letzte Punkt der Geometrie (des ersten Part's) als Richtungsvektor verwendet. Die Argumente sind ...

....
theTextField:"text",
theSizeField:"isize",
theJustifyField:"just",
theSrid:"31469"
....

Bekannte Probleme

Zur Zeit werden keine Felder des Datentyps "NUMERIC" ausgewertet. Die Präzision spielt dabei keine Rolle.

Ebenso sind Probleme bei dem Zugriff auf UNICODE Zeichenfolgen bekannt. Wenn möglich sollte auf diese verzichtet werden.

Werden Klassifikationen nicht in Form von ILF Dateien angewendet, setzt iwan ein "SELECT DISTINCT ...)" gegen die Datenquelle ab. Dieser Vorgang kann u.U. sehr viel Zeit in Anspruch nehmen.

Ebenso wird, wie bei jeder Datenquelle, versucht die Ausdehung aller Elemente und die Anzahl der Objekte beim Laden der Ebene zu ermitteln. Auch dabei kann es zu erheblichen Verzögerungen bei der ersten Bereistellung kommen.

Zur Optimierung dieses Vorganges kann der Parameter "theExtentInfo" verwendet werden. Die Angabe von "NONE" ermittelt keinerlei weitere Informationen. Iwan kann in diesem Fall allerdings auch keine Abfrageoptimierungen durchführen.

Verwenden Sie alternativ den Parameter theInitExtent.

Beispiel(e)
ret=ExecOld("AddTheODBCLayer",
	theServer:"user=usr password=xxxx host=srv1 dbname=geo port=5433",
	theLayer:"(SELECT * FROM alk_flurst WHERE ART = 1) AS A",
	theType:"OGC",
	theField:"the_geom",
	theSymbol:"41",
	UseDrawSel:true,
	theName:"PG_FL",
	theMaxScale:10000,
theIdField:"OID", theDescription:"ALK - Flurstücke Postgres 8", theDataBase:"POSTGRES", theExtentInfo:"NONE");
Oracle Spatial

Für den Zugriff auf ORACLE-SDO Ebenen sind umfangreiche Einstellungen möglich/nötig.

Im besonderen die Beschaffung von Informationen zu der geographischen Ausdehnung der Ebenenelemente ist nicht immer ganz trivial. Iwan kann mit diesen (ansonsten optionalen) Informationen einige Optimierungen vornehmen.

Da iwan als Quellenangabe jedes abfragbare Datenbankobjekt (Tabellenname, Synonyme, View, Select - Statements usw.) akzeptiert, greift er nicht direkt auf die Informationen in der SDO_GEOM_METADATA Tabelle zu.

Wenn der Zugriff auf die USER_SDO_GEOM_METADATA Informationen möglich ist, kann durch einen View auf diese Informationen zugegriffen werden.

Ist die Angabe nicht einfach möglich, verwenden Sie alternativ den Parameter theInitExtent.

View für die Extent-Ermittlung im iwan Stil
CREATEORREPLACEVIEWVW_IWANSTYLE_EXTENTSAS
(
SELECT
XVALS.TABLE_NAMESOURCE,
XVALS.XMINXMIN,
YVALS.YMINYMIN,
XVALS.XMAXXMAX,
YVALS.YMAXYMAX
FROM
(SELECT
e.sdo_lbasxmin,
e.sdo_ubasxmax,
G.TABLE_NAME,G.COLUMN_NAME
from
user_Sdo_geom_metadataG,
TABLE(G.diminfo)e
WHERE
e.sdo_dimname='X')XVALS,
(SELECT
e.sdo_lbasymin,
e.sdo_ubasymax,
G.TABLE_NAME,G.COLUMN_NAME
from
user_Sdo_geom_metadataG,
TABLE(G.diminfo)e
WHERE
e.sdo_dimname='Y')YVALS
WHERE
XVALS.TABLE_NAME= YVALS.TABLE_NAME AND XVALS.COLUMN_NAME=YVALS.COLUMN_NAME
);
Ermittlung der Ausdehnung aller Elemente einer Tabelle

Wenn Sie Probleme bei der Zuweisung der DIMINFO Daten für USER_SDO_GEOM_METADATA haben, hilft Ihnen dieses PL/SQL Skript weiter.


DECLARE  v_tableNameVARCHAR(50):='ALK_FL';
v_columnNameVARCHAR(50):='GEOM';BEGIN
UPDATEuser_sdo_geom_metadataSETdiminfo=
(SELECT
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT('X',EX.XMIN,EX.XMAX,.005),
MDSYS.SDO_DIM_ELEMENT('Y',EX.YMIN,EX.YMAX,.005))
FROM
(SELECT v.constVal,
SUM(DECODE(v.idx,1,v.column_value,0))xmin,
SUM(DECODE(v.idx,2,v.column_value,0))ymin,
SUM(DECODE(v.idx,3,v.column_value,0))xmax,
SUM(DECODE(v.idx,4,v.column_value,0))ymax
FROM
(SELECT
b.COLUMN_VALUE, rowNumidx,
1constVal
FROM
(SELECTSDO_TUNE.EXTENT_OF(v_tableName,v_columnName)geom
FROMdual)a,
TABLE(a.geom.sdo_ordinates)b
)v
GROUPBYv.constVal
ORDERBYv.constVal
)EX
)
WHERE
TABLE_NAME=v_tableNameANDCOLUMN_NAME=v_columnName;
END;
/
Kartenqualität

Die Kartenerstellungen durch Mapserver stellen oft einen Kompromiss zwischen Performance und Qualität dar. Ebenso sind die Möglichkeiten zur Beeinflussung durch den Administrator mehr oder weniger stark beschränkt.

Mit iwan bestehen viele Optionen welche sich nicht auf den ersten Blick erschließen. Einen Überblick über diese Problematik mit Hinweisen zu "Warum" und "Wie" finden Sie unter der Rubrik "Symbole und Klassifikation" auf dieser Webseite.

Darstellung von Rasterdaten

Die Bereitstellung von Rasterdaten kann über verschiedene Wege erfolgen. In der Regel liegen diese als TIF(F) Dateien vor. Die Performance bei der Darstellung ist meist nicht sehr gut.

Optimale Ergebnisse werden, im Besonderen für Luftbilder und Ähnliche, erzielt, wenn diese im ECW Format vorliegen. Des Weiteren kann das Ergebniskartenbild einige Optimierungen erfahren, wenn bestimmte Einstellungen vorgenommen werden.

Darstellung von 1-Bit Rasterdaten (Schwarz-Weiß)

Wenn "Schwarz-Weiß" Rasterdaten (1 Bit Farbtiefe) vorliegen, kann eine optimierte Zugriffsart gewählt werden. Normalerweise liest der im cardo enthaltene Mapserver die gesamte Bilddatei und passt diese in den Ausgabekartenausschnitt ein. Dabei wird durch ein Interpolationsverfahren eine sehr gute Qualität erzielt. Allerdings ist dabei mit Performanceverlusten zu rechnen. Im Fall von 1 Bit Bildern sollten Sie den optionalen Parameter "theDrawMode" mit dem Wert "PixDirect" belegen. Dabei wird ein optimiertes Zugriffsverfahren angewandt, welches mit deutlich höherer Performance bei relativ geringem Qualitätsverlust arbeitet. Auf der Karteiseite "Weitere Skriptanweisungen" im Assistenten der physischen Ebene tragen Sie die Anweisung theDrawMode:"PixDirect" ein und aktivieren damit diesen Zugriffsmodus.

Konvertierung in das ECW Format

Die Konvertierung ist im Batch-Betrieb sehr schnell möglich, die dazu benötigten Werkzeuge stehen kostenfrei zur Verfügung.

Der Anbieter ERMapper stellt auf seiner Homepage einen kostenfreien Konverter (ECW Kompressor) zur Verfügung. Dieser muss korrekt installiert sein, bevor die nachfolgend beschriebenen Schritte durchgeführt werden können.

Für die Bearbeitung vieler Dateien kann das Werkzeug "File2Clip" eingesetzt werden. Die Formatierungsanweisung für File2Clip lautet:

start /wait ecw_compress_free.exe %p -o  d:\lubis\ecw\%f -g -c 1 -nowait

Wichtiger Hinweis: Der Parameter -g steht für "Grayscale", verwenden Sie für farbige Bilder statt dessen die Option "-rgb".

Die Pfade müssen natürlich entsprechend angepasst werden. Suchen Sie dazu mit der Windows Explorersuche alle Dateien mit der Extension "*.tif", die im Explorer aufgelisteten Suchergebnisse können Sie dann in den grünen Bereich von File2Clip ziehen. Dabei wird File2Clip in Aktionpro Datei eine Zeile Text generiert. Öffnen Sie nun einen Texteditor Ihrer Wahl, z.B. das berühmte Notepad.exe und fügen Sie den durch File2Clip generierten Text mit der Tastenkombination {STRG}+V in den Editor ein. Das Ganze kann als Datei mit der Extension *.bat gespeichert und in einem Konsolenfenster (cmd.exe) ausgeführt werden. Im Zweifelsfall testen Sie eine einzelne Anweisung, um die generierten Anweisungen auf Korrektheit zu überprüfen.

Beachten Sie bitte, dass ecw_compress_free.exe im Suchpfad (PATH Variable) vorhanden ist oder geben Sie den Pfad zur Datei mit an. 

Ausgabeoptimierungen

Ein weiteres Problem beim Umgang mit Lufbilddaten ist die Zielkomprimierung. Der Benutzer erhählt pro Kartenanforderung ein komprimiertes Bild vom Mapsserver als Ergebnis der Anforderung.

Die Standardeinstellung liefert dabei immer Bilder im Komprimierungsformat PNG aus. Dabei handelt es sich um eine verlustfreie Komprimierungsform. Die Ergebnisse sind i.d.R. Bilder mit geringer Größe und sehr guter Qualität. Der Algorithmus ist allerdings bei häufig wechselnden Farbwerten, wie dies bei Luftbildern u.ä. der Fall ist, ineffizient. Die Komprimierung ist dann sehr zeitintensiv und die Ergebnisbilder sind relativ groß (von der Anzahl der Bytes und der damit zu übertragenden Datenmenge betrachtet).

Iwan erlaubt pro Ebene das Überschreiben des Standardausgabeformates. Dazu kann der optionale Parameter "theImageType" verwendet werden. Sinnvoller Weise sollten die Ergebnisbilder, wenn Sie Ebenen mit dem beschriebenen Charakter enthalten, in JPEG Komprimierung ausgeliefert werden.

Fügen Sie in diesem Fall die Anweisung:
theImageType:"JPG"
hinzu. Der Mapserver wird dann die JPG Komprimierung wählen, wenn von der Ebene mindestens ein Element im Ergebniskartenbild enthalten ist.