@deck.gl/carto 8.7.0-beta.2 → 8.7.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dist.dev.js +1425 -306
- package/dist/es5/api/index.js +6 -0
- package/dist/es5/api/index.js.map +1 -1
- package/dist/es5/api/layer-map.js +32 -17
- package/dist/es5/api/layer-map.js.map +1 -1
- package/dist/es5/api/maps-api-common.js +21 -1
- package/dist/es5/api/maps-api-common.js.map +1 -1
- package/dist/es5/api/maps-client.js +15 -18
- package/dist/es5/api/maps-client.js.map +1 -1
- package/dist/es5/api/maps-v3-client.js +241 -181
- package/dist/es5/api/maps-v3-client.js.map +1 -1
- package/dist/es5/api/parseMap.js +9 -12
- package/dist/es5/api/parseMap.js.map +1 -1
- package/dist/es5/basemap.js +7 -7
- package/dist/es5/basemap.js.map +1 -1
- package/dist/es5/config.js.map +1 -1
- package/dist/es5/index.js +15 -1
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/layers/carto-layer.js +27 -16
- package/dist/es5/layers/carto-layer.js.map +1 -1
- package/dist/es5/layers/{carto-dynamic-tile-layer.js → carto-tile-layer.js} +79 -32
- package/dist/es5/layers/carto-tile-layer.js.map +1 -0
- package/dist/es5/layers/schema/carto-tile.js +197 -0
- package/dist/es5/layers/schema/carto-tile.js.map +1 -0
- package/dist/es5/style/color-bins-style.js +1 -1
- package/dist/es5/style/color-bins-style.js.map +1 -1
- package/dist/es5/style/color-categories-style.js +1 -1
- package/dist/es5/style/color-categories-style.js.map +1 -1
- package/dist/es5/style/color-continuous-style.js +1 -1
- package/dist/es5/style/color-continuous-style.js.map +1 -1
- package/dist/es5/style/palette.js +1 -6
- package/dist/es5/style/palette.js.map +1 -1
- package/dist/es5/style/utils.js +2 -6
- package/dist/es5/style/utils.js.map +1 -1
- package/dist/es5/utils.js +13 -0
- package/dist/es5/utils.js.map +1 -0
- package/dist/esm/api/index.js +1 -1
- package/dist/esm/api/index.js.map +1 -1
- package/dist/esm/api/layer-map.js +28 -12
- package/dist/esm/api/layer-map.js.map +1 -1
- package/dist/esm/api/maps-api-common.js +19 -0
- package/dist/esm/api/maps-api-common.js.map +1 -1
- package/dist/esm/api/maps-client.js +6 -10
- package/dist/esm/api/maps-client.js.map +1 -1
- package/dist/esm/api/maps-v3-client.js +73 -38
- package/dist/esm/api/maps-v3-client.js.map +1 -1
- package/dist/esm/api/parseMap.js +9 -8
- package/dist/esm/api/parseMap.js.map +1 -1
- package/dist/esm/basemap.js +7 -7
- package/dist/esm/basemap.js.map +1 -1
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/index.js +3 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/layers/carto-layer.js +25 -13
- package/dist/esm/layers/carto-layer.js.map +1 -1
- package/dist/esm/layers/carto-tile-layer.js +141 -0
- package/dist/esm/layers/carto-tile-layer.js.map +1 -0
- package/dist/esm/layers/schema/carto-tile.js +190 -0
- package/dist/esm/layers/schema/carto-tile.js.map +1 -0
- package/dist/esm/style/color-bins-style.js +1 -1
- package/dist/esm/style/color-bins-style.js.map +1 -1
- package/dist/esm/style/color-categories-style.js +1 -1
- package/dist/esm/style/color-categories-style.js.map +1 -1
- package/dist/esm/style/color-continuous-style.js +1 -1
- package/dist/esm/style/color-continuous-style.js.map +1 -1
- package/dist/esm/style/palette.js +1 -6
- package/dist/esm/style/palette.js.map +1 -1
- package/dist/esm/style/utils.js +2 -6
- package/dist/esm/style/utils.js.map +1 -1
- package/dist/esm/utils.js +5 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist.min.js +14 -14
- package/package.json +10 -3
- package/src/api/{index.js → index.ts} +1 -1
- package/src/api/{layer-map.js → layer-map.ts} +50 -23
- package/src/api/maps-api-common.ts +76 -0
- package/src/api/{maps-client.js → maps-client.ts} +55 -20
- package/src/api/{maps-v3-client.js → maps-v3-client.ts} +145 -57
- package/src/api/{parseMap.js → parseMap.ts} +8 -7
- package/src/basemap.ts +10 -0
- package/src/{config.js → config.ts} +22 -6
- package/src/{index.js → index.ts} +3 -1
- package/src/layers/carto-layer.js +30 -19
- package/src/layers/carto-tile-layer.js +121 -0
- package/src/layers/schema/carto-tile.js +195 -0
- package/src/style/color-bins-style.ts +26 -0
- package/src/style/{color-categories-style.js → color-categories-style.ts} +10 -4
- package/src/style/color-continuous-style.ts +25 -0
- package/src/style/{palette.js → palette.ts} +18 -15
- package/src/style/{utils.js → utils.ts} +7 -10
- package/src/utils.ts +5 -0
- package/dist/es5/layers/carto-dynamic-tile-layer.js.map +0 -1
- package/dist/esm/layers/carto-dynamic-tile-layer.js +0 -97
- package/dist/esm/layers/carto-dynamic-tile-layer.js.map +0 -1
- package/src/api/maps-api-common.js +0 -34
- package/src/basemap.js +0 -10
- package/src/layers/carto-dynamic-tile-layer.js +0 -86
- package/src/style/color-bins-style.js +0 -21
- package/src/style/color-continuous-style.js +0 -20
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/* global TextDecoder */
|
|
2
|
+
import Protobuf from 'pbf';
|
|
3
|
+
import {log} from '@deck.gl/core';
|
|
4
|
+
import {ClipExtension} from '@deck.gl/extensions';
|
|
5
|
+
import {MVTLayer, _getURLFromTemplate} from '@deck.gl/geo-layers';
|
|
6
|
+
import {GeoJsonLayer} from '@deck.gl/layers';
|
|
7
|
+
import {geojsonToBinary} from '@loaders.gl/gis';
|
|
8
|
+
import {Tile} from './schema/carto-tile';
|
|
9
|
+
import {TILE_FORMATS} from '../api/maps-api-common';
|
|
10
|
+
|
|
11
|
+
function parseJSON(arrayBuffer) {
|
|
12
|
+
return JSON.parse(new TextDecoder().decode(arrayBuffer));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function parsePbf(buffer) {
|
|
16
|
+
const pbf = new Protobuf(buffer);
|
|
17
|
+
const tile = Tile.read(pbf);
|
|
18
|
+
return tile;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function unpackProperties(properties) {
|
|
22
|
+
if (!properties || !properties.length) {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
return properties.map(item => {
|
|
26
|
+
const currentRecord = {};
|
|
27
|
+
item.data.forEach(({key, value}) => {
|
|
28
|
+
currentRecord[key] = value;
|
|
29
|
+
});
|
|
30
|
+
return currentRecord;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function parseCartoTile(arrayBuffer, options) {
|
|
35
|
+
if (!arrayBuffer) return null;
|
|
36
|
+
const formatTiles = options && options.cartoTile && options.cartoTile.formatTiles;
|
|
37
|
+
if (formatTiles === TILE_FORMATS.GEOJSON) return geojsonToBinary(parseJSON(arrayBuffer).features);
|
|
38
|
+
|
|
39
|
+
const tile = parsePbf(arrayBuffer);
|
|
40
|
+
|
|
41
|
+
const {points, lines, polygons} = tile;
|
|
42
|
+
const data = {
|
|
43
|
+
points: {...points, properties: unpackProperties(points.properties)},
|
|
44
|
+
lines: {...lines, properties: unpackProperties(lines.properties)},
|
|
45
|
+
polygons: {...polygons, properties: unpackProperties(polygons.properties)}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
return data;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const CartoTileLoader = {
|
|
52
|
+
name: 'CARTO Tile',
|
|
53
|
+
id: 'cartoTile',
|
|
54
|
+
module: 'carto',
|
|
55
|
+
extensions: ['pbf'],
|
|
56
|
+
mimeTypes: ['application/x-protobuf'],
|
|
57
|
+
category: 'geometry',
|
|
58
|
+
worker: false,
|
|
59
|
+
parse: async (arrayBuffer, options) => parseCartoTile(arrayBuffer, options),
|
|
60
|
+
parseSync: parseCartoTile,
|
|
61
|
+
options: {
|
|
62
|
+
cartoTile: {
|
|
63
|
+
// TODO change to BINARY for 8.7 prod release
|
|
64
|
+
formatTiles: TILE_FORMATS.GEOJSON
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export default class CartoTileLayer extends MVTLayer {
|
|
70
|
+
getTileData(tile) {
|
|
71
|
+
let url = _getURLFromTemplate(this.state.data, tile);
|
|
72
|
+
if (!url) {
|
|
73
|
+
return Promise.reject('Invalid URL');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
let loadOptions = this.getLoadOptions();
|
|
77
|
+
const {fetch, formatTiles} = this.props;
|
|
78
|
+
const {signal} = tile;
|
|
79
|
+
|
|
80
|
+
loadOptions = {
|
|
81
|
+
...loadOptions,
|
|
82
|
+
mimeType: 'application/x-protobuf'
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
if (formatTiles) {
|
|
86
|
+
log.assert(
|
|
87
|
+
Object.values(TILE_FORMATS).includes(formatTiles),
|
|
88
|
+
`Invalid value for formatTiles: ${formatTiles}. Use value from TILE_FORMATS`
|
|
89
|
+
);
|
|
90
|
+
// eslint-disable-next-line no-undef
|
|
91
|
+
const newUrl = new URL(url);
|
|
92
|
+
newUrl.searchParams.set('formatTiles', formatTiles);
|
|
93
|
+
url = newUrl.toString();
|
|
94
|
+
loadOptions.cartoTile = {formatTiles};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return fetch(url, {propName: 'data', layer: this, loadOptions, signal});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
renderSubLayers(props) {
|
|
101
|
+
if (props.data === null) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
props.autoHighlight = false;
|
|
106
|
+
|
|
107
|
+
const {
|
|
108
|
+
bbox: {west, south, east, north}
|
|
109
|
+
} = props.tile;
|
|
110
|
+
props.extensions = [new ClipExtension(), ...(props.extensions || [])];
|
|
111
|
+
props.clipBounds = [west, south, east, north];
|
|
112
|
+
|
|
113
|
+
const subLayer = new GeoJsonLayer({
|
|
114
|
+
...props
|
|
115
|
+
});
|
|
116
|
+
return subLayer;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
CartoTileLayer.layerName = 'CartoTileLayer';
|
|
121
|
+
CartoTileLayer.defaultProps = {...MVTLayer.defaultProps, loaders: [CartoTileLoader]};
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// KeyValueObject ========================================
|
|
2
|
+
|
|
3
|
+
const KeyValueObject = {};
|
|
4
|
+
|
|
5
|
+
KeyValueObject.read = function (pbf, end) {
|
|
6
|
+
return pbf.readFields(KeyValueObject._readField, {key: '', value: ''}, end);
|
|
7
|
+
};
|
|
8
|
+
KeyValueObject._readField = function (tag, obj, pbf) {
|
|
9
|
+
if (tag === 1) obj.key = pbf.readString();
|
|
10
|
+
else if (tag === 2) obj.value = pbf.readString();
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// Properties ========================================
|
|
14
|
+
|
|
15
|
+
const Properties = {};
|
|
16
|
+
|
|
17
|
+
Properties.read = function (pbf, end) {
|
|
18
|
+
return pbf.readFields(Properties._readField, {data: []}, end);
|
|
19
|
+
};
|
|
20
|
+
Properties._readField = function (tag, obj, pbf) {
|
|
21
|
+
if (tag === 1) obj.data.push(KeyValueObject.read(pbf, pbf.readVarint() + pbf.pos));
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// Doubles ========================================
|
|
25
|
+
|
|
26
|
+
const Doubles = {};
|
|
27
|
+
|
|
28
|
+
Doubles.read = function (pbf, end) {
|
|
29
|
+
// TODO perhaps we can do better and directly map from the source
|
|
30
|
+
// ArrayBuffer using ArrayBuffer.slice()
|
|
31
|
+
const {value, size} = pbf.readFields(Doubles._readField, {value: [], size: 0}, end);
|
|
32
|
+
return {value: new Float32Array(value), size};
|
|
33
|
+
};
|
|
34
|
+
Doubles._readField = function (tag, obj, pbf) {
|
|
35
|
+
if (tag === 1) pbf.readPackedDouble(obj.value);
|
|
36
|
+
else if (tag === 2) obj.size = pbf.readVarint(true);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// Ints ========================================
|
|
40
|
+
|
|
41
|
+
const Ints = {};
|
|
42
|
+
|
|
43
|
+
Ints.read = function (pbf, end) {
|
|
44
|
+
const {value, size} = pbf.readFields(Ints._readField, {value: [], size: 0}, end);
|
|
45
|
+
return {value: new Uint32Array(value), size};
|
|
46
|
+
};
|
|
47
|
+
Ints._readField = function (tag, obj, pbf) {
|
|
48
|
+
if (tag === 1) pbf.readPackedVarint(obj.value);
|
|
49
|
+
else if (tag === 2) obj.size = pbf.readVarint(true);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// NumericProp ========================================
|
|
53
|
+
|
|
54
|
+
const NumericProp = {};
|
|
55
|
+
|
|
56
|
+
NumericProp.read = function (pbf, end) {
|
|
57
|
+
return pbf.readFields(NumericProp._readField, {value: []}, end);
|
|
58
|
+
};
|
|
59
|
+
NumericProp._readField = function (tag, obj, pbf) {
|
|
60
|
+
if (tag === 1) pbf.readPackedDouble(obj.value);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// NumericPropKeyValue ========================================
|
|
64
|
+
|
|
65
|
+
const NumericPropKeyValue = {};
|
|
66
|
+
|
|
67
|
+
NumericPropKeyValue.read = function (pbf, end) {
|
|
68
|
+
return pbf.readFields(NumericPropKeyValue._readField, {key: '', value: null}, end);
|
|
69
|
+
};
|
|
70
|
+
NumericPropKeyValue._readField = function (tag, obj, pbf) {
|
|
71
|
+
if (tag === 1) obj.key = pbf.readString();
|
|
72
|
+
else if (tag === 2) obj.value = NumericProp.read(pbf, pbf.readVarint() + pbf.pos);
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// NumericProp._FieldEntry1 ========================================
|
|
76
|
+
|
|
77
|
+
NumericProp._FieldEntry1 = {};
|
|
78
|
+
|
|
79
|
+
NumericProp._FieldEntry1.read = function (pbf, end) {
|
|
80
|
+
return pbf.readFields(NumericProp._FieldEntry1._readField, {key: '', value: 0}, end);
|
|
81
|
+
};
|
|
82
|
+
NumericProp._FieldEntry1._readField = function (tag, obj, pbf) {
|
|
83
|
+
if (tag === 1) obj.key = pbf.readString();
|
|
84
|
+
else if (tag === 2) obj.value = pbf.readDouble();
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
// StringProp ========================================
|
|
88
|
+
|
|
89
|
+
const StringProp = {};
|
|
90
|
+
|
|
91
|
+
StringProp.read = function (pbf, end) {
|
|
92
|
+
return pbf.readFields(StringProp._readField, {value: []}, end);
|
|
93
|
+
};
|
|
94
|
+
StringProp._readField = function (tag, obj, pbf) {
|
|
95
|
+
if (tag === 1) obj.value.push(pbf.readString());
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
// Points ========================================
|
|
99
|
+
|
|
100
|
+
const Points = {};
|
|
101
|
+
|
|
102
|
+
Points.read = function (pbf, end) {
|
|
103
|
+
return pbf.readFields(
|
|
104
|
+
Points._readField,
|
|
105
|
+
{positions: null, globalFeatureIds: null, featureIds: null, properties: [], numericProps: {}},
|
|
106
|
+
end
|
|
107
|
+
);
|
|
108
|
+
};
|
|
109
|
+
Points._readField = function (tag, obj, pbf) {
|
|
110
|
+
if (tag === 1) obj.positions = Doubles.read(pbf, pbf.readVarint() + pbf.pos);
|
|
111
|
+
else if (tag === 2) obj.globalFeatureIds = Ints.read(pbf, pbf.readVarint() + pbf.pos);
|
|
112
|
+
else if (tag === 3) obj.featureIds = Ints.read(pbf, pbf.readVarint() + pbf.pos);
|
|
113
|
+
else if (tag === 4) obj.properties.push(Properties.read(pbf, pbf.readVarint() + pbf.pos));
|
|
114
|
+
else if (tag === 5) {
|
|
115
|
+
const entry = NumericPropKeyValue.read(pbf, pbf.readVarint() + pbf.pos);
|
|
116
|
+
obj.numericProps[entry.key] = entry.value;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// Lines ========================================
|
|
121
|
+
|
|
122
|
+
const Lines = {};
|
|
123
|
+
|
|
124
|
+
Lines.read = function (pbf, end) {
|
|
125
|
+
return pbf.readFields(
|
|
126
|
+
Lines._readField,
|
|
127
|
+
{
|
|
128
|
+
positions: null,
|
|
129
|
+
pathIndices: null,
|
|
130
|
+
globalFeatureIds: null,
|
|
131
|
+
featureIds: null,
|
|
132
|
+
properties: [],
|
|
133
|
+
numericProps: {}
|
|
134
|
+
},
|
|
135
|
+
end
|
|
136
|
+
);
|
|
137
|
+
};
|
|
138
|
+
Lines._readField = function (tag, obj, pbf) {
|
|
139
|
+
if (tag === 1) obj.positions = Doubles.read(pbf, pbf.readVarint() + pbf.pos);
|
|
140
|
+
else if (tag === 2) obj.pathIndices = Ints.read(pbf, pbf.readVarint() + pbf.pos);
|
|
141
|
+
else if (tag === 3) obj.globalFeatureIds = Ints.read(pbf, pbf.readVarint() + pbf.pos);
|
|
142
|
+
else if (tag === 4) obj.featureIds = Ints.read(pbf, pbf.readVarint() + pbf.pos);
|
|
143
|
+
else if (tag === 5) obj.properties.push(Properties.read(pbf, pbf.readVarint() + pbf.pos));
|
|
144
|
+
else if (tag === 6) {
|
|
145
|
+
const entry = NumericPropKeyValue.read(pbf, pbf.readVarint() + pbf.pos);
|
|
146
|
+
obj.numericProps[entry.key] = entry.value;
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
// Polygons ========================================
|
|
151
|
+
|
|
152
|
+
const Polygons = {};
|
|
153
|
+
|
|
154
|
+
Polygons.read = function (pbf, end) {
|
|
155
|
+
return pbf.readFields(
|
|
156
|
+
Polygons._readField,
|
|
157
|
+
{
|
|
158
|
+
positions: null,
|
|
159
|
+
polygonIndices: null,
|
|
160
|
+
globalFeatureIds: null,
|
|
161
|
+
featureIds: null,
|
|
162
|
+
primitivePolygonIndices: null,
|
|
163
|
+
triangles: null,
|
|
164
|
+
properties: [],
|
|
165
|
+
numericProps: {}
|
|
166
|
+
},
|
|
167
|
+
end
|
|
168
|
+
);
|
|
169
|
+
};
|
|
170
|
+
Polygons._readField = function (tag, obj, pbf) {
|
|
171
|
+
if (tag === 1) obj.positions = Doubles.read(pbf, pbf.readVarint() + pbf.pos);
|
|
172
|
+
else if (tag === 2) obj.polygonIndices = Ints.read(pbf, pbf.readVarint() + pbf.pos);
|
|
173
|
+
else if (tag === 3) obj.globalFeatureIds = Ints.read(pbf, pbf.readVarint() + pbf.pos);
|
|
174
|
+
else if (tag === 4) obj.featureIds = Ints.read(pbf, pbf.readVarint() + pbf.pos);
|
|
175
|
+
else if (tag === 5) obj.primitivePolygonIndices = Ints.read(pbf, pbf.readVarint() + pbf.pos);
|
|
176
|
+
else if (tag === 6) obj.triangles = Ints.read(pbf, pbf.readVarint() + pbf.pos);
|
|
177
|
+
else if (tag === 7) obj.properties.push(Properties.read(pbf, pbf.readVarint() + pbf.pos));
|
|
178
|
+
else if (tag === 8) {
|
|
179
|
+
const entry = NumericPropKeyValue.read(pbf, pbf.readVarint() + pbf.pos);
|
|
180
|
+
obj.numericProps[entry.key] = entry.value;
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
// Tile ========================================
|
|
185
|
+
|
|
186
|
+
export const Tile = {};
|
|
187
|
+
|
|
188
|
+
Tile.read = function (pbf, end) {
|
|
189
|
+
return pbf.readFields(Tile._readField, {points: null, lines: null, polygons: null}, end);
|
|
190
|
+
};
|
|
191
|
+
Tile._readField = function (tag, obj, pbf) {
|
|
192
|
+
if (tag === 1) obj.points = Points.read(pbf, pbf.readVarint() + pbf.pos);
|
|
193
|
+
else if (tag === 2) obj.lines = Lines.read(pbf, pbf.readVarint() + pbf.pos);
|
|
194
|
+
else if (tag === 3) obj.polygons = Polygons.read(pbf, pbf.readVarint() + pbf.pos);
|
|
195
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import {scaleThreshold} from 'd3-scale';
|
|
2
|
+
import getPalette, {Color, DEFAULT_PALETTE, NULL_COLOR} from './palette';
|
|
3
|
+
import {assert, AttributeSelector, getAttrValue} from './utils';
|
|
4
|
+
|
|
5
|
+
export default function colorBins({
|
|
6
|
+
attr,
|
|
7
|
+
domain,
|
|
8
|
+
colors = DEFAULT_PALETTE,
|
|
9
|
+
nullColor = NULL_COLOR
|
|
10
|
+
}: {
|
|
11
|
+
attr: AttributeSelector;
|
|
12
|
+
domain: number[];
|
|
13
|
+
colors?: string | Color[];
|
|
14
|
+
nullColor?: Color;
|
|
15
|
+
}): AttributeSelector {
|
|
16
|
+
assert(Array.isArray(domain), 'Expected "domain" to be an array of numbers');
|
|
17
|
+
|
|
18
|
+
const palette = typeof colors === 'string' ? getPalette(colors, domain.length + 1) : colors;
|
|
19
|
+
|
|
20
|
+
const color = scaleThreshold<number, Color>().domain(domain).range(palette);
|
|
21
|
+
|
|
22
|
+
return d => {
|
|
23
|
+
const value = getAttrValue(attr, d);
|
|
24
|
+
return typeof value === 'number' && Number.isFinite(value) ? color(value) : nullColor;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import getPalette, {DEFAULT_PALETTE, NULL_COLOR, OTHERS_COLOR} from './palette';
|
|
2
|
-
import {assert, getAttrValue} from './utils';
|
|
1
|
+
import getPalette, {Color, DEFAULT_PALETTE, NULL_COLOR, OTHERS_COLOR} from './palette';
|
|
2
|
+
import {assert, AttributeSelector, getAttrValue} from './utils';
|
|
3
3
|
|
|
4
4
|
export default function colorCategories({
|
|
5
5
|
attr,
|
|
@@ -7,7 +7,13 @@ export default function colorCategories({
|
|
|
7
7
|
colors = DEFAULT_PALETTE,
|
|
8
8
|
nullColor = NULL_COLOR,
|
|
9
9
|
othersColor = OTHERS_COLOR
|
|
10
|
-
}
|
|
10
|
+
}: {
|
|
11
|
+
attr: AttributeSelector;
|
|
12
|
+
domain: number[];
|
|
13
|
+
colors: string | Color[];
|
|
14
|
+
nullColor?: Color;
|
|
15
|
+
othersColor?: Color;
|
|
16
|
+
}): AttributeSelector {
|
|
11
17
|
assert(Array.isArray(domain), 'Expected "domain" to be an array of numbers or strings');
|
|
12
18
|
|
|
13
19
|
const colorsByCategory = {};
|
|
@@ -19,7 +25,7 @@ export default function colorCategories({
|
|
|
19
25
|
|
|
20
26
|
return d => {
|
|
21
27
|
const value = getAttrValue(attr, d);
|
|
22
|
-
return Number.isFinite(value) || typeof value === 'string'
|
|
28
|
+
return (typeof value === 'number' && Number.isFinite(value)) || typeof value === 'string'
|
|
23
29
|
? colorsByCategory[value] || othersColor
|
|
24
30
|
: nullColor;
|
|
25
31
|
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {scaleLinear} from 'd3-scale';
|
|
2
|
+
import getPalette, {Color, DEFAULT_PALETTE, NULL_COLOR} from './palette';
|
|
3
|
+
import {assert, AttributeSelector, getAttrValue} from './utils';
|
|
4
|
+
|
|
5
|
+
export default function colorContinuous({
|
|
6
|
+
attr,
|
|
7
|
+
domain,
|
|
8
|
+
colors = DEFAULT_PALETTE,
|
|
9
|
+
nullColor = NULL_COLOR
|
|
10
|
+
}: {
|
|
11
|
+
attr: AttributeSelector;
|
|
12
|
+
domain: number[];
|
|
13
|
+
colors?: string | Color[];
|
|
14
|
+
nullColor?: Color;
|
|
15
|
+
}): AttributeSelector {
|
|
16
|
+
assert(Array.isArray(domain), 'Expected "domain" to be an array of numbers');
|
|
17
|
+
|
|
18
|
+
const palette = typeof colors === 'string' ? getPalette(colors, domain.length) : colors;
|
|
19
|
+
const color = scaleLinear<Color>().domain(domain).range(palette);
|
|
20
|
+
|
|
21
|
+
return d => {
|
|
22
|
+
const value = getAttrValue(attr, d);
|
|
23
|
+
return typeof value === 'number' && Number.isFinite(value) ? color(value) : nullColor;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
import * as cartoColors from 'cartocolor';
|
|
2
2
|
import {assert} from './utils';
|
|
3
3
|
|
|
4
|
+
export type Color = [r: number, b: number, g: number, a?: number];
|
|
5
|
+
|
|
4
6
|
export const DEFAULT_PALETTE = 'PurpOr';
|
|
5
|
-
export const NULL_COLOR = [204, 204, 204];
|
|
6
|
-
export const OTHERS_COLOR = [119, 119, 119];
|
|
7
|
+
export const NULL_COLOR: Color = [204, 204, 204];
|
|
8
|
+
export const OTHERS_COLOR: Color = [119, 119, 119];
|
|
9
|
+
|
|
10
|
+
interface CartoColorsPalette {
|
|
11
|
+
tags?: string[];
|
|
12
|
+
[key: number]: string[];
|
|
13
|
+
}
|
|
7
14
|
|
|
8
|
-
export default function getPalette(name, numCategories) {
|
|
9
|
-
const palette = cartoColors[name];
|
|
15
|
+
export default function getPalette(name: string, numCategories: number): Color[] {
|
|
16
|
+
const palette: CartoColorsPalette | undefined = cartoColors[name];
|
|
10
17
|
let paletteIndex = numCategories;
|
|
11
18
|
|
|
12
19
|
assert(palette, `Palette "${name}" not found. Expected a CARTOColors string`);
|
|
@@ -33,7 +40,7 @@ export default function getPalette(name, numCategories) {
|
|
|
33
40
|
return colors.map(c => hexToRgb(c));
|
|
34
41
|
}
|
|
35
42
|
|
|
36
|
-
export function hexToRgb(hex) {
|
|
43
|
+
export function hexToRgb(hex: string): Color {
|
|
37
44
|
// Evaluate #ABC
|
|
38
45
|
let result = /^#?([a-f\d]{1})([a-f\d]{1})([a-f\d]{1})$/i.exec(hex);
|
|
39
46
|
|
|
@@ -68,16 +75,12 @@ export function hexToRgb(hex) {
|
|
|
68
75
|
// Evaluate #ABCDEFAF
|
|
69
76
|
result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
70
77
|
|
|
71
|
-
if (result) {
|
|
72
|
-
return [
|
|
73
|
-
parseInt(result[1], 16),
|
|
74
|
-
parseInt(result[2], 16),
|
|
75
|
-
parseInt(result[3], 16),
|
|
76
|
-
parseInt(result[4], 16)
|
|
77
|
-
];
|
|
78
|
-
}
|
|
79
|
-
|
|
80
78
|
assert(result, `Hexadecimal color "${hex}" was not parsed correctly`);
|
|
81
79
|
|
|
82
|
-
return
|
|
80
|
+
return [
|
|
81
|
+
parseInt(result[1], 16),
|
|
82
|
+
parseInt(result[2], 16),
|
|
83
|
+
parseInt(result[3], 16),
|
|
84
|
+
parseInt(result[4], 16)
|
|
85
|
+
];
|
|
83
86
|
}
|
|
@@ -1,23 +1,20 @@
|
|
|
1
1
|
const ALLOWED_ATTR_TYPES = Object.freeze(['function', 'string']);
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
type Row = {properties: Record<string, unknown>};
|
|
4
|
+
export type AttributeSelector = string | ((d: Row) => unknown);
|
|
5
|
+
|
|
6
|
+
export function getAttrValue(attr: AttributeSelector, d: Row): unknown {
|
|
4
7
|
assert(typeof d === 'object', 'Expected "data" to be an object');
|
|
5
8
|
assert(ALLOWED_ATTR_TYPES.includes(typeof attr), 'Expected "attr" to be a function or string');
|
|
6
9
|
|
|
7
10
|
// Is function
|
|
8
|
-
if (typeof attr ===
|
|
11
|
+
if (typeof attr === 'function') {
|
|
9
12
|
return attr(d);
|
|
10
13
|
}
|
|
11
|
-
|
|
12
|
-
// Is string
|
|
13
|
-
if (typeof attr === ALLOWED_ATTR_TYPES[1]) {
|
|
14
|
-
return d.properties[attr];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
return {};
|
|
14
|
+
return d.properties[attr];
|
|
18
15
|
}
|
|
19
16
|
|
|
20
|
-
export function assert(condition, message = '') {
|
|
17
|
+
export function assert(condition, message = ''): asserts condition {
|
|
21
18
|
if (!condition) {
|
|
22
19
|
throw new Error(`CARTO style error: ${message}`);
|
|
23
20
|
}
|
package/src/utils.ts
ADDED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/layers/carto-dynamic-tile-layer.js"],"names":["parseJSON","arrayBuffer","JSON","parse","TextDecoder","decode","parseCartoDynamicTile","options","formatTiles","cartoDynamicTile","features","CartoDynamicTileLoader","name","id","module","extensions","mimeTypes","category","worker","parseSync","CartoDynamicTileLayer","tile","url","state","data","Promise","reject","loadOptions","getLoadOptions","props","fetch","signal","mimeType","log","assert","includes","cartoBinaryTile","propName","layer","autoHighlight","bbox","west","south","east","north","ClipExtension","clipBounds","subLayer","GeoJsonLayer","MVTLayer","layerName","defaultProps","loaders"],"mappings":"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","sourcesContent":["/* global TextDecoder */\nimport {log} from '@deck.gl/core';\nimport {ClipExtension} from '@deck.gl/extensions';\nimport {MVTLayer, _getURLFromTemplate} from '@deck.gl/geo-layers';\nimport {GeoJsonLayer} from '@deck.gl/layers';\nimport {geojsonToBinary} from '@loaders.gl/gis';\nimport {encodeParameter} from '../api/maps-api-common';\n\nfunction parseJSON(arrayBuffer) {\n return JSON.parse(new TextDecoder().decode(arrayBuffer));\n}\n\nfunction parseCartoDynamicTile(arrayBuffer, options) {\n if (!arrayBuffer) return null;\n const formatTiles = options && options.cartoDynamicTile && options.cartoDynamicTile.formatTiles;\n if (formatTiles === 'geojson') return geojsonToBinary(parseJSON(arrayBuffer).features);\n return null;\n}\n\nconst CartoDynamicTileLoader = {\n name: 'CARTO Dynamic Tile',\n id: 'cartoDynamicTile',\n module: 'carto',\n extensions: ['pbf'],\n mimeTypes: ['application/x-protobuf'],\n category: 'geometry',\n worker: false,\n parse: async (arrayBuffer, options) => parseCartoDynamicTile(arrayBuffer, options),\n parseSync: parseCartoDynamicTile,\n options: {\n cartoDynamicTile: {\n formatTiles: 'geojson'\n }\n }\n};\n\nexport default class CartoDynamicTileLayer extends MVTLayer {\n getTileData(tile) {\n let url = _getURLFromTemplate(this.state.data, tile);\n if (!url) {\n return Promise.reject('Invalid URL');\n }\n\n let loadOptions = this.getLoadOptions();\n const {fetch, formatTiles} = this.props;\n const {signal} = tile;\n\n loadOptions = {\n ...loadOptions,\n mimeType: 'application/x-protobuf'\n };\n\n if (formatTiles) {\n log.assert(\n ['geojson'].includes(formatTiles),\n `Invalid value for formatTiles: ${formatTiles}`\n );\n url += `&${encodeParameter('formatTiles', formatTiles)}`;\n loadOptions.cartoBinaryTile = {formatTiles};\n }\n\n return fetch(url, {propName: 'data', layer: this, loadOptions, signal});\n }\n\n renderSubLayers(props) {\n if (props.data === null) {\n return null;\n }\n\n props.autoHighlight = false;\n\n const {\n bbox: {west, south, east, north}\n } = props.tile;\n props.extensions = [new ClipExtension()];\n props.clipBounds = [west, south, east, north];\n\n const subLayer = new GeoJsonLayer({\n ...props\n });\n return subLayer;\n }\n}\n\nCartoDynamicTileLayer.layerName = 'CartoDynamicTileLayer';\nCartoDynamicTileLayer.defaultProps = {...MVTLayer.defaultProps, loaders: [CartoDynamicTileLoader]};\n"],"file":"carto-dynamic-tile-layer.js"}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { log } from '@deck.gl/core';
|
|
2
|
-
import { ClipExtension } from '@deck.gl/extensions';
|
|
3
|
-
import { MVTLayer, _getURLFromTemplate } from '@deck.gl/geo-layers';
|
|
4
|
-
import { GeoJsonLayer } from '@deck.gl/layers';
|
|
5
|
-
import { geojsonToBinary } from '@loaders.gl/gis';
|
|
6
|
-
import { encodeParameter } from '../api/maps-api-common';
|
|
7
|
-
|
|
8
|
-
function parseJSON(arrayBuffer) {
|
|
9
|
-
return JSON.parse(new TextDecoder().decode(arrayBuffer));
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function parseCartoDynamicTile(arrayBuffer, options) {
|
|
13
|
-
if (!arrayBuffer) return null;
|
|
14
|
-
const formatTiles = options && options.cartoDynamicTile && options.cartoDynamicTile.formatTiles;
|
|
15
|
-
if (formatTiles === 'geojson') return geojsonToBinary(parseJSON(arrayBuffer).features);
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const CartoDynamicTileLoader = {
|
|
20
|
-
name: 'CARTO Dynamic Tile',
|
|
21
|
-
id: 'cartoDynamicTile',
|
|
22
|
-
module: 'carto',
|
|
23
|
-
extensions: ['pbf'],
|
|
24
|
-
mimeTypes: ['application/x-protobuf'],
|
|
25
|
-
category: 'geometry',
|
|
26
|
-
worker: false,
|
|
27
|
-
parse: async (arrayBuffer, options) => parseCartoDynamicTile(arrayBuffer, options),
|
|
28
|
-
parseSync: parseCartoDynamicTile,
|
|
29
|
-
options: {
|
|
30
|
-
cartoDynamicTile: {
|
|
31
|
-
formatTiles: 'geojson'
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
export default class CartoDynamicTileLayer extends MVTLayer {
|
|
36
|
-
getTileData(tile) {
|
|
37
|
-
let url = _getURLFromTemplate(this.state.data, tile);
|
|
38
|
-
|
|
39
|
-
if (!url) {
|
|
40
|
-
return Promise.reject('Invalid URL');
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
let loadOptions = this.getLoadOptions();
|
|
44
|
-
const {
|
|
45
|
-
fetch,
|
|
46
|
-
formatTiles
|
|
47
|
-
} = this.props;
|
|
48
|
-
const {
|
|
49
|
-
signal
|
|
50
|
-
} = tile;
|
|
51
|
-
loadOptions = { ...loadOptions,
|
|
52
|
-
mimeType: 'application/x-protobuf'
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
if (formatTiles) {
|
|
56
|
-
log.assert(['geojson'].includes(formatTiles), "Invalid value for formatTiles: ".concat(formatTiles));
|
|
57
|
-
url += "&".concat(encodeParameter('formatTiles', formatTiles));
|
|
58
|
-
loadOptions.cartoBinaryTile = {
|
|
59
|
-
formatTiles
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return fetch(url, {
|
|
64
|
-
propName: 'data',
|
|
65
|
-
layer: this,
|
|
66
|
-
loadOptions,
|
|
67
|
-
signal
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
renderSubLayers(props) {
|
|
72
|
-
if (props.data === null) {
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
props.autoHighlight = false;
|
|
77
|
-
const {
|
|
78
|
-
bbox: {
|
|
79
|
-
west,
|
|
80
|
-
south,
|
|
81
|
-
east,
|
|
82
|
-
north
|
|
83
|
-
}
|
|
84
|
-
} = props.tile;
|
|
85
|
-
props.extensions = [new ClipExtension()];
|
|
86
|
-
props.clipBounds = [west, south, east, north];
|
|
87
|
-
const subLayer = new GeoJsonLayer({ ...props
|
|
88
|
-
});
|
|
89
|
-
return subLayer;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
CartoDynamicTileLayer.layerName = 'CartoDynamicTileLayer';
|
|
94
|
-
CartoDynamicTileLayer.defaultProps = { ...MVTLayer.defaultProps,
|
|
95
|
-
loaders: [CartoDynamicTileLoader]
|
|
96
|
-
};
|
|
97
|
-
//# sourceMappingURL=carto-dynamic-tile-layer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/layers/carto-dynamic-tile-layer.js"],"names":["log","ClipExtension","MVTLayer","_getURLFromTemplate","GeoJsonLayer","geojsonToBinary","encodeParameter","parseJSON","arrayBuffer","JSON","parse","TextDecoder","decode","parseCartoDynamicTile","options","formatTiles","cartoDynamicTile","features","CartoDynamicTileLoader","name","id","module","extensions","mimeTypes","category","worker","parseSync","CartoDynamicTileLayer","getTileData","tile","url","state","data","Promise","reject","loadOptions","getLoadOptions","fetch","props","signal","mimeType","assert","includes","cartoBinaryTile","propName","layer","renderSubLayers","autoHighlight","bbox","west","south","east","north","clipBounds","subLayer","layerName","defaultProps","loaders"],"mappings":"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","sourcesContent":["/* global TextDecoder */\nimport {log} from '@deck.gl/core';\nimport {ClipExtension} from '@deck.gl/extensions';\nimport {MVTLayer, _getURLFromTemplate} from '@deck.gl/geo-layers';\nimport {GeoJsonLayer} from '@deck.gl/layers';\nimport {geojsonToBinary} from '@loaders.gl/gis';\nimport {encodeParameter} from '../api/maps-api-common';\n\nfunction parseJSON(arrayBuffer) {\n return JSON.parse(new TextDecoder().decode(arrayBuffer));\n}\n\nfunction parseCartoDynamicTile(arrayBuffer, options) {\n if (!arrayBuffer) return null;\n const formatTiles = options && options.cartoDynamicTile && options.cartoDynamicTile.formatTiles;\n if (formatTiles === 'geojson') return geojsonToBinary(parseJSON(arrayBuffer).features);\n return null;\n}\n\nconst CartoDynamicTileLoader = {\n name: 'CARTO Dynamic Tile',\n id: 'cartoDynamicTile',\n module: 'carto',\n extensions: ['pbf'],\n mimeTypes: ['application/x-protobuf'],\n category: 'geometry',\n worker: false,\n parse: async (arrayBuffer, options) => parseCartoDynamicTile(arrayBuffer, options),\n parseSync: parseCartoDynamicTile,\n options: {\n cartoDynamicTile: {\n formatTiles: 'geojson'\n }\n }\n};\n\nexport default class CartoDynamicTileLayer extends MVTLayer {\n getTileData(tile) {\n let url = _getURLFromTemplate(this.state.data, tile);\n if (!url) {\n return Promise.reject('Invalid URL');\n }\n\n let loadOptions = this.getLoadOptions();\n const {fetch, formatTiles} = this.props;\n const {signal} = tile;\n\n loadOptions = {\n ...loadOptions,\n mimeType: 'application/x-protobuf'\n };\n\n if (formatTiles) {\n log.assert(\n ['geojson'].includes(formatTiles),\n `Invalid value for formatTiles: ${formatTiles}`\n );\n url += `&${encodeParameter('formatTiles', formatTiles)}`;\n loadOptions.cartoBinaryTile = {formatTiles};\n }\n\n return fetch(url, {propName: 'data', layer: this, loadOptions, signal});\n }\n\n renderSubLayers(props) {\n if (props.data === null) {\n return null;\n }\n\n props.autoHighlight = false;\n\n const {\n bbox: {west, south, east, north}\n } = props.tile;\n props.extensions = [new ClipExtension()];\n props.clipBounds = [west, south, east, north];\n\n const subLayer = new GeoJsonLayer({\n ...props\n });\n return subLayer;\n }\n}\n\nCartoDynamicTileLayer.layerName = 'CartoDynamicTileLayer';\nCartoDynamicTileLayer.defaultProps = {...MVTLayer.defaultProps, loaders: [CartoDynamicTileLoader]};\n"],"file":"carto-dynamic-tile-layer.js"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
export const DEFAULT_USER_COMPONENT_IN_URL = '{user}';
|
|
2
|
-
export const DEFAULT_REGION_COMPONENT_IN_URL = '{region}';
|
|
3
|
-
|
|
4
|
-
export const API_VERSIONS = {
|
|
5
|
-
V1: 'v1',
|
|
6
|
-
V2: 'v2',
|
|
7
|
-
V3: 'v3'
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
export const DEFAULT_MAPS_URL_FORMAT = {
|
|
11
|
-
[API_VERSIONS.V1]: `https://${DEFAULT_USER_COMPONENT_IN_URL}.carto.com/api/v1/map`,
|
|
12
|
-
[API_VERSIONS.V2]: `https://maps-api-v2.${DEFAULT_REGION_COMPONENT_IN_URL}.carto.com/user/${DEFAULT_USER_COMPONENT_IN_URL}`
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export const MAP_TYPES = {
|
|
16
|
-
QUERY: 'query',
|
|
17
|
-
TABLE: 'table',
|
|
18
|
-
TILESET: 'tileset'
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
// AVAILABLE FORMATS
|
|
22
|
-
export const FORMATS = {
|
|
23
|
-
GEOJSON: 'geojson',
|
|
24
|
-
NDJSON: 'ndjson',
|
|
25
|
-
TILEJSON: 'tilejson',
|
|
26
|
-
JSON: 'json'
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Simple encode parameter
|
|
31
|
-
*/
|
|
32
|
-
export function encodeParameter(name, value) {
|
|
33
|
-
return `${name}=${encodeURIComponent(value)}`;
|
|
34
|
-
}
|
package/src/basemap.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
const base_url = 'https://basemaps.cartocdn.com/gl/{basemap}-gl-style/style.json';
|
|
2
|
-
|
|
3
|
-
export default {
|
|
4
|
-
VOYAGER: base_url.replace('{basemap}', 'voyager'),
|
|
5
|
-
POSITRON: base_url.replace('{basemap}', 'positron'),
|
|
6
|
-
DARK_MATTER: base_url.replace('{basemap}', 'dark-matter'),
|
|
7
|
-
VOYAGER_NOLABELS: base_url.replace('{basemap}', 'voyager-nolabels'),
|
|
8
|
-
POSITRON_NOLABELS: base_url.replace('{basemap}', 'positron-nolabels'),
|
|
9
|
-
DARK_MATTER_NOLABELS: base_url.replace('{basemap}', 'dark-matter-nolabels')
|
|
10
|
-
};
|