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.
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.
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:
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:
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:
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.
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 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:
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 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:
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:
weitere Hinweise
Umbruch im Label
Ist der Text für das Label zu lang, so können Sie im CSS einen ganz normalen Umbruch einfügen und weitere Zeichen am Anfang entfernen:
map_legend {
{
label: "Beispiel mit ganz langem Namen und
einen weiteren Teil auf der nächsten Zeile";
scale-factor: 0.5;
geometry-type: polygon;
}
}
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: 20.09.2024 07:22:06 (erstmals erstellt 08.04.2018)