![require(esm) Backported to Node.js 20, Paving the Way for ESM-Only Packages](https://cdn.sanity.io/images/cgdhsj6q/production/be8ab80c8efa5907bc341c6fefe9aa20d239d890-1600x1097.png?w=400&fit=max&auto=format)
Security News
require(esm) Backported to Node.js 20, Paving the Way for ESM-Only Packages
require(esm) backported to Node.js 20, easing the transition to ESM-only packages and reducing complexity for developers as Node 18 nears end-of-life.
leaflet-pixi-overlay
Advanced tools
An overlay class for Leaflet, a JS library for interactive maps. Allows drawing overlay using Pixi.js, a JavaScript library for drawing using WebGL that seamlessly falls back to HTML5's canvas if needed. Thanks to Leaflet.D3SvgOverlay for inspiration.
Supports leaflet@0.7, 1 and pixi.js@4, 5, 6, 7
A very basic demo (pixi.js@7) .
Largest US cities (pixi.js@7, 1000 animated markers).
French cities (pixi.js@7, 36700 animated markers).
Rotating markers with constant size during zoom
French presidential 2017 election results: first round and second round (36000 polygons).
French legislative 2017 election results: first round and second round (36000 polygons).
(graph-draw is used to display boundaries in the election demos when rendered in WebGL)
Leaflet.PixiOverlay is available as a npm package:
npm install leaflet-pixi-overlay
or can be included in a page with jsDelivr CDN.
Include Pixi.js and the PixiOverlay libraries:
<script src="pixi.min.js"></script>
<script src="L.PixiOverlay.min.js"></script>
Create a map:
const map = L.map(...);
Create an overlay:
const pixiOverlay = L.pixiOverlay((utils) => {
// your drawing code here
}, new PIXI.Container());
Add it to the map:
pixiOverlay.addTo(map);
const markerTexture = await PIXI.Assets.load('img/marker-icon.png');
const markerLatLng = [51.5, -0.09];
const marker = new PIXI.Sprite(markerTexture);
marker.anchor.set(0.5, 1);
const pixiContainer = new PIXI.Container();
pixiContainer.addChild(marker);
let firstDraw = true;
let prevZoom;
const pixiOverlay = L.pixiOverlay((utils) => {
const zoom = utils.getMap().getZoom();
const container = utils.getContainer();
const renderer = utils.getRenderer();
const project = utils.latLngToLayerPoint;
const scale = utils.getScale();
if (firstDraw) {
const markerCoords = project(markerLatLng);
marker.x = markerCoords.x;
marker.y = markerCoords.y;
}
if (firstDraw || prevZoom !== zoom) {
marker.scale.set(1 / scale);
}
firstDraw = false;
prevZoom = zoom;
renderer.render(container);
}, pixiContainer);
pixiOverlay.addTo(map);
const polygonLatLngs = [
[51.509, -0.08],
[51.503, -0.06],
[51.51, -0.047],
[51.509, -0.08]
];
let projectedPolygon;
const triangle = new PIXI.Graphics();
const pixiContainer = new PIXI.Container();
pixiContainer.addChild(triangle);
let firstDraw = true;
let prevZoom;
const pixiOverlay = L.pixiOverlay((utils) => {
const zoom = utils.getMap().getZoom();
const container = utils.getContainer();
const renderer = utils.getRenderer();
const project = utils.latLngToLayerPoint;
const scale = utils.getScale();
if (firstDraw) {
projectedPolygon = polygonLatLngs.map((coords) => project(coords));
}
if (firstDraw || prevZoom !== zoom) {
triangle.clear();
triangle.lineStyle(3 / scale, 0x3388ff, 1);
triangle.beginFill(0x3388ff, 0.2);
projectedPolygon.forEach((coords, index) => {
if (index == 0) triangle.moveTo(coords.x, coords.y);
else triangle.lineTo(coords.x, coords.y);
});
triangle.endFill();
}
firstDraw = false;
prevZoom = zoom;
renderer.render(container);
}, pixiContainer);
pixiOverlay.addTo(map);
L.pixiOverlay(<function> drawCallback, <PIXI.Container> container, <options> options?)
drawCallback
- callback to draw/update overlay contents.container
- a Pixi container (a subclass of PIXI.Container
).options
- overlay options object.Drawing callback function
drawCallback(utils, eventOrCustomData)
utils
- helper object. Contains methods to work with layers coordinate system and scaling.eventOrCustomData
- Contains either the Leaflet event that causes the redraw (moveend
event) or a plain object {type: 'add'}
when the pixi layer is added to the map or the argument of a redraw
call.Overlay options object
available fields:
padding
- (number; defaults to 0.1
) How much to extend the drawing area around the map view (relative to its size).forceCanvas
- (bool; defaults to false
) Force use of a 2d-canvas for rendering.doubleBuffering
- (bool; default to false
) Activate double buffering to prevent flickering when refreshing display on some devices (especially iOS devices). This field is ignored if rendering is done with 2d-canvas.resolution
- (number; defaults to 2
on retina devices and 1
elsewhere) Resolution of the renderer.projectionZoom
- (function(map): Number; defaults to function that returns the average of map.getMinZoom()
and map.getMaxZoom()
if the latter is finite else it returns map.getMinZoom() + 8
) returns the projection zoom level. Customizing this option can help if you experience visual artifacts.pane
- (string; defaults to 'overlayPane'
) The Leaflet pane where the overlay container is inserted.destroyInteractionManager
- (bool; defaults to false
) Destroy PIXI EventSystem. This is useful when you do not need to use PIXI interaction.autoPreventDefault
- (bool; defaults to true
) Customize PIXI EventSystem autoPreventDefault
property. This option is ignored if destroyInteractionManager
is true
. This should be set to false
in most situations to let all dom events flow from PIXI to leaflet but it is set by default for compatibility reason.preserveDrawingBuffer
- (bool; defaults to false
) Enables drawing buffer preservation, enable this if you need to call toDataUrl on the webgl context.clearBeforeRender
- (bool; defaults to true
) This sets if the renderer will clear the canvas or not before the new render pass.shouldRedrawOnMove
- (function(e: moveEvent): Boolean; defaults to function () {return false;}
) Move events trigger a redraw when this function returns true
. For example using function (e) {return e.flyTo || e.pinch;}
will trigger redraws during flyTo
animation and pinch zooms.Utils object
available methods:
latLngToLayerPoint(latLng, zoom?)
- (function) returns L.Point
projected from L.LatLng
in the coordinate system of the overlay.layerPointToLatLng(point, zoom?)
- (function) returns L.LatLng
projected back from L.Point
into the original CRS.getScale(zoom?)
- (function) return the current scale factor of the overlay or the scale factor associated to zoom value.getRenderer()
- (function) return the current PIXI renderer.getContainer()
- (function) return the PIXI container used in the overlay.getMap()
- (function) return the current map.redraw(data)
- (function) trigger a refresh of the layer. data
is passed as second argument of drawCallback
function. This is useful for example when you modify something in the container
or if you want to animate using PIXI.ticker.Ticker
.
destroy()
- (function) remove the layer from the map and destroy the underlying renderer. A destroyed layer is not usable anymore.
destroy
methodprojectionZoom
functionshouldRedrawOnMove
option to enable it.)preserveDrawingBuffer
and clearBeforeRender
optionsdoubleBuffering
is enableddrawCallback
, improving control over redraw logicredraw
calls (performance improvement)redraw
methoddoubleBuffering
option to get rid of flickering on iOS devicesThis code is provided under the MIT License (MIT).
FAQs
Leaflet Plugin: Pixi.js Overlay
The npm package leaflet-pixi-overlay receives a total of 8 weekly downloads. As such, leaflet-pixi-overlay popularity was classified as not popular.
We found that leaflet-pixi-overlay demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
require(esm) backported to Node.js 20, easing the transition to ESM-only packages and reducing complexity for developers as Node 18 nears end-of-life.
Security News
PyPI now supports iOS and Android wheels, making it easier for Python developers to distribute mobile packages.
Security News
Create React App is officially deprecated due to React 19 issues and lack of maintenance—developers should switch to Vite or other modern alternatives.