Skip to content

Instantly share code, notes, and snippets.

@rochoa
Last active May 16, 2017 14:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rochoa/6e3da02259ff61acddccd3a3a04d5bd4 to your computer and use it in GitHub Desktop.
Save rochoa/6e3da02259ff61acddccd3a3a04d5bd4 to your computer and use it in GitHub Desktop.
node-mapnik variables not used in Grids
result.*
node_modules/

Requirements

We are gonna use a Postgis datasource to check variables propagation. To run the scripts we expect:

  • A PostgreSQL database available as postgresql://postgres@localhost:5432/postgres, with PostGIS.

Install

npm install

Test scripts

It's possible to use variables with mapnik.Image, check with:

node test-image.js

However, it's not possible to use them with mapnik.Grid, check with:

node test-grid.js
{
"private": true,
"name": "node-mapnik-grid-variables",
"version": "1.0.0",
"description": "",
"main": "test-grid.js",
"dependencies": {
"mapnik": "^3.6.0"
}
}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Map[]>
<Map srs="+init=epsg:3857" maximum-extent="-20037508.3,-20037508.3,20037508.3,20037508.3">
<Parameters>
<Parameter name="maximum-extent"><![CDATA[-20037508.3,-20037508.3,20037508.3,20037508.3]]></Parameter>
<Parameter name="format">png8:m=h</Parameter>
<Parameter name="interactivity_layer">basic</Parameter>
<Parameter name="interactivity_fields">id,size</Parameter>
</Parameters>
<Style name="basic" filter-mode="first">
<Rule>
<MarkersSymbolizer width="10 * [size]" fill="#ff0000" fill-opacity="0.9" allow-overlap="true" stroke-width="0" stroke="#ffffff" stroke-opacity="1" comp-op="multiply" clip="true" />
</Rule>
</Style>
<Layer name="basic"
srs="+init=epsg:3857">
<StyleName>basic</StyleName>
<Datasource>
<Parameter name="type"><![CDATA[postgis]]></Parameter>
<Parameter name="host"><![CDATA[localhost]]></Parameter>
<Parameter name="port"><![CDATA[5432]]></Parameter>
<Parameter name="user"><![CDATA[postgres]]></Parameter>
<Parameter name="password"></Parameter>
<Parameter name="dbname"><![CDATA[postgres]]></Parameter>
<Parameter name="geometry_field"><![CDATA[the_geom_webmercator]]></Parameter>
<Parameter name="srid"><![CDATA[3857]]></Parameter>
<Parameter name="table"><![CDATA[(SELECT i AS id, ST_SetSRID(ST_MakePoint(i*1000000,0), 3857) AS the_geom_webmercator, @size AS size FROM generate_series(1,5) as i) as _query]]></Parameter>
<Parameter name="extent"><![CDATA[-20037508.3,-20037508.3,20037508.3,20037508.3]]></Parameter>
<Parameter name="simplify_geometries"><![CDATA[false]]></Parameter>
<Parameter name="row_limit"><![CDATA[0]]></Parameter>
<Parameter name="persist_connection"><![CDATA[false]]></Parameter>
<Parameter name="twkb_encoding"><![CDATA[true]]></Parameter>
</Datasource>
</Layer>
</Map>
'use strict';
var mapnik = require('mapnik');
var fs = require('fs');
var assert = require('assert');
mapnik.register_default_fonts();
mapnik.register_default_input_plugins();
var map = new mapnik.Map(256, 256);
var size = 10;
map.load('./postgis-variables.xml', function(err, map) {
assert.ifError(err);
map.zoomAll();
var grid = new mapnik.Grid(256, 256);
map.render(grid, { layer: 0, fields: ['id', 'size'], variables: { size: size } }, function(err, grid) {
assert.ifError(err);
grid.encode({format: 'utf'}, function(err, result) {
assert.ifError(err);
var keys = Object.keys(result.data).filter(function(k) { return k !== ''; });
assert.equal(keys.length, 5);
keys.forEach(function(k) {
assert.equal(result.data[k].size, size);
});
fs.writeFile('result.grid.json', JSON.stringify(result, null, 4), 'utf-8');
});
});
});
'use strict';
var mapnik = require('mapnik');
var fs = require('fs');
var assert = require('assert');
mapnik.register_default_fonts();
mapnik.register_default_input_plugins();
var map = new mapnik.Map(256, 256);
var size = 10;
map.load('./postgis-variables.xml', function(err, map) {
assert.ifError(err);
map.zoomAll();
var image = new mapnik.Image(256, 256);
map.render(image, {variables: { size: size }}, function(err, im) {
assert.ifError(err);
im.encode('png', function(err, buffer) {
assert.ifError(err);
fs.writeFile('result.png', buffer);
});
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment