Kartenlegenden für Vektor-Stile

Das Abfrufen von Legendenbildern für Vektor-Ebenen ist über den hier beschriebenen Handler möglich.

Die Quelle für ein Legende ist dabei das Vektor-CSS einer Ebene.

Für GRID Ebenen wird eine automatisch generierte Legende erstellt. Es ist noch nicht möglich diese selber zu hinterlegen.

Das Symbol in der Legende wird im Maßstab 1:3000 generiert.

Automatisch generierte Legende

Eine automatische Legendenerstellung findet nur statt, wenn kein nicht leerer "map_legend" Block vorhanden ist. Die Eigenschaften von CSS Blöcken dürfen keine Daten aus einer Datenquelle verwenden. Die Bedingungen und Eigenschaften von CSS Blöcken dürfen keine dynamische Funktionen (ein Parameter ist ein Spaltenwert) enthalten. Ein CSS Block darf nur zu einem Legendensymbol gehören.

CSS Blöcke, die die gleichen Bedingungen haben, werden zu einem Legendensymbol zusammengefasst. Der erste CSS Block aus dem ein Legendensymbol besteht, kann die zwei optionalen Eigenschaften "map-legend-label" und "map-legend-scale-factor" definieren. Die "map-legend-label" Eigenschaft erlaubt es explizit ein Label für das Legendensymbol anzugeben. Wird die Eigenschaft nicht definiert, so wird das Label automatisch, aus den Bedingen für den CSS Block, generiert. Die Eigenschaft "map-legend-scale-factor" erlaubt es die Größe des Legendensymbols zu ändern.

Das folgende Beispiel zeigt gültiges CSS für die automatische Legendenerstellung. Die generierte Legende besteht aus drei Symbolen, wobei das erste Symbol das Legendenlabel explizit angibt ("Elbe") und das zweite Symbol generiert das Label automatisch aus der Bedingung. Das dritte Symbol erhält keine Bezeichnung, da hier kein Label-Eintrag vorhanden ist und ebenso keine Bedingung definiert wurde.

Beispiel Legende

line {
    single-choice {
        Elbe [gn == "Elbe"]{
            line-width: 4;			
            line-color: RGB(28, 28, 192);	
            map-legend-label: "Elbe";
            map-legend-scale-factor: 1;
        } 
        Prießnitz [gn == "Prießnitz"]{
            line-width: 3;			
            line-color: RGB(17, 152, 161);
            map-legend-scale-factor: 1;	
        } 
        alleanderenGewässer {
            line-width: 1;
            line-color: RGB(0, 143, 255);
        } 
    }        
}

Explizite Definition der Legendeneinträge

Es gibt zwei Möglichkeiten ein Kartenlegendensymbol zu zeichnen.

Die bevorzugte Variante ist die BlockIds ("geometry-ids") der Blöcke anzugeben, aus denen das Symbol besteht. Wenn keine BlockIds angegeben sind, müssen Daten so wie sie in der Datenquelle definiert sind, angegeben werden.

Mit diesen Daten werden dann die Bedingungen der Geometrie-Blöcke ausgewertet und festgestellt, welche Blöcke zu zeichnen sind.

Beispiel Legende

line {
    single-choice {
        Elbe [gn == "Elbe"]{
            line-width: 4;			
            line-color: RGB(28, 28, 192);            
        } 
        Prießnitz [gn == "Prießnitz"]{
            line-width: 3;			
            line-color: RGB(17, 152, 161);
            map-legend-scale-factor: 1;	
        } 
        alleanderenGewässer {
            line-width: 1;
            line-color: RGB(0, 143, 255);
        } 
    }        
}	
map_legend {
    {
        label: "Elbe";
        scale-factor: 0.5;        
        geometry-ids: Elbe;
        geometry-type: line;  
        //oder data: gn = "Elbe";
    }
    {
        label: "Prießnitz";
        scale-factor: 1.0;
        geometry-ids: Prießnitz;
        geometry-type: line;
    }
    {
        label: "Fließgewässer";
        scale-factor: 1.0;
        geometry-ids: alleanderenGewässer;
        geometry-type: line;
    }
}

