Skip to content
Grafana Panels Docs

Maps

generateLeafletMap(id, config, useCases) rendert Leaflet-Karten mit Usecase-Layern, Popups, Marker-Icons, Custom Image Overlays und Positionsbearbeitung.

PfadRequiredTypDefaultBeschreibung
general.worldCopyJumpNeinbooleanfalseErlaubt Weltkarten-Umbruch am Rand.
general.doubleClickZoomNeinbooleantrueZoom bei Doppelklick.
general.zoomSnapNeinnumber1Schrittweite der Zoomstufen.
general.minZoomNeinnumber3Minimaler Zoom.
general.maxZoomNeinnumber22Maximaler Zoom.
display.showStreetMapNeinbooleanfalseAktiviert Mapbox Street/Satellite/Combined Base-Layer.
display.showInitLayerBedingt'Streets' | 'Satellite' | 'Combined'StreetsInitialer Base-Layer, wenn showStreetMap aktiv ist.
display.showInitOverlayNein'all' | string | string[]-Initial sichtbare Usecase-Overlays.
display.showSimpleCustomImageNeinbooleanfalseZeigt ein nicht rotiertes Custom Image Overlay.
display.showRotatedCustomImageNeinbooleanfalseZeigt ein rotiertes Custom Image Overlay.
display.imageUrlBedingtstring-URL des Custom Image Overlays.
rotation.isRotatedNeinbooleanfalseAktiviert Kartenrotation.
rotation.rotateBearingNeinnumber0Rotationswinkel.
rotation.customRotateImageBoundsBedingt{ topLeft: [number, number]; topRight: [number, number]; bottomLeft: [number, number] }-Drei Punkte für rotiertes Image Overlay.
bounds.hasFixedBoundsNeinbooleanfalseErzwingt feste Kartenbegrenzung.
bounds.fixedBoundsBedingt{ top: number; right: number; bottom: number; left: number }-Feste Bounds.
bounds.centerZoomNein{ center: [number, number]; zoom: number }{ center: [48.208, 16.372], zoom: 12 }Startposition und Zoom.
bounds.defaultPosNein[number, number][48.208, 16.372]Fallback-Position für Marker ohne Koordinaten.
bounds.customSimpleImageBoundsBedingt{ top: number; right: number; bottom: number; left: number }-Bounds für einfaches Image Overlay.
interaction.lockScrollWheelZoomNeinbooleanfalseScrollrad-Zoom erst bei Kartenfokus.
interaction.showCoorOnClickNeinbooleanfalseZeigt Koordinaten bei Kartenklick.
interaction.allowEditPositionNeinbooleanfalseMarker per Drag oder Eingabe verschiebbar.
interaction.hideMarkerPositionContainerNeinbooleanfalseVerbirgt Positions-Eingaben.
interaction.serialInputNeinbooleantrueZeigt Seriennummer-Feld in Positionssteuerung.
marker.ignoreAppColorNeinbooleanfalseIgnoriert app_color und nutzt Defaultfarbe.
marker.ignoreAppBlinkingNeinbooleanfalseIgnoriert app_blinking.
marker.showDetailsInPopupNeinbooleantrueZeigt Details-Link im Popup.
marker.sortUsecasesNeinbooleanfalseSortiert Usecases alphabetisch, sofern forcePosition nicht greift.
marker.extraHtmlNein'fieldtester' | 'tracking' | falsefalseExtra-Legende unten links.
marker.forceLayerControlNein'default' | 'show' | 'hide'defaultSteuert, ob die Layer-Control aufgeklappt ist.
marker.allowSpiderfyNeinbooleanfalseAktiviert OverlappingMarkerSpiderfier.
marker.showAllMarkerAtDefaultPosNeinbooleanfalseSetzt fehlende Markerpositionen auf defaultPos.
other.extraZoomOutNeinbooleanfalseZoomt beim Fitten der Bounds eine Stufe heraus.
other.showAllMarkerInboundNeinbooleanfalsePasst die View initial an alle Marker an.
PfadRequiredTypDefaultBeschreibung
useCases[].varGrafJastring-Grafana-Variable mit Mapdaten, getrennt durch §.
useCases[].nameNeinstringDeviceUsecase-Name für Layer und Legende.
useCases[].iconNeinstringHole_WhiteMarker-Icon vom Fileserver.
useCases[].showIconInLegendNeinbooleanfalseZeigt Icon in Layer-Legende.
useCases[].forcePositionNeinnumber-Erzwingt Sortierposition in der Legende.
useCases[].popupNein(el) => string-Custom HTML für Marker-Popup.
useCases[].structureNeinstring[]-Benennung zusätzlicher Werte nach den Basisattributen.
useCases[].polygonNeinboolean-Rendert Polyline-Daten statt Marker.
useCases[].options.circleNein(el) => false | LeafletPathOptions & { radius: string | number }-Kreis um Marker. Muss radius liefern.
useCases[].options.hideMarkerNeinboolean | (el) => boolean-Unterdrückt Marker je Sensor.
useCases[].options.multiplePositionsNein(el) => Array<{ lat: string | number; lng: string | number }>-Zusätzliche Markerpositionen für denselben Sensor.
useCases[].options.multipleDevicesNein{ structure: string[]; key: string | ((el) => string) }-Parst mehrere Devices aus einem $-getrennten Wert.

