Skip to content
This repository has been archived by the owner on Jan 12, 2024. It is now read-only.

Commit

Permalink
Merge pull request #433 from nebulon42/target-mapnik-version
Browse files Browse the repository at this point in the history
Target Mapnik API versions
  • Loading branch information
nebulon42 committed Mar 2, 2016
2 parents 6bb284a + 9e7e284 commit 58ae2d3
Show file tree
Hide file tree
Showing 12 changed files with 172 additions and 8 deletions.
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,15 @@ Now that Carto is installed you should have a `carto` command line tool availabl

carto project.mml > mapnik.xml

Available parameters:
* -h / --help - Display help message
* -v / --version - Display version information
* -b / --benchmark - Outputs total compile time
* -l / --localize - Use millstone to localize resources when loading an MML (default: off)
* -n / --nosymlink - Use absolute paths instead of symlinking files
* -a / --api VERSION - Specify Mapnik API version (e.g. --api 3.0.10) (default: 2.3.0)
* -ppi RESOLUTION - Pixels per inch used to convert m, mm, cm, in, pt, pc to pixels (default: 90.714)

#### From code

Currently CartoCSS is designed to be invoked from [node.js](http://nodejs.org/).
Expand Down
22 changes: 20 additions & 2 deletions bin/carto
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
var path = require('path'),
fs = require('fs'),
carto = require('../lib/carto'),
semver = require('semver'),
url = require('url'),
_ = require('lodash'),
yaml = require('js-yaml');
Expand All @@ -16,6 +17,7 @@ var yargs = require('yargs')
.options('b', {alias:'benchmark', boolean:true, describe:'Outputs total compile time'})
.options('l', {alias:'localize', boolean:true, default:false, describe:'Use millstone to localize resources when loading an MML'})
.options('n', {alias:'nosymlink', boolean:true, describe:'Use absolute paths instead of symlinking files'})
.options('a', {alias:'api', describe:'Specify Mapnik API version', default:'2.3.0'})
.options('ppi', {describe:'Pixels per inch used to convert m, mm, cm, in, pt, pc to pixels', default:90.714});

var options = yargs.argv;
Expand All @@ -40,6 +42,13 @@ if (!input) {
process.exit(1);
}

if (options.api) {
if (!semver.valid(options.api)) {
console.error("carto: invalid Mapnik API version. A valid version is e.g. 3.0.10");
process.exit(1);
}
}

if (options.benchmark) {
var start = +new Date;
}
Expand Down Expand Up @@ -70,13 +79,19 @@ function compileMML(err, data) {
filename: input,
benchmark: options.benchmark,
ppi: options.ppi
},
{
mapnik_version: options.api
});
try {
var output = renderer.render(data);
} catch (e) {
if (e.stack) {
console.error(e.stack);
} else {
} else if (e.message) {
console.error(e.message);
}
else {
console.error(e);
}
process.exit(1);
Expand All @@ -98,7 +113,10 @@ function compileMSS(err, data) {
filename: path.basename(input),
benchmark: options.benchmark,
ppi: options.ppi
});
},
{
mapnik_version: options.api
});
try {
var output = renderer.renderMSS(data);
} catch (e) {
Expand Down
20 changes: 18 additions & 2 deletions lib/carto/tree/layer.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
var semver = require('semver');

(function(tree) {

tree.LayerXML = function(obj, styles) {
Expand All @@ -7,12 +9,26 @@ tree.LayerXML = function(obj, styles) {
obj.Datasource[i] + ']]></Parameter>');
}

var apiVersion = tree.Reference.data['version'];

var prop_string = '';
for (var prop in obj.properties) {
if (prop === 'minzoom') {
prop_string += ' maxzoom="' + tree.Zoom.ranges[obj.properties[prop]] + '"\n';
if (semver.gte(apiVersion, '3.0.0')) {
prop_string += ' maximum-scale-denominator="'
}
else {
prop_string += ' maxzoom="'
}
prop_string += tree.Zoom.ranges[obj.properties[prop]] + '"\n';
} else if (prop === 'maxzoom') {
prop_string += ' minzoom="' + tree.Zoom.ranges[obj.properties[prop]+1] + '"\n';
if (semver.gte(apiVersion, '3.0.0')) {
prop_string += ' minimum-scale-denominator="'
}
else {
prop_string += ' minzoom="'
}
prop_string += tree.Zoom.ranges[obj.properties[prop]+1] + '"\n';
} else {
prop_string += ' ' + prop + '="' + obj.properties[prop] + '"\n';
}
Expand Down
9 changes: 8 additions & 1 deletion lib/carto/tree/reference.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,14 @@ ref.setData = function(data) {
};

ref.setVersion = function(version) {
ref.setData(mapnik_reference.load(version));
try {
ref.setData(mapnik_reference.load(version));
}
catch(err) {
var e = new Error('Mapnik version ' + version + ' is not supported');
e.stack = null; // do not show stack trace
throw e;
}
};

ref.selectorData = function(selector, i) {
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
"js-yaml": "^3.4.6",
"lodash": "^4.5.1",
"mapnik-reference": "~8.5.3",
"semver": "^5.1.0",
"yargs": "^4.2.0"
},
"devDependencies": {
Expand Down
9 changes: 9 additions & 0 deletions test/bincarto.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,15 @@ describe('bin/carto', function() {
done();
});
});
it('errors on unsupported api version', function(done) {
var file = path.join('test', 'rendering', 'identity.mml');
var api = '1.0.0';
exec(util.format('node %s -a %s %s', bin, api, file), function(err, stdout, stderr) {
assert.equal(1, err.code);
assert.equal("Mapnik version 1.0.0 is not supported\n", stderr);
done();
});
});
it('renders mml', function(done) {
var file = path.join('test', 'rendering', 'identity.mml');
exec(util.format('node %s %s', bin, file), function(err, stdout, stderr) {
Expand Down
26 changes: 23 additions & 3 deletions test/rendering.test.js
Original file line number Diff line number Diff line change
@@ -1,24 +1,44 @@
var path = require('path'),
assert = require('assert'),
fs = require('fs');
fs = require('fs'),
semver = require('semver');

var carto = require('../lib/carto');
var tree = require('../lib/carto/tree');
var helper = require('./support/helper');

describe('Rendering', function() {
helper.files('rendering', 'mml', function(file) {
var api = null,
filename = path.basename(file);
if (filename.indexOf('_api') !== -1) {
api = filename.substring(filename.indexOf('_api') + 4, filename.length - 4);
if (!semver.valid(api)) {
api = null;
}
}
it('should render ' + path.basename(file) + ' correctly', function(done) {
var completed = false;
var renderResult;
var mml = helper.mml(file);
try {
var output = new carto.Renderer({
var env = {
paths: [ path.dirname(file) ],
data_dir: path.join(__dirname, '../data'),
local_data_dir: path.join(__dirname, 'rendering'),
filename: file
}).render(mml);
},
renderer = null;

if (api) {
renderer = new carto.Renderer(env, {
mapnik_version: api
});
}
else {
renderer = new carto.Renderer(env);
}
var output = renderer.render(mml);
} catch(err) {
if (Array.isArray(err)){
err.forEach(carto.writeError);
Expand Down
4 changes: 4 additions & 0 deletions test/rendering/issue_394.mss
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#world {
line-width: 2;
line-color: #024;
}
18 changes: 18 additions & 0 deletions test/rendering/issue_394_api2.3.0.mml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over",
"Stylesheet": [
"issue_394.mss"
],
"Layer": [{
"name": "world",
"srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over",
"Datasource": {
"file": "http://tilemill-data.s3.amazonaws.com/test_data/shape_demo.zip",
"type": "shape"
},
"properties": {
"minzoom": 7,
"maxzoom": 9
}
}]
}
22 changes: 22 additions & 0 deletions test/rendering/issue_394_api2.3.0.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Map[]>
<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" >


<Style name="world" filter-mode="first">
<Rule>
<LineSymbolizer stroke="#002244" stroke-width="2" />
</Rule>
</Style>
<Layer name="world"
minzoom="750000"
maxzoom="6500000"
srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
<StyleName>world</StyleName>
<Datasource>
<Parameter name="file"><![CDATA[[absolute path]]]></Parameter>
<Parameter name="type"><![CDATA[shape]]></Parameter>
</Datasource>
</Layer>

</Map>
18 changes: 18 additions & 0 deletions test/rendering/issue_394_api3.0.0.mml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over",
"Stylesheet": [
"issue_394.mss"
],
"Layer": [{
"name": "world",
"srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over",
"Datasource": {
"file": "http://tilemill-data.s3.amazonaws.com/test_data/shape_demo.zip",
"type": "shape"
},
"properties": {
"minzoom": 7,
"maxzoom": 9
}
}]
}
22 changes: 22 additions & 0 deletions test/rendering/issue_394_api3.0.0.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Map[]>
<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" >


<Style name="world" filter-mode="first">
<Rule>
<LineSymbolizer stroke="#002244" stroke-width="2" />
</Rule>
</Style>
<Layer name="world"
minimum-scale-denominator="750000"
maximum-scale-denominator="6500000"
srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
<StyleName>world</StyleName>
<Datasource>
<Parameter name="file"><![CDATA[[absolute path]]]></Parameter>
<Parameter name="type"><![CDATA[shape]]></Parameter>
</Datasource>
</Layer>

</Map>

0 comments on commit 58ae2d3

Please sign in to comment.