Skjölun / kortasýn / Breyta stíl korts

Breyta stíl korts

Pakki sem beitir lýsandi reglum á vegstíl kortsins, svo sem „gera vegi hvíta“, „fela merkingar“ og „gera vatnsför dökk“. Sömu reglur virka óbreyttar á Android og iOS.

REACT
@mapconductor/js-vectorstyle
PROP
mapStyle
ESM / CJS
Aðeins ESM

01 · Yfirlit

Reglur eru runa af pörum: „á hvaða lag (val“ og „hvað skal gera (bót“. Valið er skrifað eftir hlutverki (vegur, vatnsför, merkingar …), ekki eftir lagakenni. Skemurnar OpenMapTiles, Shortbread og Mapbox Streets greinast sjálfkrafa, svo þú þarft ekki að rannsaka ólík lagakenni fyrir hvern stíl.

Gildið sem createVectorStyle() skilar er sent sem mapStyle til hvaða *MapView sem er. Í React heitir eiginleikinn mapStyle því style er CSS á eiginlega hlutnum (á Android og iOS heitir hann style).

Kort
Hvernig það virkar
Það sem þarf
MapLibre / Mapbox / MapTiler
Kortið sjálft les stílinn. Þegar reglum er breytt er aðeins beitt mismuninum og flísar eru ekki lesnar aftur.
Aðeins þennan pakka
Aðrar (Google Maps, Leaflet, OpenLayers, ArcGIS, Cesium, HERE, MapKit, deck.gl …)
Teiknar stílinn á rasterflís og leggur ofan á.
VectorTileRasteriser fyrir rasteriser

Ef þú sendir stílinn til korts sem styður ekki vektora án þess að gefa upp rasteriser birtist greiningarathugasemd „þennan stíl er ekki hægt að nota“ í stað þess að það gerist ekkert og ekki er teiknað neitt.

02 · Uppsetning

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

Ef þú vilt nota þetta líka á kort sem styður ekki vektora skaltu einnig setja upp react-vectortile sem inniheldur rasteriserinn (þá þarf líka að undirbúa Service Worker fyrir vektorflíslagið).

terminalnpm
npm install @mapconductor/react-vectortile

Aðeins ESM. Regluvinnslan er wasm (um 190 KB) og er lesin afstætt við import.meta.url. Hún virkar óbreytt með Vite. Ef þú dreifir henni frá öðrum stað skaltu tilgreina slóðina með wasmUrl.

03 · Grunnotaðin

Ef document er sleppt, er stílinum sem kortið teiknar núna ('currentDesign') stillt. Dæmið hér að neðan gerir sjálfgefna hönnun MapLibre að svarthvítu korti þar sem aðeins vegir eru sýnilegir.

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)}
    />
  );
}

Þegar þitt eigið stíll er notaður, skal senda { url } eða { text } í document.

04 · Hvernig reglur eru skrifaðar

Reglur eru metnar ofan frá og niður, og eins og í CSS vinnur sá síðari í hverju atriði. Það er best að byrja á að setja allt með all og svo yfirskrifa eftir hlutverki.

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 });
});
Selector
Byggari
Lýsing
all
r.all(patch)
Öll lög.
{ role }
r.role(LayerRole.road, patch)
Hlutverk. background・water・waterway・land・landuse・park・building・road・road-casing・rail・transit・boundary・aeroway・label・poi.
{ layerId }
r.layerId('poi-*', patch)
Kenni lags. * og ? má nota.
{ sourceLayer }
r.sourceLayer('water', patch)
Nafn source-layer flísarinnar.
{ kind }
r.kind('symbol', patch)
Gerð lags. background・fill・line・circle・symbol・other.
anyOf / allOf / not
r.where(selector, patch)
Sameining.
Bót
Gerð
Lýsing
visible
boolean
Sýnileiki — kveikt eða slökkt.
color
string
Litur sem passar við gerð lagsins (fylling, lína, texti og tákn, bakgrunnur).
colorFilter
{ desaturate } | { darken } | { lighten } | { invertLightness } | { mix }
Umbreyting á upprunalega litnum.
opacity
0–1
Ógagnsæi.
widthScale
number
Margfaldari fyrir línubreidd og radíus hringja.
filter
Segðir MapLibre
Skipta út síunni í laginu.
minZoom / maxZoom
number
Bil zoom-stiga sem sýndur er.
properties
Record<string, unknown>
Eiginleikar stíls مشخصarerinnar beint eftir nafni. Tekur síðast.

Halda reglum í JSON

Reglurnar eru einnig JSON-skjal. Þegar þær eru sendar frá þjóni eða geymdar yfir útgáfur forritsins, skal halda þeim á þessu formi og lesa með parseStyleRules(). Sama skjal er lesanlegt á Android og iOS.

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 · Nota á kortum án stuðnings við vigrar

Ef VectorTileRasteriser er sent sem rasteriser, er stíllinn teiknaður á raster-flísar og lagður ofan á. Kortið frá veitanum sjálfum er fjarlægt með því að stilla á None hönnunina.

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 }} />
VARÚÐ
Rasteriserinn er borninn saman sem samsemd. Ef new er notað við hverja teikningu er það talið annar stíll og kortið er endurgerð í hvert skipti. Haldið einu eintaki til, til dæmis með useMemo.

06 · Helstu valkostir

Valkostur
Sjálfgefið gildi
Lýsing
document
'currentDesign'
Stíllinn sem stilltur er. { url, headers? }・{ text }・'currentDesign'.
rules
—
Regla til að beita. Ef NO_STYLE_RULES verður sú upprunalega óbreytt.
rasteriser
—
Hugbúnaður til að teikna á kort sem styður ekki vektora.
onUnsupported
'report'
Þegar kortið tekur ekki við mismun. Ef 'reload' er gefið er heildarstjórnaða skjalið sent (rétt en þungt).
onDiagnostics
—
Fjöldi laga sem fingu reglu, reglur sem ekku áttu við, og breytingar sem kortið hafnaði.
wasmUrl
—
Staðsetning wasm-þýðandans.

Greiningar er einnig hægt að fá í gegnum onStyleDiagnostics í *MapView. Ef það er sleppt birtast þær í stjórnborðinu. „Reglur sem ekku áttu við“ sést varla í útlitinu — þar á himni virðist allt „virka að mestu“ — svo það er mælt með því að hafa þær sýnilegar meðan þú þróar.

Tengdar síður