Wenn die Geometrie-Blöcke variable Ausdrücke (hier im Beispiel die text-rotation) enthalten, müssen die Daten, die für ihre Auswertung notwendig sind, ebenfalls angegeben werden:

Beispiel Legende

point::Symbol {
    complex-graphics:
    text {
    text:53;
    text-color: green;
    text-font-name: "Webdings";								
    text-height: 40px;								
    text-rotation: [winkel];
    };
}   
map_legend {
    {
    label: "Symbol 45° gedreht";
    scale-factor: 0.5;
    geometry-type: point;
    data: winkel = 45;
    geometry-ids: Symbol;
    }       
}

Hinweis

Werden im CSS weitere Spalten (hier im Beispiel "nummer" und "ort") genutzt, so müssen beide Spalten in der data-Eigenschaft der Legende notiert werden:

map_legend {
  {
    scale-factor: 0.5;
    geometry-type: point;
    data:   nummer= "1", ort = "Musterstadt";
    }
}

Die Eigenschaft geometry-ids kann auch mehrere IDs enthalten. Hilfreich ist dies im folgenden Beispiel. Die Symboldefinition würde zu diesem Legendeneintrag führen, wobei der Nutzer in der Karte aber eine andere Symbolik sieht.

CSS:

polygon::default {
    fill-pattern: solid;
    border-line: {
        line-width: 1px;
        line-color: black;			  
    };
}
polygon {		
    AlleAnderen {
        fill-color: yellow;
    }
    Hellerau [Stadtteilname == "Hellerau/Wilschdorf mit Rähnitz"]{
        fill-color: blue;
        fill-pattern: hatch_style_backward_diagonal;
        pattern-lines-width: 3px;
    }
}
map_legend {	
    { 
    label: "Hellerau";
    scale-factor: 1.0;
    geometry-type: polygon;
    geometry-ids: Hellerau;
    }
    { 
    label: "Alle anderen Stadtteile";
    scale-factor: 1.0;
    geometry-type: polygon;	
    geometry-ids: AlleAnderen;		
    }
}

Karte:

Beispiel Legende

Legende:

Beispiel Legende

Der Legendeneintrag unter geometry-ids kann nun so ergänzt werden, dass das Symbol für den Stadtteil Hellerau korrekt angezeigt wird.

map_legend {	
    { 
    label: "Hellerau";
    scale-factor: 1.0;
    geometry-type: polygon;
    geometry-ids: AlleAnderen, Hellerau;
    }
    { 
    label: "Alle anderen Stadtteile";
    scale-factor: 1.0;
    geometry-type: polygon;	
    geometry-ids: AlleAnderen;		
    }
}

Legende:

Beispiel Legende

Hinweis zu Problemen mit Legenden und Beschriftung

Beispiel 1:

Beispiel für ein Problem in der Legendensymbolik, wenn die Bedingung (hier Spalte Bezeichnung) für das Symbol einen Text enthält:

[BEZEICHNUNG == "Quelle 1" && MSTNR == 0] {
point {
    complex-graphics:
        circle {
            line-width: 2px;
            line-color: black;
            fill-color: RGBA(0, 0, 255, 1);
            fill-pattern: solid;
            radius: 6px;
        },
           text {		
            text: [bezeichnung];
            text-color: black;
            text-font-name: "arial";
            text-height: 10px;			
            position-x:0px;
            position-y:20px;
        };
    }
}
[BEZEICHNUNG == "Quelle 2" && MSTNR == 3] {
point {
    complex-graphics:
        circle {
            line-width: 2px;
            line-color: black;
            fill-color: greenyellow;
            fill-pattern: solid;
            radius: 6px;
        },
        text {		
            text: [bezeichnung];
            text-color: black;
            text-font-name: "arial";
            text-height: 10px;			
            position-x:0px;
            position-y:20px;
        };
    }
}

map_legend {
    {
    label: "Quelle 1 - Dresden";
    scale-factor: 1.0;
    geometry-type: point;
    data: MSTNR= 0, BEZEICHNUNG = "Quelle 1";        
    
    }
    {
    label: "Quelle 2 - Dresden";
    scale-factor: 1.0;
    geometry-type: point;
    data: MSTNR= 3, BEZEICHNUNG = "Quelle 2";       
    }
}

