Przejdź do głównej zawartości

Styl mapy

Plik stylu MapCSS składa się z reguł stosowanych kolejno do każdego obiektu, od góry do dołu.

Przykładowy styl:

node[natural=tree] {
icon-image: "tree.svg";
}

wyświetli obraz tree.svg dla punktów, w których znacznik natural ma wartość tree.

Każda reguła stylu składa się z dwóch części: filtra node[natural=tree] oraz parametrów rysowania icon-image: tree.svg;. Filtr określa, do których obiektów zostaną zastosowane parametry.

Reguły można zagnieżdżać i ustawiać parametry na każdym poziomie.

|z16- {
icon-scale: 0.50;
icon-tint: @color_icon_tint;

[amenity=bicycle_parking] {
icon-image: "bike_parking.svg";
}
[amenity=bicycle_rental] {
icon-image: "bike_rental.svg";
}
[amenity=bicycle_repair_station] {
icon-image: "bike_service.svg";
}
}

Zagnieżdżone reguły pozwalają zachować zwięzłą i uporządkowaną strukturę stylu. Wspólne parametry można zdefiniować raz, bez powtarzania ich w wielu blokach.

Ta dokumentacja opisuje odmianę MapCSS używaną w aplikacji Guru Maps. Niektóre oryginalne parametry rysowania nie zostały zaimplementowane, ale dostępne są makra preprocesora, zagnieżdżone reguły i nowe funkcje obliczeniowe. Styl używany w Guru Maps znajduje się w repozytorium.

Filtry​

Przyjrzyjmy się złożonemu filtrowi:

node,area|z14-[boundary=forest_compartment][ref]

Składa się on z:

  1. Filtra typu node,area. Użyj node dla punktów, line dla linii, area dla wielokątów albo rozdziel kilka typów przecinkami. Użyj *, jeśli typ nie ma znaczenia.
  2. Filtra powiększenia z14-. Określa poziomy powiększenia, na których reguła ma zadziałać. Można podać tylko minimalny poziom, np. z8-, albo zakres, np. z3-9. W tym przypadku reguła działa na poziomach od 3 do 8 włącznie.
  3. Filtrów znaczników [boundary=forest_compartment][ref]. Pozostawiają one wyłącznie obiekty ze znacznikiem boundary o wartości forest_compartment i dowolną wartością znacznika ref. Aby wybrać obiekty bez znacznika ref, użyj filtra [!ref].

Kilka filtrów można rozdzielić przecinkami:

node,area|z14-[boundary=forest_compartment][ref],
node,area|z14-[boundary=forestry_compartment][ref]

W tym przykładzie wspólne parametry można przenieść na wyższy poziom:

node,area|z14-[ref] {
[boundary=forest_compartment],
[boundary=forestry_compartment] {

}
}

Czasami trzeba połączyć kilka reguł w grupę. Umieść filtry w nawiasach ( i ), aby je zgrupować bez natychmiastowego rozpoczynania bloku reguły.

node,area|z14-[ref](
[boundary=forest_compartment],
[boundary=forestry_compartment]) {
}

Makra preprocesora​

Preprocesor przygotowuje styl do analizy, podstawiając wartości oraz włączając lub wyłączając bloki zależnie od ustawień.

Makra podstawiania​

@import​

Wstawia zawartość wskazanego pliku:

@import "polygons.mapcss";

@{name}​

Wstawia wartość makra w każdym miejscu jego użycia:

// Zdefiniuj kolor za pomocą
@color_ground: #EAE3D3;

// następnie użyj go jako
canvas
{
fill-color: @color_ground;
}

Warunki​

@if​

Sprawdza parametr i dołącza blok do stylu albo go pomija:

@if Theme == Dark
@import "colors_dark.mapcss";
@else // Kolory domyślne
@import "colors.mapcss";
@endif

