diff --git a/NEWS.md b/NEWS.md index 2e07b620..cbffc943 100644 --- a/NEWS.md +++ b/NEWS.md @@ -10,6 +10,15 @@ Released 2018-mm-dd - Bug Fixes: (#1020) - Fix bug in date-wrapper regarding columns with spaces - Fix bug in aggregation-query regarding columns with spaces +- Upgrades Windshaft to [4.9.0](https://github.com/CartoDB/Windshaft/blob/4.9.0/NEWS.md#version-490) + - `pg-mvt`: + - Now matches the behaviour of the `mapnik` renderer for MVTs. + - Removed undocummented filtering by `layer.options.columns`. + - Several bugfixes. + - Dependency updates: Fixed a bug in Mapnik MVT renderer and cleanup in `tilelive-mapnik`. + - [MapConfig 1.8.0 released](https://github.com/CartoDB/Windshaft/blob/master/doc/MapConfig-1.8.0.md) with new options for MVTs: + - Add **`vector_extent`** option in MapConfig to setup the layer extent. + - Add **`vector_simplify_extent`** option in MapConfig to configure the simplification process. ## 6.3.0 Released 2018-07-26 diff --git a/lib/cartodb/api/map/tile-layergroup-controller.js b/lib/cartodb/api/map/tile-layergroup-controller.js index 311fec45..477ae444 100644 --- a/lib/cartodb/api/map/tile-layergroup-controller.js +++ b/lib/cartodb/api/map/tile-layergroup-controller.js @@ -147,10 +147,6 @@ function incrementErrorMetrics (statsClient) { function tileError () { return function tileErrorMiddleware (err, req, res, next) { - if (err.message === 'Tile does not exist' && req.params.format === 'mvt') { - res.statusCode = 204; - return next(); - } // See https://github.com/Vizzuality/Windshaft-cartodb/issues/68 let errMsg = err.message ? ( '' + err.message ) : ( '' + err ); diff --git a/package.json b/package.json index 3d2cc203..1d387869 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "step-profiler": "0.3.0", "turbo-carto": "0.20.4", "underscore": "1.6.0", - "windshaft": "4.8.3", + "windshaft": "4.9.0", "yargs": "11.1.0" }, "devDependencies": { diff --git a/test/acceptance/mvt.js b/test/acceptance/mvt.js index 1d8dd15a..b87c47a3 100644 --- a/test/acceptance/mvt.js +++ b/test/acceptance/mvt.js @@ -61,6 +61,7 @@ return function () { }; const testClient = new TestClient(template, apikeyToken); + testClient.keysToDelete['map_tpl|localhost'] = 0; testClient.getNamedTile(templateName, 0, 0, 0, 'mvt', {}, (err, res, tile) => { if (err) { @@ -194,356 +195,5 @@ return function () { }); }); }); - - - if (usePostGIS){ - describe('use only needed columns', onlyNeededColumns); - }else{ - describe.skip('use only needed columns', onlyNeededColumns); - } - - function onlyNeededColumns() { - function getFeatureByCartodbId(features, cartodbId) { - for (var i = 0, len = features.length; i < len; i++) { - if (features[i].properties.cartodb_id === cartodbId) { - return features[i]; - } - } - return {}; - } - - var options = { format: 'mvt', layer: 0 }; - - afterEach(function (done) { - if (this.testClient) { - this.testClient.drain(done); - } else { - done(); - } - }); - - it('with aggregation widget, interactivity and cartocss columns', function (done) { - var widgetMapConfig = { - version: '1.5.0', - layers: [{ - type: 'mapnik', - options: { - sql: 'select * from populated_places_simple_reduced', - cartocss: - '#layer0 { marker-fill: red; marker-width: 10; [name="Madrid"] { marker-fill: green; } }', - cartocss_version: '2.0.1', - widgets: { - adm0name: { - type: 'aggregation', - options: { - column: 'adm0name', - aggregation: 'sum', - aggregationColumn: 'pop_max' - } - } - }, - interactivity: "cartodb_id,pop_min" - } - }] - }; - - this.testClient = new TestClient(widgetMapConfig); - this.testClient.getTile(0, 0, 0, options, function (err, res, MVT) { - var geojsonTile = JSON.parse(MVT.toGeoJSONSync(0)); - assert.ok(!err, err); - assert.deepEqual(getFeatureByCartodbId(geojsonTile.features, 1109).properties, { - cartodb_id: 1109, - name: 'Mardin', - adm0name: 'Turkey', - pop_max: 71373, - pop_min: 57586 - }); - done(); - }); - }); - - it('should not duplicate columns', function (done) { - var widgetMapConfig = { - version: '1.5.0', - layers: [{ - type: 'mapnik', - options: { - sql: 'select * from populated_places_simple_reduced', - cartocss: ['#layer0 {', - 'marker-fill: red;', - 'marker-width: 10;', - '[name="Madrid"] { marker-fill: green; } ', - '[pop_max>100000] { marker-fill: black; } ', - '}'].join('\n'), - cartocss_version: '2.3.0', - widgets: { - adm0name: { - type: 'aggregation', - options: { - column: 'adm0name', - aggregation: 'sum', - aggregationColumn: 'pop_max' - } - } - }, - interactivity: "cartodb_id,pop_max" - } - }] - }; - - this.testClient = new TestClient(widgetMapConfig); - this.testClient.getTile(0, 0, 0, options, function (err, res, MVT) { - var geojsonTile = JSON.parse(MVT.toGeoJSONSync(0)); - assert.ok(!err, err); - assert.deepEqual(getFeatureByCartodbId(geojsonTile.features, 1109).properties, { - cartodb_id: 1109, - name: 'Mardin', - adm0name: 'Turkey', - pop_max: 71373 - }); - done(); - }); - }); - - it('with formula widget, no interactivity and no cartocss columns', function (done) { - var formulaWidgetMapConfig = { - version: '1.5.0', - layers: [{ - type: 'mapnik', - options: { - sql: 'select * from populated_places_simple_reduced where pop_max > 0 and pop_max < 600000', - cartocss: '#layer0 { marker-fill: red; marker-width: 10; }', - cartocss_version: '2.0.1', - interactivity: 'cartodb_id', - widgets: { - pop_max_f: { - type: 'formula', - options: { - column: 'pop_max', - operation: 'count' - } - } - } - } - }] - }; - this.testClient = new TestClient(formulaWidgetMapConfig); - this.testClient.getTile(0, 0, 0, options, function (err, res, MVT) { - var geojsonTile = JSON.parse(MVT.toGeoJSONSync(0)); - assert.ok(!err, err); - assert.deepEqual(getFeatureByCartodbId(geojsonTile.features, 1109).properties, { - cartodb_id: 1109, - pop_max: 71373 - }); - done(); - }); - }); - it('with cartocss with multiple expressions', function (done) { - var formulaWidgetMapConfig = { - version: '1.5.0', - layers: [{ - type: 'mapnik', - options: { - sql: 'select * from populated_places_simple_reduced where pop_max > 0 and pop_max < 600000', - cartocss: '#layer0 { marker-fill: red; marker-width: 10; }' + - '#layer0 { marker-width: 14; [name="Madrid"] { marker-width: 20; } }' + - '#layer0[pop_max>1000] { marker-width: 14; [name="Madrid"] { marker-width: 20; } }' + - '#layer0[adm0name=~".*Turkey*"] { marker-width: 14; [name="Madrid"] { marker-width: 20; } }', - cartocss_version: '2.0.1', - interactivity: 'cartodb_id' - } - }] - }; - - this.testClient = new TestClient(formulaWidgetMapConfig); - this.testClient.getTile(0, 0, 0, options, function (err, res, MVT) { - var geojsonTile = JSON.parse(MVT.toGeoJSONSync(0)); - assert.ok(!err, err); - assert.deepEqual(getFeatureByCartodbId(geojsonTile.features, 1109).properties, { - cartodb_id: 1109, - pop_max: 71373, - name: "Mardin", - adm0name: "Turkey" - }); - done(); - }); - }); - - var skipOnPostGIS = usePostGIS ? it.skip: it; - skipOnPostGIS('should work with mapnik substitution tokens', function (done) { - var cartocss = [ - "#layer {", - " line-width: 2;", - " line-color: #3B3B58;", - " line-opacity: 1;", - " polygon-opacity: 0.7;", - " polygon-fill: ramp([points_count], (#E5F5F9,#99D8C9,#2CA25F))", - "}" - ].join('\n'); - - var sql = [ - 'WITH hgrid AS (', - ' SELECT CDB_HexagonGrid(', - ' ST_Expand(!bbox!, greatest(!pixel_width!,!pixel_height!) * 100),', - ' greatest(!pixel_width!,!pixel_height!) * 100', - ' ) as cell', - ')', - 'SELECT', - ' hgrid.cell as the_geom_webmercator,', - ' count(1) as points_count,', - ' count(1)/power(100 * CDB_XYZ_Resolution(CDB_ZoomFromScale(!scale_denominator!)), 2) as points_density,', - ' 1 as cartodb_id', - 'FROM hgrid, (SELECT * FROM populated_places_simple_reduced) i', - 'where ST_Intersects(i.the_geom_webmercator, hgrid.cell)', - 'GROUP BY hgrid.cell' - ].join('\n'); - - var mapConfig = { - "version": "1.4.0", - "layers": [ - { - "type": 'mapnik', - "options": { - "cartocss_version": '2.3.0', - "sql": sql, - "cartocss": cartocss - } - } - ] - }; - - this.testClient = new TestClient(mapConfig); - this.testClient.getTile(0, 0, 0, options, function (err, res, MVT) { - var geojsonTile = JSON.parse(MVT.toGeoJSONSync(0)); - assert.ok(!err, err); - - assert.ok(geojsonTile); - assert.equal(geojsonTile.features.length, 5); - - done(); - }); - }); - - it('should skip empty and null columns for geojson tiles', function (done) { - - var mapConfig = { - "analyses": [ - { - "id": "a0", - "params": { - "query": "SELECT * FROM test_table" - }, - "type": "source" - } - ], - "dataviews": { - "4e7b0e07-6d21-4b83-9adb-6d7e17eea6ca": { - "options": { - "aggregationColumn": null, - "column": "cartodb_id", - "operation": "avg" - }, - "source": { - "id": "a0" - }, - "type": "formula" - }, - "74f590f8-625c-4e95-922f-34ad3e9919c0": { - "options": { - "aggregation": "sum", - "aggregationColumn": "cartodb_id", - "column": "name" - }, - "source": { - "id": "a0" - }, - "type": "aggregation" - }, - "98a75757-3006-400a-b028-fb613a6c0b69": { - "options": { - "aggregationColumn": null, - "column": "cartodb_id", - "operation": "sum" - }, - "source": { - "id": "a0" - }, - "type": "formula" - }, - "ebbc97b2-87d2-4895-9e1f-2f012df3679d": { - "options": { - "aggregationColumn": null, - "bins": "12", - "column": "cartodb_id" - }, - "source": { - "id": "a0" - }, - "type": "histogram" - }, - "ebc0653f-3581-469c-8b31-c969e440a865": { - "options": { - "aggregationColumn": null, - "column": "cartodb_id", - "operation": "avg" - }, - "source": { - "id": "a0" - }, - "type": "formula" - } - }, - "layers": [ - { - "options": { - "subdomains": "abcd", - "urlTemplate": "http://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png" - }, - "type": "http" - }, - { - "options": { - "attributes": { - "columns": [ - "name", - "address" - ], - "id": "cartodb_id" - }, - "cartocss": "#layer { marker-width: 10; marker-fill: red; }", - "cartocss_version": "2.3.0", - "interactivity": "cartodb_id", - "layer_name": "wadus", - "source": { - "id": "a0" - } - }, - "type": "cartodb" - }, - { - "options": { - "subdomains": "abcd", - "urlTemplate": "http://{s}.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}.png" - }, - "type": "http" - } - ] - }; - - this.testClient = new TestClient(mapConfig); - this.testClient.getTile(0, 0, 0, options, function (err, res, MVT) { - var geojsonTile = JSON.parse(MVT.toGeoJSONSync(0)); - assert.ok(!err, err); - - assert.ok(geojsonTile); - assert.equal(geojsonTile.features.length, 5); - - assert.deepEqual(Object.keys(geojsonTile.features[0].properties), ['cartodb_id', 'name']); - - done(); - }); - }); - - } }; } diff --git a/yarn.lock b/yarn.lock index 945505af..0816761f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6,20 +6,19 @@ version "0.2.2" resolved "https://registry.yarnpkg.com/@carto/fqdn-sync/-/fqdn-sync-0.2.2.tgz#cd7c645ed66690a09249b554d254a0f53963b2dc" -"@carto/mapnik@3.6.2-carto.10": - version "3.6.2-carto.10" - resolved "https://registry.yarnpkg.com/@carto/mapnik/-/mapnik-3.6.2-carto.10.tgz#a97c951dcdac09d0eb35b3ea71e5eeaa206c1af6" +"@carto/mapnik@3.6.2-carto.11": + version "3.6.2-carto.11" + resolved "https://registry.yarnpkg.com/@carto/mapnik/-/mapnik-3.6.2-carto.11.tgz#f2f0bc4d0051080169267c5c729b90c6bc934661" dependencies: - mapnik-vector-tile cartodb/mapnik-vector-tile#v1.6.1-carto.1 + mapnik-vector-tile cartodb/mapnik-vector-tile#v1.6.1-carto.2 nan "2.10.0" node-pre-gyp "0.10.0" - protozero "1.5.1" -"@carto/tilelive-bridge@cartodb/tilelive-bridge#2.5.1-cdb9": - version "2.5.1-cdb9" - resolved "https://codeload.github.com/cartodb/tilelive-bridge/tar.gz/5129e43223cb55daed31373c7a36c98eb6178fc1" +"@carto/tilelive-bridge@github:cartodb/tilelive-bridge#2.5.1-cdb10": + version "2.5.1-cdb10" + resolved "https://codeload.github.com/cartodb/tilelive-bridge/tar.gz/118ac7e7f6582ac7be0fc0246ea2afd1a7795a43" dependencies: - "@carto/mapnik" "3.6.2-carto.10" + "@carto/mapnik" "3.6.2-carto.11" "@mapbox/sphericalmercator" "~1.0.1" mapnik-pool "~0.1.3" @@ -27,13 +26,13 @@ version "1.0.5" resolved "https://registry.yarnpkg.com/@mapbox/sphericalmercator/-/sphericalmercator-1.0.5.tgz#70237b9774095ed1cfdbcea7a8fd1fc82b2691f2" -abaculus@cartodb/abaculus#2.0.3-cdb10: - version "2.0.3-cdb10" - resolved "https://codeload.github.com/cartodb/abaculus/tar.gz/90d537028bb8af8a35e7a40c46493066dd8a76b3" +"abaculus@github:cartodb/abaculus#2.0.3-cdb11": + version "2.0.3-cdb11" + resolved "https://codeload.github.com/cartodb/abaculus/tar.gz/b2d4dce48c50fefc5b06f21c6365d82ccf75358d" dependencies: - "@carto/mapnik" "3.6.2-carto.10" + "@carto/mapnik" "3.6.2-carto.11" d3-queue "^2.0.2" - sphericalmercator "1.0.x" + sphericalmercator "1.0.5" abbrev@1, abbrev@1.0.x: version "1.0.9" @@ -276,7 +275,7 @@ camshaft@0.62.3: dot "^1.0.3" request "2.85.0" -canvas@cartodb/node-canvas#1.6.2-cdb2: +"canvas@github:cartodb/node-canvas#1.6.2-cdb2": version "1.6.2-cdb2" resolved "https://codeload.github.com/cartodb/node-canvas/tar.gz/8acf04557005c633f9e68524488a2657c04f3766" dependencies: @@ -294,17 +293,17 @@ carto@0.16.3: semver "^5.1.0" yargs "^4.2.0" -carto@cartodb/carto#0.15.1-cdb3: - version "0.15.1-cdb3" - resolved "https://codeload.github.com/cartodb/carto/tar.gz/945f5efb74fd1af1f5e1f69f409f9567f94fb5a7" +carto@cartodb/carto#master: + version "0.15.1" + resolved "https://codeload.github.com/cartodb/carto/tar.gz/31abb8bee02df605521247b0223d508320f7d4c8" dependencies: mapnik-reference "~6.0.2" optimist "~0.6.0" underscore "1.8.3" -carto@cartodb/carto#master: - version "0.15.1" - resolved "https://codeload.github.com/cartodb/carto/tar.gz/31abb8bee02df605521247b0223d508320f7d4c8" +"carto@github:cartodb/carto#0.15.1-cdb3": + version "0.15.1-cdb3" + resolved "https://codeload.github.com/cartodb/carto/tar.gz/945f5efb74fd1af1f5e1f69f409f9567f94fb5a7" dependencies: mapnik-reference "~6.0.2" optimist "~0.6.0" @@ -879,6 +878,10 @@ generic-pool@2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.4.3.tgz#780c36f69dfad05a5a045dd37be7adca11a4f6ff" +generic-pool@2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.5.4.tgz#38c6188513e14030948ec6e5cf65523d9779299b" + generic-pool@~2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.1.1.tgz#af04dc2c325cfcb975023fa52bfce9617a7435fd" @@ -887,7 +890,7 @@ generic-pool@~2.2.0, generic-pool@~2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.2.2.tgz#7a89f491d575b42f9f069a0e8e2c6dbaa3c241be" -generic-pool@~2.4.0, generic-pool@~2.4.1: +generic-pool@~2.4.1: version "2.4.6" resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.4.6.tgz#f1b55e572167dba2fe75d5aa91ebb1e9f72642d7" @@ -1429,9 +1432,9 @@ mapnik-reference@~8.5.3: dependencies: semver "^5.1.0" -mapnik-vector-tile@cartodb/mapnik-vector-tile#v1.6.1-carto.1: - version "1.6.1-carto.1" - resolved "https://codeload.github.com/cartodb/mapnik-vector-tile/tar.gz/0111f7117946179d62ec7a6eba2f4e9fb355d05e" +"mapnik-vector-tile@github:cartodb/mapnik-vector-tile#v1.6.1-carto.2": + version "1.6.1-carto.2" + resolved "https://codeload.github.com/cartodb/mapnik-vector-tile/tar.gz/e7ca5471f9e5de81243e6035e70444321fc0a82f" media-typer@0.3.0: version "0.3.0" @@ -1480,14 +1483,14 @@ mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" +mime@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" + mime@~1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" -mime@~1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -1990,10 +1993,6 @@ propagate@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/propagate/-/propagate-1.0.0.tgz#00c2daeedda20e87e3782b344adba1cddd6ad709" -protozero@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/protozero/-/protozero-1.5.1.tgz#5a27df6fb6e1ed743f510812ae76c082f5b16638" - proxy-addr@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" @@ -2398,7 +2397,7 @@ speedometer@~0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" -sphericalmercator@1.0.5, sphericalmercator@1.0.x, sphericalmercator@~1.0.1, sphericalmercator@~1.0.4: +sphericalmercator@1.0.5, sphericalmercator@~1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/sphericalmercator/-/sphericalmercator-1.0.5.tgz#ddc5a049e360e000d0fad9fc22c4071882584980" @@ -2581,15 +2580,13 @@ through@2: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" -tilelive-mapnik@cartodb/tilelive-mapnik#0.6.18-cdb14: - version "0.6.18-cdb14" - resolved "https://codeload.github.com/cartodb/tilelive-mapnik/tar.gz/6d06f728833d3e34d1adcd05567b3f4379f547bb" +"tilelive-mapnik@github:cartodb/tilelive-mapnik#0.6.18-cdb15": + version "0.6.18-cdb15" + resolved "https://codeload.github.com/cartodb/tilelive-mapnik/tar.gz/b6c1404a9e37fc60e545d977081867a86eb42b2b" dependencies: - "@carto/mapnik" "3.6.2-carto.10" - generic-pool "~2.4.0" - mime "~1.6.0" - sphericalmercator "~1.0.4" - step "~0.0.5" + "@carto/mapnik" "3.6.2-carto.11" + generic-pool "2.5.4" + mime "2.3.1" tilelive@5.12.3: version "5.12.3" @@ -2762,13 +2759,13 @@ window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" -windshaft@4.8.3: - version "4.8.3" - resolved "https://registry.yarnpkg.com/windshaft/-/windshaft-4.8.3.tgz#9cc0ae9cea6b4e716858f4c15c138c1e9c158b9e" +windshaft@4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/windshaft/-/windshaft-4.9.0.tgz#adaeb7adcbe45aa9f196292b7130f255d39513b1" dependencies: - "@carto/mapnik" "3.6.2-carto.10" - "@carto/tilelive-bridge" cartodb/tilelive-bridge#2.5.1-cdb9 - abaculus cartodb/abaculus#2.0.3-cdb10 + "@carto/mapnik" "3.6.2-carto.11" + "@carto/tilelive-bridge" cartodb/tilelive-bridge#2.5.1-cdb10 + abaculus cartodb/abaculus#2.0.3-cdb11 canvas cartodb/node-canvas#1.6.2-cdb2 carto cartodb/carto#0.15.1-cdb3 cartodb-psql "0.11.0" @@ -2782,7 +2779,7 @@ windshaft@4.8.3: sphericalmercator "1.0.5" step "1.0.0" tilelive "5.12.3" - tilelive-mapnik cartodb/tilelive-mapnik#0.6.18-cdb14 + tilelive-mapnik cartodb/tilelive-mapnik#0.6.18-cdb15 torque.js "2.16.2" underscore "1.6.0"