Dokumentation / Kartenansicht / Den Kartenstil ändern

Den Kartenstil ändern

Ein Paket, das Anpassungen wie „Straßen weiß machen“, „Beschriftungen ausblenden“, „Wasserflächen abdunkeln“ am Vektorstil der Karte deklarativ als Regeln anwendet. Dieselben Regeln funktionieren unverändert auch unter Android und iOS.

REACT
@mapconductor/js-vectorstyle
PROP
mapStyle
ESM / CJS
Nur ESM

01 · Überblick

Regeln sind eine Folge von Paaren aus „welcher Layer (Selektor)“ und „was zu tun ist (Patch)“. Selektoren können nicht über Layer-IDs, sondern über Rollen (Straßen, Wasserflächen, Beschriftungen …) geschrieben werden. Die Schemata von OpenMapTiles, Shortbread und Mapbox Streets werden automatisch erkannt, sodass Sie für jeden Stil keine unterschiedlichen Layer-IDs nachschlagen müssen.

Den von createVectorStyle() zurückgegebenen Wert übergeben Sie an jede beliebige *MapView als mapStyle. In React heißt er mapStyle, weil style das CSS des Elements selbst ist (unter Android und iOS: style).

Karte
Wie es wirkt
Voraussetzungen
MapLibre / Mapbox / MapTiler
Die Karte liest den Stil selbst. Bei Regeländerungen wird nur der Unterschied angewendet, die Kacheln werden nicht neu geladen.
Nur dieses Paket
Andere (Google Maps, Leaflet, OpenLayers, ArcGIS, Cesium, HERE, MapKit, deck.gl …)
Der Stil wird in Rasterkacheln gezeichnet und darübergelegt.
rasteriser mit einem VectorTileRasteriser

Übergibt man den Stil ohne Rasterizer an eine Karte ohne Vektorunterstützung, erscheint nicht stumm nichts, sondern in der Diagnose der Hinweis „Dieser Stil ist nicht verwendbar“.

02 · Installation

terminalnpm
npm install @mapconductor/js-sdk-core @mapconductor/js-vectorstyle

Wenn Sie ihn auch auf Karten ohne Vektorunterstützung verwenden möchten, installieren Sie zusätzlich react-vectortile mit dem Rasterizer (auch die Vorbereitung des Service Workers des Vektorkachel-Layers ist erforderlich).

terminalnpm
npm install @mapconductor/react-vectortile

Nur ESM. Der Regel-Compiler ist ein wasm (ca. 190 KB) und wird relativ zu import.meta.url geladen. Mit Vite funktioniert es ohne weiteres. Wird er von einem anderen Ort ausgeliefert, geben Sie dies mit wasmUrl an.

03 · Grundlegende Verwendung

Lässt man document weg, wird der Stil angepasst, den die Karte gerade zeichnet ('currentDesign'). Das folgende Beispiel macht das Standarddesign von MapLibre zu einer schwarz-weißen Karte, auf der nur Straßen sichtbar sind.

RoadsOnlyMap.tsxTypeScript · React
import { useMemo } from 'react';
import { buildStyleRules, createVectorStyle, LayerRole } from '@mapconductor/js-vectorstyle';
import { MapLibreMapView2D, useMapLibreViewState } from '@mapconductor/react-for-maplibre';

export function RoadsOnlyMap() {
  const state = useMapLibreViewState();
  const mapStyle = useMemo(
    () => createVectorStyle({
      rules: buildStyleRules((r) => {
        r.all({ color: '#000000' });
        r.role(LayerRole.label, { visible: false });
        r.role(LayerRole.roadCasing, { color: '#303030' });
        r.role(LayerRole.road, { color: '#ffffff', widthScale: 1.4 });
      }),
    }),
    [],
  );

  return (
    <MapLibreMapView2D
      state={state}
      mapStyle={mapStyle}
      onStyleDiagnostics={(messages) => console.warn(messages)}
    />
  );
}

Bei Verwendung eines eigenen Stils übergeben Sie { url } oder { text } an document.

04 · Regeln schreiben

Regeln werden von oben nach unten angewendet; wie bei CSS gewinnt bei jedem Punkt die spätere Regel. Grundprinzip: Zuerst mit all das Gesamte festlegen und dann rollenweise überschreiben.