Guru Maps używa następujących parametrów preprocesora:

  • Theme {Light, Dark} — bieżący motyw aplikacji,
  • Style {Default, Outdoor} — bieżący styl mapy,
  • SubStyle {Car, Hike, Bike}
    • Car jest używany podczas jazdy samochodem,
    • Hike i Bike są używane odpowiednio podczas wędrówki i jazdy na rowerze.

@else​

Określa blok kodu wykonywany, gdy pierwszy warunek jest fałszywy.

@elif​

Zawiera warunek sprawdzany, jeśli wcześniejsze warunki nie zostały spełnione.

@endif​

Zamyka blok bieżącego warunku.

Parametry rysowania​

Te parametry określają sposób rysowania obiektów na mapie.

Wartości parametrów​

Szerokość​

Grubość linii, czyli width, można podać w pikselach 1px, punktach 2pt, metrach 3m albo obliczyć za pomocą wyrażenia, np. eval( zlinear( 13, 1px,1pt,max(2pt, 4m)) );. Więcej informacji znajduje się w sekcji o wyrażeniach.

Kolor​

Kolor można zapisać jako #RGB, #RRGGBB, #RRGGBBAA albo podać jego nazwę z listy kolorów CSS.

Tekst​

Każdy ciąg znaków między apostrofami lub cudzysłowami jest traktowany jako tekst.

'string'
"another string"

Parametry kolejności rysowania​

layer​

Numer warstwy służy do rozdzielania różnych poziomów na mapie.

// dla każdego obiektu ze znacznikiem „layer” ustaw właściwość „layer” na wartość znacznika
*|z9-[layer] {
layer: eval(tag(layer));
}

z-index​

z-index określa kolejność rysowania obiektów tego samego typu w obrębie warstwy.

area|z10-[natural=wood] {
z-index: -3;
fill-color: @color_wood;
}

area[natural=oceanwater] {
z-index: -2;
fill-color: @color_water;
}

Parametry wielokątów​

fill-color​

Kolor wypełnienia wielokąta.

area|z5-[natural=water] {
fill-color: @color_water;
}

fill-image​

Obraz wypełniający wielokąt.

// obraz wypełnienia obszaru wojskowego wyświetlanego nad innymi obiektami
area|z11- {
[landuse=military],
[military=danger_area] {
z-index: 2;
fill-image:"forbiddenArea.png";
}
}

fill-image obsługuje osadzony styl z danymi base64.

// tak samo jak arrow.svg
fill-image: eval(data("PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTI2IDNoMTBWMWw1IDMtNSAzVjVIMjZ6IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIG9wYWNpdHk9Ii40Ii8+PC9zdmc+Cg=="))

color i width dla wielokąta​

Kolor i szerokość obrysu wielokąta.

area|z15-[building] {
z-index: 3;
width: 1px;
color: @color_landuse_residential_stroke;
}

Parametry linii​

color i width dla linii​

Kolor i szerokość linii.

line|z13-[natural=tree_row] {
width: 3pt;
color: @color_wood;
z-index: -10;
}

casing-color i casing-width​

Kolor i szerokość obwódki linii, używane głównie dla dróg.

line|z8-[highway=motorway],
line|z11-[highway=motorway_link] {
color: @color_motorway;
casing-color: @color_motorway_casing;
casing-width: 0.5pt;
}

dashes​

Określa długości rysowanych i pustych odcinków. Suma liczb musi być potęgą liczby 2 (4, 8, 16, 32, 64 itd.). Każda liczba oznacza długość odcinka linii w punktach.

line|z15-[highway=cycleway] {
dashes: 2,2,2,2;
dashes-color: @color_cycleway_dashes;
}

dashes-color i dashes-width​

Kolor i szerokość kresek używanych dla szlaków, ścieżek, schodów i granic.

line|z15-[highway=steps] {
dashes-color: @color_footway_dashes;
dashes-width: eval( zlinear( 16, 3pt, 4pt ) );
}

linecap​

Kształt zakończeń linii. Dostępne wartości: none, square, round.

linejoin​

Kształt połączeń linii. Dostępne wartości: round, miter, bevel, auto.