Die Runtime erwartet die Basisattribute in dieser Reihenfolge:

  1. deviceid
  2. serial
  3. posY
  4. posX
  5. devicetype
  6. timestamp
  7. status
  8. offline_status
  9. app_color
  10. app_blinking
  11. isGPS

Zusatzwerte werden über useCases[].structure benannt und in el.data abgelegt.

var config = {
  general: {
    worldCopyJump: true,
    doubleClickZoom: false,
    zoomSnap: 0.5,
    minZoom: 5,
    maxZoom: 19,
  },
};

display: Streets, Satellite und initiale Overlays

Section titled “display: Streets, Satellite und initiale Overlays”
var config = {
  display: {
    showStreetMap: true,
    showInitLayer: 'Satellite',
    showInitOverlay: ['Temperatur', 'Gateway'],
  },
};

bounds: Startposition und feste Kartenbegrenzung

Section titled “bounds: Startposition und feste Kartenbegrenzung”
var config = {
  bounds: {
    centerZoom: {
      center: [48.208, 16.372],
      zoom: 13,
    },
    hasFixedBounds: true,
    fixedBounds: {
      top: 48.3,
      right: 16.6,
      bottom: 48.1,
      left: 16.1,
    },
  },
};
var config = {
  interaction: {
    allowEditPosition: true,
    serialInput: true,
    lockScrollWheelZoom: true,
    showCoorOnClick: true,
  },
};

marker: Details, Zusatzlegende und Spiderfy

Section titled “marker: Details, Zusatzlegende und Spiderfy”
var config = {
  marker: {
    showDetailsInPopup: true,
    extraHtml: 'fieldtester',
    forceLayerControl: 'show',
    allowSpiderfy: true,
  },
};
var config = {
  display: {
    showSimpleCustomImage: true,
    imageUrl: 'https://example.com/floorplan.png',
  },
  bounds: {
    customSimpleImageBounds: {
      top: 48.3,
      right: 16.6,
      bottom: 48.1,
      left: 16.1,
    },
  },
};
var config = {
  display: {
    showStreetMap: true,
    showInitLayer: 'Streets',
  },
};
var useCases = [{ name: 'Device', icon: 'Temperature', varGraf: '${mapdata_devices}' }];
generateLeafletMap('device_map', config, useCases);
var useCases = [
  {
    name: 'Temperature',
    icon: 'Temperature',
    structure: ['installation_place', 'threshold_high'],
    popup: (el) => 'Ort: ' + el.data.installation_place + '<br>High: ' + el.data.threshold_high,
    varGraf: '${mapdata_devices}',
  },
];
var useCases = [
  {
    name: 'BLE Tracker',
    icon: 'Tracking',
    structure: ['tracker_status', 'ble_distance'],
    options: {
      hideMarker: (el) => el.data.tracker_status !== 'ble',
      circle: (el) => ({
        radius: el.data.ble_distance,
        color: 'blue',
        fillOpacity: 0.1,
      }),
    },
    varGraf: '${mapdata_devices}',
  },
];
var useCases = [
  {
    name: 'Tracking',
    icon: 'Tracking',
    structure: ['lat_2', 'lng_2'],
    options: {
      multiplePositions: (el) => [
        {
          lat: el.data.lat_2,
          lng: el.data.lng_2,
        },
      ],
    },
    varGraf: '${mapdata_devices}',
  },
];