Dieses Beispiel für zu einer unschönen Legende. Die Objekte in der Bedingung werden in der Legende dargestellt.

Beispiel Legende

Lösen kann man dieses Legendenproblem nur, in dem eine andere Spalte, die nicht die Beschriftung enthält und die trotzdem die Bedingung erfüllt, für diese Bedingung genutzt wird. Hier im Bsp. die Spalte standnr. In der Legende muss natürlich die neue Spalte und die Beschriftung weiterhin enthalten sein. Die Beschriftung selber kann als leerer String angegeben werden.

[standnr == 1234 && MSTNR == 0] {
point {
    complex-graphics:
        circle {
            line-width: 2px;
            line-color: black;
            fill-color: RGBA(0, 0, 255, 1);
            fill-pattern: solid;
            radius: 6px;
        },
        text {		
            text: [bezeichnung];
            text-color: black;
            text-font-name: "arial";
            text-height: 10px;			
            position-x:0px;
            position-y:20px;
        };
    }
}

    ...

map_legend
{
    {
    label: "Quelle 1 - Dresden";
    scale-factor: 1.0;
    geometry-type: point;
    data: MSTNR= 0, standnr= 1234, BEZEICHNUNG = " ";   
    }    
}

Beispiel Legende

Beispiel 2:

Im folgenden Beispiel wird nicht nur der Inhalt einer Spalte für die Beschriftung genutzt, sondern weitere Spalten und zusätzliche Texte. Das CSS für dieses Beispiel sieht so aus:

[id == 1 ] {
    point {
        complex-graphics:
            circle {
            line-width: 2px;
            line-color: black;
            fill-color: lightblue;
            fill-pattern: solid;
            radius: 6px;
        }  ;
    }
}
[id == 2] {
    point {
        complex-graphics:
            circle {
            line-width: 2px;
            line-color: black;
            fill-color: greenyellow;
            fill-pattern: solid;
            radius: 6px;
        };
    }
}

point {
    complex-graphics:
        text {		
        text: ["Name der Quelle: " // bezeichnung // "\nNummer der Quelle: " // id];
        text-color: black;
        text-font-name: "arial";
        text-height: 10px;			
        position-x:0px;
        position-y:20px;
    };
}

map_legend
{
    {
    label: "Quelle 1 - Dresden";
    scale-factor: 1.0;
    geometry-type: point;
    data: id= 1, BEZEICHNUNG = "Quelle 1";  
    }
    {
    label: "Quelle 2 - Dresden";
    scale-factor: 1.0;
    geometry-type: point;
    data: id= 2, BEZEICHNUNG = "Quelle 2";  
    }
}

Die Legende würde für dieses Beispiel so aussehen:

Beispiel Legende

Auch hier müssen wir das CSS anpassen, indem wir den Parameter text mit einer if-Abfrage erweitern.

...

point {
    complex-graphics:
        text {		
        text: [bezeichnung == "nichtanzeigen" ? "": "Name der Quelle: " // bezeichnung // "\nNummer der Quelle: " // id];
        text-color: black;
        text-font-name: "arial";
        text-height: 10px;			
        position-x:0px;
        position-y:20px;
    };
}
map_legend
{
    {
    label: "Quelle 1 - Dresden";
    scale-factor: 1.0;
    geometry-type: point;
    data: id= 1, BEZEICHNUNG = "nichtanzeigen";  
    }
}

Beispiel Legende

Beispiel 3:

Wird für eine Ebene eine maßstabsabhängige Symbolik definiert, so ist es im Moment nicht möglich im Ausdruck die jeweils vom Maßstab abhängige Legende anzuzeigen. Hierzu wäre alternativ möglich den Label zu erweitern, bswp. "Grenzlinien (<1:100)" und "Grenzlinien (> 1: 100)".


Zuletzt geändert: 23.07.2020 15:20:12 (erstmals erstellt 08.04.2018)