Parametry tekstu​

text​

Tekst rysowany obok punktu albo wyśrodkowany na linii lub wielokącie.

node,area|z2-8[place=country] {
text: eval(locTag('name'));
// pominięto pozostałe parametry
}

font-weight​

Grubość kroju pisma. Dostępne wartości: bolder, bold, normal, light, lighter.

node,area|z9-[place=town],
node,area|z10-[place=village],
node,area|z12-[place=hamlet] {
font-weight:light;
font-size:11;
font-stroke-width:2px;
font-stroke-color: @color_label_stroke;
}

font-size​

Rozmiar czcionki.

font-stroke-width i font-stroke-color​

Szerokość i kolor obrysu czcionki.

text-color​

Kolor tekstu.

node,area|z2-8[place=country] {
text: eval(locTag('name'));
text-color: @color_name_text;
text-priority: 10;
// pominięto pozostałe znaczniki
}

text-priority​

Gdy etykiety konkurują o miejsce, text-priority określa, który tekst pojawi się jako pierwszy.

text-allow-overlap​

Pozwala etykietom nakładać się na siebie, dzięki czemu kilka tekstów może zajmować ten sam obszar.

text-big-padding​

Rezerwuje dwukrotnie większy odstęp wokół tekstu. Używaj tego parametru dla dużych miejscowości (miast, przedmieść itd.), aby etykiety nie zasłaniały mapy.

icon-image​

Nazwa obrazu wyświetlanego w punkcie albo na środku wielokąta.

node,area|z17-[amenity=library] {
icon-image: "library.svg";
icon-scale: 0.37;
icon-tint: @color_icon_tint;
}

icon-image obsługuje osadzony styl z danymi base64.

// tak samo jak poi_circle_small.svg
icon-image: eval(data("PHN2ZyB3aWR0aD0iOCIgaGVpZ2h0PSI4IiB2aWV3Qm94PSIwIDAgOCA4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNyA0QzcgNS42NTY4NSA1LjY1Njg1IDcgNCA3QzIuMzQzMTUgNyAxIDUuNjU2ODUgMSA0QzEgMi4zNDMxNSAyLjM0MzE1IDEgNCAxQzUuNjU2ODUgMSA3IDIuMzQzMTUgNyA0WiIgZmlsbD0iIzgwODA4MCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTggNEM4IDYuMjA5MTQgNi4yMDkxNCA4IDQgOEMxLjc5MDg2IDggMCA2LjIwOTE0IDAgNEMwIDEuNzkwODYgMS43OTA4NiAwIDQgMEM2LjIwOTE0IDAgOCAxLjc5MDg2IDggNFpNNCA3QzUuNjU2ODUgNyA3IDUuNjU2ODUgNyA0QzcgMi4zNDMxNSA1LjY1Njg1IDEgNCAxQzIuMzQzMTUgMSAxIDIuMzQzMTUgMSA0QzEgNS42NTY4NSAyLjM0MzE1IDcgNCA3WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg=="))

icon-scale​

Skaluje obraz tak, aby był większy lub mniejszy od oryginału.

icon-tint​

icon-tint zmienia kolor obrazu. #FFF pozostaje białe, #CCC przyjmuje jaśniejszy odcień wybranego koloru, #888 odpowiada kolorowi docelowemu, #444 staje się jego ciemniejszym odcieniem, a #000 pozostaje czarne. Między tymi punktami kolory przechodzą płynnie.

icon-offset-x i icon-offset-y​

Przesuwają obraz względem punktu zakotwiczenia. Domyślnie obraz jest wyśrodkowany na punkcie mapy. Na przykład icon-offset-y: 0; wyrównuje dolną krawędź ikony pinezki z punktem docelowym. Wartości mieszczą się w zakresie od 0 do 1, gdzie 0 oznacza dolną lub lewą krawędź, a 1 — górną lub prawą.

image-allow-overlap​

Pozwala ikonom nakładać się na siebie.

