node-mapnik
Bindings to Mapnik for node.
Usage
Render a map from a stylesheet:
var mapnik = require('mapnik');
var fs = require('fs');
mapnik.register_default_fonts();
mapnik.register_default_input_plugins();
var map = new mapnik.Map(256, 256);
map.load('./test/stylesheet.xml', function(err,map) {
if (err) throw err;
map.zoomAll();
var im = new mapnik.Image(256, 256);
map.render(im, function(err,im) {
if (err) throw err;
im.encode('png', function(err,buffer) {
if (err) throw err;
fs.writeFile('map.png',buffer, function(err) {
if (err) throw err;
console.log('saved map image to map.png');
});
});
});
});
Convert a jpeg image to a png:
var mapnik = require('mapnik');
new mapnik.Image.open('input.jpg').save('output.png');
Convert a shapefile to GeoJSON:
var mapnik = require('mapnik');
mapnik.register_datasource(path.join(mapnik.settings.paths.input_plugins,'shape.input'));
var ds = new mapnik.Datasource({type:'shape',file:'test/data/world_merc.shp'});
var featureset = ds.featureset()
var geojson = {
"type": "FeatureCollection",
"features": [
]
}
var feat = featureset.next();
while (feat) {
geojson.features.push(JSON.parse(feat.toJSON()));
feat = featureset.next();
}
fs.writeFileSync("output.geojson",JSON.stringify(geojson,null,2));
For more sample code see the tests and sample code.
Depends
- Node v0.10.x or v0.12.x (v0.12.x support requires node-mapnik >= v3.1.6)
- C++11 compatible C++ runtime library
Troubleshooting
If you hit an error like:
Error: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.18' not found
This means your Linux distributions libstdc++ library is too old (for example you are running Ubuntu Precise rather than Trusty). To work around this upgrade libstdc++:
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
sudo apt-get update -q
sudo apt-get install -y libstdc++6
To upgrade libstdc++ on travis (without sudo) you can do:
language: cpp
sudo: false
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- libstdc++6
Installing
Just do:
npm install mapnik@3.x
Note: This will install the latest node-mapnik 3.x series, which is recommended. There is also an 1.x series which maintains API compatibility with Mapnik 2.3.x and 2.2.x and a v0.7.x series which is not recommended unless you need to support Mapnik 2.1 or older.
By default, binaries are provided for:
- 64 bit OS X 10.9, 64 bit Linux (>= Ubuntu Trusty), and 64/32 bit Windows
- several node versions:
On those platforms no external dependencies are needed.
Other platforms will fall back to a source compile: see Source Build for details.
Binaries started being provided at node-mapnik >= 1.4.2 for OSX and Linux and at 1.4.8 for Windows.
Windows specific
NOTE: Windows binaries for the 3.x series require the Visual C++ Redistributable Packages for Visual Studio 2015:
See https://github.com/mapnik/node-mapnik/wiki/WindowsBinaries for more details.
The 1.x series require the Visual C++ Redistributable Packages for Visual Studio 2013:
Source Build
To build from source you need:
- Mapnik >= v3.x
- Protobuf >= 2.3.0 (protoc and libprotobuf-lite)
Install Mapnik using the instructions at: https://github.com/mapnik/mapnik/wiki/Mapnik-Installation
Confirm that the mapnik-config
program is available and on your $PATH.
Then run:
npm install mapnik --build-from-source
Windows specific
Windows builds are maintained in https://github.com/mapbox/windows-builds
Using node-mapnik from your node app
To require node-mapnik as a dependency of another package put in your package.json:
"dependencies" : { "mapnik":"*" } // replace * with a given semver version string
Tests
To run the tests do:
npm test
License
BSD, see LICENSE.txt
3.5.0
This is a major update and reflects a large number of changes added into node-mapnik due to update of the Mapbox Vector Tile Specification. As part of this the mapnik-vector-tile library was updated to 1.0.0
. Therefore, a large number of interfaces changes have taken place around the mapnik.VectorTile
object.
It is important to know that the concept of width
and height
have been removed from mapnik.VectorTile
objects. This is replaced by the concept of tileSize
. While width
and height
were based on the concept of an Image size created from a vector tile, tileSize
is directly related to the extent
as defined in the Layer
of a vector tile. For understanding what the Layer
and extent
is please see the Vector Tile Specification. This also changed the buffer_size
arguments that were commonly used in many Vector Tile methods, which was also based on the Image size. The vector tile object now contains a bufferSize
which represents the buffer added to the layer extent in a tile.
Internally, all methods now depend on V2 tiles, however, any V1 tiles that are loaded into a mapnik.VectorTile
object will automatically be updated.
Summary of changes:
mapnik.VectorTile.addData
now verifies buffers validity and internally updates v1 tiles to v2mapnik.VectorTile.addDataSync
now verifies buffers validity and internally updates v1 tiles to v2mapnik.VectorTile.setData
now verifies buffers validity and internally updates v1 tiles to v2mapnik.VectorTile.setDataSync
now verifies buffers validity and internally updates v1 tiles to v2mapnik.VectorTile.addImage
now takes a mapnik.Image
object rather then a buffer, it also takes optional arguments image_scaling and image_format.mapnik.VectorTile.addImageBuffer
replaces the old functionality of of mapnik.VectorTile.addImage
- Added
mapnik.VectorTile.addImageSync
and made mapnik.VectorTile.addImage
accept a callback. - Added
mapnik.VectorTile.addImageBufferSync
and made mapnik.VectorTile.addImageBuffer
accept a callback. mapnik.VectorTile.height()
method is removedmapnik.VectorTile.width()
method is removedmapnik.VectorTile.parse()
method is removedmapnik.VectorTile.IsSolid()
method is removedmapnik.shutdown()
is removed- Removed the dependency on libprotobuf library
- Lowered memory requirements for vector tile creation and vector tile operations.
- Duplicate layer names in
mapnik.VectorTile
objects are no longer permitted. - Added new
mapnik.VectorTile.extent()
method which returns the bounding box of a tile in EPSG:3857 - Added new
mapnik.VectorTile.bufferedExtent()
method which returns the bounding box including buffer of a tile in EPSG:3857 - Added new
mapnik.VectorTile.emptyLayers()
method which returns the name of layers which were not added to a tile during any tile rendering operation. - Added new
mapnik.VectorTile.paintedLayers()
method which returns the name of layers which were considered painted during rendering or layers that contain data. - Added new
mapnik.VetorTile.tileSize
property. - Added new
mapnik.VetorTile.bufferSize
property. - Updated many of the default configuration options on
mapnik.VectorTile
class methods - Removed the concept of
path_multiplier
from the code entirely. - Added optional arguments of
tile_size
and buffer_size
to mapnik.VectorTile
constructor.