Iwan bietet verschiedene Möglichkeiten Symbole in Abhängigkeit vom aktuellen Kartenmaßstab darzustellen. Dabei kann es entweder um Optimierung der Darstellungsqualität gehen, oder auch um die Performance zu optimieren.
Beispiel
Im Folgenden soll anhand eines Punktsymboles die verschiedenen Möglichkeiten demonstriert werden.
Wie eindeutig zu erkennen ist, ist die Darstellung mit einem Vektormarker ca. 2x so schnell, wie die Darstellung mit einem TrueType Marker (jeweils ein Symbollayer). Die angegebenen Zeiten beziehen sich auf die Darstellung einer ungefilterten Punktmenge aus einer Shape Datei. Dabei wurde alle ~23.000 Punkte zur Anzeige gebracht.
|
TrueType - Marker mit 2 Layern
Zeichendauer: 1450 ms
Bereich: 1:0 ... 1:2000
|
|
TrueType - Marker mit 1 Layer
Zeichendauer: 1079 ms
Bereich: 1:2001 ... 1:5000
|
|
Vektormaker, 1 Element
Zeichendauer: 520 ms
Bereich: 1:5001 ...
|
Die Symbolpalette (ipalx)
Go;
SetNewSymbolCount(20,false,false);
/////////////////////////////////////////////////////////////7
//1. Defintion des Standardsymboles
// Diese bietet die detailierteste Darstellung
/////////////////////////////////////////////////////////////7
SetTrueTypeMarker(10,
"Webdings", //Name der Schriftart
10, //Größe in Karteneinheiten
"None", //Keine Hintergrundfarbe
"Red",110, //Marker-Layer 1: Roter Kreis
"Yellow",120);//Marker-Layer 2: Weißes Kreis mit Diagonale
/////////////////////////////////////////////////////////////7
//Skalierung begrenzen. Symbol ist hier mit 10 Karteneinheiten
//als Größe definiert
//Nie kleiner als 10 Pixel, nie größer als 15 Pixel
/////////////////////////////////////////////////////////////7
SetMinMaxWidth(10,10,50);
/////////////////////////////////////////////////////////////7
//Einfacherer Darstellung des Objektes
/////////////////////////////////////////////////////////////7
SetTrueTypeMarker(11,
"Wingdings 2", //Name der Schriftart
20, //Größe in Karteneinheiten
"None", //Keine Hintergrundfarbe
"Red",156); //Marker-Layer 1: Roter Kreis mit "Loch"
/////////////////////////////////////////////////////////////7
//Wenn der Maßstab von 0-1000 ist, dann Symbol 10 verwenden.
//Außerhalb diese Maßstabes Symbol Nr. 11 verwenden
/////////////////////////////////////////////////////////////7
SetSymbolRule(10, //Diese Regel für Symbol Nr. 10 definieren
11, //Alternatives Symbol, falls diese Regel *nicht* zutrifft
0, //Symbol 10 trifft zu, wenn MinScale >= 0
1000/* bis MaxScale <= 1000 gegeben ist,
ansonsten verwende Symbol Nr. 11*/);
/////////////////////////////////////////////////////////////7
//Bis hier ist die Darstellung optisch gelungen, aber die Performance
//lässt zu wünschen übrige. Die Datenmenge ist i.d.R. vom
//Maßstab abhängig. Ein TrueType Marker ist immer etwas "langsamer"
//als ein Vektor-Marker, also noch ein Symbol und eine Regel dazu definieren
/////////////////////////////////////////////////////////////7
BeginVectorMarker(12,
10, //Größe in Karteneinheiten
"Yellow", //Rahmenfarbe
"Red"); //Hintergrundfarbe
VMBox(0,0,100,100);/*Rechteck in den log. Koordinate
0,0 bis 100%,100% */
EndVectorMarker();
//Skalierung "aushebeln", immer mit 10px darstellen
SetMinMaxWidth(12,10,10);
/////////////////////////////////////////////////////////////7
//Wenn der Maßstab von 1000 - 5000 ist, dann Symbol 11 verwenden.
//Außerhalb diese Maßstabs Symbol Nr. 12 verwende
/////////////////////////////////////////////////////////////7
SetSymbolRule(11, //Diese Regel für Symbol Nr. 11 definieren
12, //Alternatives Symbol, falls diese Regel *nicht* zutrifft
1000, //Symbol 10 trifft zu, wenn MinScale >= 0
5000/* bis MaxScale <= 5000 gegeben ist,
ansonsten verwende Symbol Nr. 12*/);
End;
Ebenendefinition
Bei der Definition der Ebene ist lediglich darauf zu achten, dass hier Symbol 10 zugewiesen werden muss. Dieses wird durch die Symbolregeln abhängig vom Maßstab während des Zeichenvorgangs durch das entsprechend definierte Symbol ersetzt. In der Legende wird immer Symbol Nr. 10 dargestellt.