Parametry szczegółów​

Użyj details-text i details-description, aby ustawić nazwę i opis obiektów GeoJSON. Wartość details-text jest wyświetlana jako tytuł, a details-description jako opis. Jeśli obie wartości są puste, dotknięcia obiektu są ignorowane. W tych parametrach można używać wyrażeń.

* {
details-text: eval(tag('name'));
details-description: eval(tag('description'));
}

Wyrażenia​

Filtry i parametry rysowania mogą zależeć od czynników zewnętrznych, być obliczane za pomocą wzorów albo zmieniać się wraz z poziomem powiększenia.

Obliczane wartości muszą zawsze rozpoczynać się od funkcji eval().

Wewnątrz można używać następujących funkcji:

min i max​

Zwracają najmniejszą albo największą wartość spośród parametrów. Liczba parametrów nie jest ograniczona.

any​

Zwraca pierwszą wartość parametrów różną od null. Można przekazać dowolną liczbę argumentów.

data​

Dekoduje ciąg base64. Może być używana przez icon-image i fill-image.

tag​

Zwraca wartość wskazanego znacznika albo null, jeśli znacznik nie istnieje.

locTag​

Zwraca zlokalizowaną wartość znacznika zgodnie z ustawieniami języka użytkownika. Jeśli preferowane języki to na przykład angielski, rosyjski i język ojczysty, locTag('name') sprawdza kolejno name:en, name:ru i name, a następnie używa pierwszej znalezionej wartości. Guru Maps obsługuje be, cs, da, de, en, es, fr, it, ja, ko, nl, pl, ru, sv, uk, zh. Dla tych języków używaj locTag(), a dla pozostałych wywołuj bezpośrednio tag().

cond​

Oblicza wyrażenie logiczne. Jeśli pierwszy argument jest prawdziwy, funkcja zwraca drugi argument; w przeciwnym razie zwraca trzeci.

// sprawdź addr:housenumber
text: eval( cond( tag('addr:housenumber'),
// jeśli istnieje addr:housenumber, dołącz następny warunek
tag('addr:housenumber') . cond( any( locTag('name'), tag('addr:housename') ),
// jeśli istnieje name lub addr:housename, umieść wartość w nawiasach ()
' (' . any( locTag('name'), tag('addr:housename') ) . ')',
// w przeciwnym razie użyj pustego ciągu
''),
// jeśli nie ma housenumber, użyj dowolnej wartości z name lub addr:housename
any( locTag('name'), tag('addr:housename') ) ) );

boolean​

Konwertuje wartość na typ logiczny. Jeśli wartość nie istnieje albo jest równa 0, No, Off lub False (bez rozróżniania wielkości liter), funkcja zwraca false; w przeciwnym razie zwraca true.

zlinear​

Płynnie zmienia wartość wraz ze zmianą powiększenia. Pierwszy parametr to początkowy poziom powiększenia, a po nim podawane są wartości dla kolejnych poziomów.

line|z13-[highway=residential] {
width: eval( zlinear( 13, 1px, 1pt, max(2pt, 4m) ) );
color: @color_small_road;
linecap: round;
}

W tym przykładzie szerokość drogi wynosi 1 piksel na 13. poziomie powiększenia, 1 punkt na poziomie 14., a na poziomie 15. i wyższych — większą z wartości: 2 punkty lub 4 metry.

metric​

Przelicza parametr liczbowy na metry.

line|z12-[highway=tertiary] {
width: eval( zlinear( 12, 1px, 1pt, 1pt, max(3pt, metric(any(tag(lanes),2)*2)) ));
}

W tym przykładzie liczba pasów jest mnożona przez 2, co daje odległość w metrach. max(3pt, metric()) zwraca większą wartość: szerokość w metrach albo szerokość w punktach.

Operatory wyrażeń​

Wyrażenia obsługują operatory matematyczne +, -, *, /, operator łączenia ciągów ., a także operatory porównania <, >, == i ~= (dopasowanie podciągu).