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 Legende mit maßstabsbeschränkten Symbolen

Haben Sie eine Symbolik erstellt, welche maßstabsabhängig ist, so wird diese Maßstabsabhänigkeit NICHT in der Legende umgesetzt. Alternativ können in der Legende für die Maßstabsbereiche eigene Legenden definiert werden und im Label entsprechend erläutert werden.

map_legend {
    {
        geometry-ids: id1;
        scale-factor: 0.5;
        geometry-type: polygon;
        label: "Naturschutzgebiet <= 1: 5000";
    }
    {
        geometry-ids: id2;
        scale-factor: 0.5;
        geometry-type: polygon;
        label: "Naturschutzgebiet > 1: 5000";
    }
}

Hinweis zum Einfügen von Überschriften

Es ist aktuell noch nicht möglich Überschriften hinzuzufügen. Der Ebenenname bildet die Überschrift. Ggf. müssen Sie diesen anpassen.

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)".

Beispiel 4:

Wir haben in diesem Beispiel ein Polygon mit einem Punkt symbolisiert. In der Legende soll nur der Punkt erscheinen.

AusgangsCSS

polygon {
    fill-color: RGBA(227,0,0,0.25);
    fill-pattern: solid;
    border-line:
        {
        line-width: 1px;
        line-color: RGBA(227,0,0,0.25);
        };
    point-placement: centroid;
    point: {
        complex-graphics:
        circle {
            line-width: 2px;
            line-color: black;                                   
            radius: 50m;
            min-radius: 8;
            max-radius: 15;
            fill-color: white;
            fill-pattern: solid;
        },
        text {              
        /*Spalte, wo die Nummer her kommt*/
        text: "1";    
        text-font-name: "arial";
        text-height: 10px;           
        }; 
    };  
}

map_legend {
    {
        label: "Schutzgebiete";
        scale-factor: 0.5;
        geometry-type: polygon;
    }
}

Legende: Beispiel Legende

Angepasstes CSS

polygon::flaeche {
    fill-color: RGBA(227,0,0,0.25);
    fill-pattern: solid;
    border-line:
        {
        line-width: 1px;
        line-color: RGBA(227,0,0,0.25);
        };         
}
polygon::punkt {
    point-placement: centroid;
    point: {
    complex-graphics:
        circle {
            line-width: 2px;
            line-color: black;                                   
            radius: 50m;
            min-radius: 8;
            max-radius: 15;
            fill-color: white;
            fill-pattern: solid;
        },
        text {              
            /*Spalte, wo die Nummer her kommt*/
            text: "1";    
            text-font-name: "arial";
            text-height: 10px;           
        }; 
    };
}

map_legend {
    {
        label: "Schutzgebiete";
        geometry-ids: punkt;
        scale-factor: 0.5;
        geometry-type: polygon;
    }
}

Legende: Beispiel Legende

Fehlermeldungen

Es ist keine Legende verfügbar.

Css-Fehler in Zeile 8. Der CSS Ausdruck "-(wert)" der Eigenschaft "text-rotation" des "text" Blocks (Id: "") verwendet einen unbekannten Spaltennamen: "Es ist keine Spalte mit dem Namen "wert" vorhanden.".Bei Meldungen zu fehlenden Spalten prüfen Sie bitte, dass alle im css verwendeten Spalten (in der Form [spalte]) auch in dem Legenden-Block im Bereich data definiert sind (bspw. data = spalte = 'xx').

Prüfen Sie hier bitte, ob alle im CSS verwendeten Spalten in der Legende referenziert werden. Dabei spielt es keine Rolle, ob der Spaltenwert für die Darstellung der Symbolik genutzt wird oder eine Bedingung definiert wurde.

Prüfen Sie weiterhin, ob der data - Block in der Legende nur einmal notiert wurde. Sollen mehrere Spalten referenziert werden, dann sind diese mit Komma zu trennen:

data: wert = 2, name = "hallo";

Css-Fehler in Zeile 45. Der CSS Ausdruck "(intwert)" der Eigenschaft "text-rotation" des "text" Blocks (Id: "") ergibt keine Zahl.

Dieser Fehler kann verursacht werden, wenn in der Legende eine Zahlenspalte mit einem String referenziert wird:

data: wert = "2";

Richtig:

data: wert = 2;

Zuletzt geändert: 13.03.2024 12:40:13 (erstmals erstellt 08.04.2018)