Instead of deciding whether to batch fills and strokes by looking at the opacity of the style, we now rely on user input.
143 lines
3.8 KiB
JavaScript
143 lines
3.8 KiB
JavaScript
goog.require('ol.Map');
|
|
goog.require('ol.View');
|
|
goog.require('ol.format.TopoJSON');
|
|
goog.require('ol.layer.VectorTile');
|
|
goog.require('ol.proj');
|
|
goog.require('ol.source.VectorTile');
|
|
goog.require('ol.style.Fill');
|
|
goog.require('ol.style.Stroke');
|
|
goog.require('ol.style.Style');
|
|
goog.require('ol.tilegrid');
|
|
|
|
|
|
var format = new ol.format.TopoJSON();
|
|
var tileGrid = ol.tilegrid.createXYZ({maxZoom: 19});
|
|
var roadStyleCache = {};
|
|
var roadColor = {
|
|
'major_road': '#776',
|
|
'minor_road': '#ccb',
|
|
'highway': '#f39'
|
|
};
|
|
var landuseStyleCache = {};
|
|
var buildingStyle = new ol.style.Style({
|
|
fill: new ol.style.Fill({
|
|
color: '#666',
|
|
opacity: 0.4
|
|
}),
|
|
stroke: new ol.style.Stroke({
|
|
color: '#444',
|
|
width: 1
|
|
})
|
|
});
|
|
|
|
var map = new ol.Map({
|
|
layers: [
|
|
new ol.layer.VectorTile({
|
|
source: new ol.source.VectorTile({
|
|
format: format,
|
|
tileGrid: tileGrid,
|
|
url: 'http://{a-c}.tile.openstreetmap.us/' +
|
|
'vectiles-water-areas/{z}/{x}/{y}.topojson'
|
|
}),
|
|
style: new ol.style.Style({
|
|
fill: new ol.style.Fill({
|
|
color: '#9db9e8'
|
|
})
|
|
})
|
|
}),
|
|
new ol.layer.VectorTile({
|
|
source: new ol.source.VectorTile({
|
|
format: format,
|
|
tileGrid: tileGrid,
|
|
url: 'http://{a-c}.tile.openstreetmap.us/' +
|
|
'vectiles-highroad/{z}/{x}/{y}.topojson'
|
|
}),
|
|
style: function(feature) {
|
|
var kind = feature.get('kind');
|
|
var railway = feature.get('railway');
|
|
var sort_key = feature.get('sort_key');
|
|
var styleKey = kind + '/' + railway + '/' + sort_key;
|
|
var style = roadStyleCache[styleKey];
|
|
if (!style) {
|
|
var color, width;
|
|
if (railway) {
|
|
color = '#7de';
|
|
width = 1;
|
|
} else {
|
|
color = roadColor[kind];
|
|
width = kind == 'highway' ? 1.5 : 1;
|
|
}
|
|
style = new ol.style.Style({
|
|
stroke: new ol.style.Stroke({
|
|
color: color,
|
|
width: width
|
|
}),
|
|
zIndex: sort_key
|
|
});
|
|
roadStyleCache[styleKey] = style;
|
|
}
|
|
return style;
|
|
}
|
|
}),
|
|
new ol.layer.VectorTile({
|
|
source: new ol.source.VectorTile({
|
|
format: format,
|
|
tileGrid: tileGrid,
|
|
url: 'http://{a-c}.tile.openstreetmap.us/' +
|
|
'vectiles-buildings/{z}/{x}/{y}.topojson'
|
|
}),
|
|
style: function(f, resolution) {
|
|
return (resolution < 10) ? buildingStyle : null;
|
|
}
|
|
}),
|
|
new ol.layer.VectorTile({
|
|
source: new ol.source.VectorTile({
|
|
format: format,
|
|
overlaps: false,
|
|
tileGrid: tileGrid,
|
|
url: 'http://{a-c}.tile.openstreetmap.us/' +
|
|
'vectiles-land-usages/{z}/{x}/{y}.topojson'
|
|
}),
|
|
visible: false,
|
|
style: function(feature) {
|
|
var kind = feature.get('kind');
|
|
var styleKey = kind;
|
|
var style = landuseStyleCache[styleKey];
|
|
if (!style) {
|
|
var color, width;
|
|
color = {
|
|
'parking': '#ddd',
|
|
'industrial': '#aaa',
|
|
'urban area': '#aaa',
|
|
'park': '#76C759',
|
|
'school': '#DA10E7',
|
|
'garden': '#76C759',
|
|
'pitch': '#D58F8D',
|
|
'scrub': '#3E7D28',
|
|
'residential': '#4C9ED9'
|
|
}[kind];
|
|
width = kind == 'highway' ? 1.5 : 1;
|
|
style = new ol.style.Style({
|
|
stroke: new ol.style.Stroke({
|
|
color: color,
|
|
width: width
|
|
}),
|
|
fill: new ol.style.Fill({
|
|
color: color,
|
|
opacity: 0.5
|
|
})
|
|
});
|
|
landuseStyleCache[styleKey] = style;
|
|
}
|
|
return style;
|
|
}
|
|
})
|
|
],
|
|
target: 'map',
|
|
view: new ol.View({
|
|
center: ol.proj.fromLonLat([-74.0064, 40.7142]),
|
|
maxZoom: 19,
|
|
zoom: 15
|
|
})
|
|
});
|