TypeScriptTypeScript
buildStyleRules((r) => {
  r.all({ colorFilter: { darken: 0.55 } });
  r.role(LayerRole.water, { color: 'rgb(10,28,43)' });
  r.role(LayerRole.road, { color: '#d0d0d0' });
  r.layerId('poi-*', { visible: false });
  r.kind('symbol', { opacity: 0.8 });
});
Selektor
Builder
Beschreibung
all
r.all(patch)
Alle Layer.
{ role }
r.role(LayerRole.road, patch)
Rolle. background・water・waterway・land・landuse・park・building・road・road-casing・rail・transit・boundary・aeroway・label・poi.
{ layerId }
r.layerId('poi-*', patch)
Layer-ID. * und ? können verwendet werden.
{ sourceLayer }
r.sourceLayer('water', patch)
Name des source-layer des Tiles.
{ kind }
r.kind('symbol', patch)
Typ des Layers. background・fill・line・circle・symbol・other.
anyOf / allOf / not
r.where(selector, patch)
Kombinationen.
Patch
Typ
Beschreibung
visible
boolean
Sichtbarkeit ein/aus.
color
string
Farbe passend zum Layertyp (Füllung, Linie, Text und Icons, Hintergrund).
colorFilter
{ desaturate } | { darken } | { lighten } | { invertLightness } | { mix }
Transformation der Originalfarbe.
opacity
0–1
Deckkraft.
widthScale
number
Multiplikator für Linienbreite und Kreisradius.
filter
MapLibre-Ausdrücke
Ersetzt den Filter des Layers.
minZoom / maxZoom
number
Zoombereich, in dem angezeigt wird.
properties
Record<string, unknown>
Direkt über den Namen einer Eigenschaft der Stilspezifikation. Wird zuletzt angewendet.

Regeln als JSON halten

Regeln sind auch ein JSON-Dokument. Wenn Sie sie vom Server ausliefern oder über App-Versionen hinweg speichern wollen, halten Sie sie in dieser Form und lesen sie mit parseStyleRules() ein. Dasselbe Dokument lässt sich auch unter Android und iOS lesen.

night.rules.jsonJSON
{
  "schemaVersion": 1,
  "rules": [
    { "selector": "all", "patch": { "colorFilter": { "darken": 0.55 } } },
    { "selector": { "role": "water" }, "patch": { "color": "rgb(10,28,43)" } }
  ]
}
TypeScriptTypeScript
import { createVectorStyle, parseStyleRules } from '@mapconductor/js-vectorstyle';

const rules = parseStyleRules(await (await fetch('/night.rules.json')).text());
const mapStyle = createVectorStyle({ rules });

05 · Verwendung mit Karten ohne Vektorunterstützung

Übergibt man einen VectorTileRasteriser an rasteriser, wird der Stil auf Rasterkacheln gezeichnet und darübergelegt. Die eigene Karte des Providers wird auf das Design None gesetzt und damit ausgeblendet.

TypeScriptTypeScript · React
import { useMemo } from 'react';
import { createVectorStyle } from '@mapconductor/js-vectorstyle';
import { VectorTileRasteriser } from '@mapconductor/react-vectortile';
import { GoogleMapDesign, GoogleMapView2D, useGoogleMapViewState } from '@mapconductor/react-for-googlemaps';

const state = useGoogleMapViewState({
  apiKey: import.meta.env.VITE_GOOGLE_MAPS_API_KEY,
  mapDesignType: GoogleMapDesign.None,
});
const rasteriser = useMemo(() => new VectorTileRasteriser(), []);
const mapStyle = useMemo(
  () => createVectorStyle({
    document: { url: 'https://tiles.versatiles.org/assets/styles/colorful/style.json' },
    rules,
    rasteriser,
  }),
  [rules, rasteriser],
);

<GoogleMapView2D state={state} mapStyle={mapStyle} style={{ height: 480 }} />
ACHTUNG
Der Rasterizer vergleicht über Identität. Bei jedem Zeichnen new aufzurufen gilt als anderer Stil, und die Karte wird jedes Mal neu erstellt. Halten Sie eine Instanz z. B. mit useMemo erhalten.

06 · Wichtige Optionen

Option
Standardwert
Beschreibung
document
'currentDesign'
Der anzupassende Stil. { url, headers? }・{ text }・'currentDesign'.
rules
—
anzuwendende Regel. Bei NO_STYLE_RULES bleibt das Original unverändert.
rasteriser
—
Zum Zeichnen auf Karten ohne Vektorunterstützung.
onUnsupported
'report'
Wenn die Karte keine Differenzen annimmt. Bei 'reload' wird das angepasste Dokument als Ganzes übergeben (korrekt, aber schwer).
onDiagnostics
—
Die Anzahl der getroffenen Layer, die Regeln, die auf nichts trafen, und die Anpassungen, die die Karte abgelehnt hat.
wasmUrl
—
Der Speicherort des wasm des Compilers.

Diagnosen können auch über onStyleDiagnostics der *MapView empfangen werden. Fehlt dies, erscheinen sie in der Konsole. Bei „Regeln, die auf nichts trafen“ sieht man am Endergebnis nur, dass „fast alles wirkt“, deshalb empfiehlt es sich, sie während der Entwicklung sichtbar auszugeben.

Verwandte Seiten