409 lines
15 KiB
JavaScript
409 lines
15 KiB
JavaScript
// Mapbox access token - request your own at http://mabobox.com
|
|
var accessToken =
|
|
'pk.eyJ1IjoiYWhvY2V2YXIiLCJhIjoiRk1kMWZaSSJ9.E5BkluenyWQMsBLsuByrmg';
|
|
|
|
var constants = {
|
|
'@sans': '"Open Sans", "Arial Unicode MS"',
|
|
'@land': '#f8f4f0',
|
|
'@water': '#a0c8f0',
|
|
'@admin': '#9e9cab',
|
|
'@admin-opacity': 0.5,
|
|
'@park': '#d8e8c8',
|
|
'@cemetery': '#e0e4dd',
|
|
'@hospital': '#fde',
|
|
'@school': '#f0e8f8',
|
|
'@wood': '#6a4',
|
|
'@building': '#f2eae2',
|
|
'@building_shadow': '#dfdbd7',
|
|
'@aeroway': '#f0ede9',
|
|
'@motorway': '#fc8',
|
|
'@motorway_casing': '#e9ac77',
|
|
'@motorway_tunnel': '#ffdaa6',
|
|
'@main': '#fea',
|
|
'@main_tunnel': '#fff4c6',
|
|
'@street': '#fff',
|
|
'@street_limited': '#f3f3f3',
|
|
'@street_casing': '#cfcdca',
|
|
'@path': '#cba',
|
|
'@rail': '#bbb',
|
|
'@text': '#334',
|
|
'@text_halo': 'rgba(255,255,255,0.8)',
|
|
'@marine_text': '#74aee9',
|
|
'@marine_text_halo': 'rgba(255,255,255,0.7)',
|
|
'@poi_text': '#666',
|
|
'@poi_text_halo': '#ffffff',
|
|
'@maki': '#666',
|
|
'@point_translate': [0, -30],
|
|
'@motorway_width': {
|
|
'base': 1.2,
|
|
'stops': [[6.5, 0], [7, 0.5], [20, 18]]
|
|
},
|
|
'@motorway_casing_width': {
|
|
'base': 1.2,
|
|
'stops': [[5, 0.4], [6, 0.6], [7, 1.5], [20, 22]]
|
|
},
|
|
'@motorway_link_width': {
|
|
'base': 1.2,
|
|
'stops': [[12.5, 0], [13, 1.5], [20, 10]]
|
|
},
|
|
'@motorway_link_casing_width': {
|
|
'base': 1.2,
|
|
'stops': [[12, 1], [13, 3], [20, 13]]
|
|
},
|
|
'@main_width': {
|
|
'base': 1.2,
|
|
'stops': [[6.5, 0], [7, 0.5], [20, 14]]
|
|
},
|
|
'@main_casing_width': {
|
|
'base': 1.2,
|
|
'stops': [[5, 0.1], [6, 0.2], [7, 1.5], [20, 18]]
|
|
},
|
|
'@street_width': {
|
|
'base': 1.2,
|
|
'stops': [[13.5, 0], [14, 2.5], [20, 11.5]]
|
|
},
|
|
'@street_casing_width': {
|
|
'base': 1.2,
|
|
'stops': [[12, 0.5], [13, 1], [14, 4], [20, 15]]
|
|
},
|
|
'@service_casing_width': {
|
|
'base': 1.2,
|
|
'stops': [[15, 1], [16, 4], [20, 11]]
|
|
},
|
|
'@service_width': {
|
|
'base': 1.2,
|
|
'stops': [[15.5, 0], [16, 2], [20, 7.5]]
|
|
},
|
|
'@path_width': {
|
|
'base': 1.2,
|
|
'stops': [[15, 1.2], [20, 4]]
|
|
},
|
|
'@rail_width': {
|
|
'base': 1.4,
|
|
'stops': [[14, 0.4], [15, 0.75], [20, 2]]
|
|
},
|
|
'@rail_hatch_width': {
|
|
'base': 1.4,
|
|
'stops': [[14.5, 0], [15, 3], [20, 8]]
|
|
},
|
|
'@admin_level_3_width': {
|
|
'base': 1,
|
|
'stops': [[4, 0.4], [5, 1], [12, 3]]
|
|
},
|
|
'@admin_level_2_width': {
|
|
'base': 1,
|
|
'stops': [[4, 1.4], [5, 2], [12, 8]]
|
|
}
|
|
};
|
|
|
|
var map;
|
|
|
|
function base(value) {
|
|
return value.base;
|
|
}
|
|
|
|
var fill = new ol.style.Fill({
|
|
color: ''
|
|
});
|
|
var stroke = new ol.style.Stroke({
|
|
color: '',
|
|
width: 1
|
|
});
|
|
var polygon = new ol.style.Style({
|
|
fill: fill
|
|
});
|
|
var strokedPolygon = new ol.style.Style({
|
|
fill: fill,
|
|
stroke: stroke
|
|
});
|
|
var line = new ol.style.Style({
|
|
stroke: stroke
|
|
});
|
|
var text = new ol.style.Style({
|
|
text: new ol.style.Text({
|
|
text: '',
|
|
fill: fill,
|
|
stroke: stroke
|
|
})
|
|
});
|
|
var styles = [];
|
|
function styleFunction(feature, resolution) {
|
|
var length = 0;
|
|
var layer = feature.get('layer');
|
|
var cls = feature.get('class');
|
|
var type = feature.get('type');
|
|
var scalerank = feature.get('scalerank');
|
|
var labelrank = feature.get('labelrank');
|
|
var adminLevel = feature.get('admin_level');
|
|
var maritime = feature.get('maritime');
|
|
var disputed = feature.get('disputed');
|
|
var geom = feature.getGeometry().getType();
|
|
var zoom = map.getView().getZoom();
|
|
if (layer == 'landuse' && cls == 'park') {
|
|
fill.setColor(constants['@park']);
|
|
styles[length++] = polygon;
|
|
} else if (layer == 'landuse' && cls == 'cemetery') {
|
|
fill.setColor(constants['@cemetery']);
|
|
styles[length++] = polygon;
|
|
} else if (layer == 'landuse' && cls == 'hospital') {
|
|
fill.setColor(constants['@hospital']);
|
|
styles[length++] = polygon;
|
|
} else if (layer == 'landuse' && cls == 'school') {
|
|
fill.setColor(constants['@school']);
|
|
styles[length++] = polygon;
|
|
} else if (layer == 'landuse' && cls == 'wood') {
|
|
fill.setColor('rgb(233,238,223)');
|
|
styles[length++] = polygon;
|
|
} else if (layer == 'waterway' &&
|
|
cls != 'river' && cls != 'stream' && cls != 'canal') {
|
|
stroke.setColor(constants['@water']);
|
|
stroke.setWidth(1.3);
|
|
styles[length++] = line;
|
|
} else if (layer == 'waterway' && cls == 'river') {
|
|
stroke.setColor(constants['@water']);
|
|
stroke.setWidth(1.2);
|
|
styles[length++] = line;
|
|
} else if (layer == 'waterway' && (cls == 'stream' || cls == 'canal')) {
|
|
stroke.setColor(constants['@water']);
|
|
stroke.setWidth(1.3);
|
|
styles[length++] = line;
|
|
} else if (layer == 'water') {
|
|
fill.setColor(constants['@water']);
|
|
styles[length++] = polygon;
|
|
} else if (layer == 'aeroway' && geom == 'Polygon') {
|
|
fill.setColor('rgb(242,239,235)');
|
|
styles[length++] = polygon;
|
|
} else if (layer == 'aeroway' && geom == 'LineString' && zoom >= 11) {
|
|
stroke.setColor(constants['@aeroway']);
|
|
stroke.setWidth(1.2);
|
|
styles[length++] = line;
|
|
} else if (layer == 'building') {
|
|
fill.setColor(constants['@building']);
|
|
stroke.setColor(constants['@building_shadow']);
|
|
stroke.setWidth(1);
|
|
styles[length++] = strokedPolygon;
|
|
} else if (layer == 'tunnel' && cls == 'motorway_link') {
|
|
stroke.setColor(constants['@motorway_casing']);
|
|
stroke.setWidth(base(constants['@motorway_link_casing_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'tunnel' && cls == 'service') {
|
|
stroke.setColor(constants['@street_casing']);
|
|
stroke.setWidth(base(constants['@service_casing_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'tunnel' &&
|
|
(cls == 'street' || cls == 'street_limited')) {
|
|
stroke.setColor(constants['@street_casing']);
|
|
stroke.setWidth(base(constants['@street_casing_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'tunnel' && cls == 'main' && zoom >= 7) {
|
|
stroke.setColor(constants['@motorway_casing']);
|
|
stroke.setWidth(base(constants['@main_casing_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'tunnel' && cls == 'motorway') {
|
|
stroke.setColor(constants['@motorway_casing']);
|
|
stroke.setWidth(base(constants['@motorway_casing_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'tunnel' && cls == 'path') {
|
|
stroke.setColor(constants['@path']);
|
|
stroke.setWidth(base(constants['@path_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'tunnel' && cls == 'major_rail') {
|
|
stroke.setColor(constants['@rail']);
|
|
stroke.setWidth(base(constants['@rail_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'road' && cls == 'motorway_link') {
|
|
stroke.setColor(constants['@motorway_casing']);
|
|
stroke.setWidth(base(constants['@motorway_link_casing_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'road' && (cls == 'street' || cls == 'street_limited') &&
|
|
geom == 'LineString') {
|
|
stroke.setColor(constants['@street_casing']);
|
|
stroke.setWidth(base(constants['@street_casing_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'road' && cls == 'main' && zoom >= 7) {
|
|
stroke.setColor(constants['@motorway_casing']);
|
|
stroke.setWidth(base(constants['@main_casing_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'road' && cls == 'motorway' && zoom >= 5) {
|
|
stroke.setColor(constants['@motorway_casing']);
|
|
stroke.setWidth(base(constants['@motorway_casing_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'road' && cls == 'path') {
|
|
stroke.setColor(constants['@path']);
|
|
stroke.setWidth(base(constants['@path_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'road' && cls == 'major_rail') {
|
|
stroke.setColor(constants['@rail']);
|
|
stroke.setWidth(base(constants['@rail_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'bridge' && cls == 'motorway_link') {
|
|
stroke.setColor(constants['@motorway_casing']);
|
|
stroke.setWidth(base(constants['@motorway_link_casing_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'bridge' && cls == 'motorway') {
|
|
stroke.setColor(constants['@motorway_casing']);
|
|
stroke.setWidth(base(constants['@motorway_casing_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'bridge' && cls == 'service') {
|
|
stroke.setColor(constants['@street_casing']);
|
|
stroke.setWidth(base(constants['@service_casing_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'bridge' &&
|
|
(cls == 'street' || cls == 'street_limited')) {
|
|
stroke.setColor(constants['@street_casing']);
|
|
stroke.setWidth(base(constants['@street_casing_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'bridge' && cls == 'main' && zoom >= 7) {
|
|
stroke.setColor(constants['@motorway_casing']);
|
|
stroke.setWidth(base(constants['@main_casing_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'bridge' && cls == 'path') {
|
|
stroke.setColor(constants['@path']);
|
|
stroke.setWidth(base(constants['@path_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'bridge' && cls == 'major_rail') {
|
|
stroke.setColor(constants['@rail']);
|
|
stroke.setWidth(base(constants['@rail_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'admin' && adminLevel >= 3 && maritime === 0) {
|
|
stroke.setColor(constants['@admin']);
|
|
stroke.setWidth(base(constants['@admin_level_3_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'admin' && adminLevel == 2 &&
|
|
disputed === 0 && maritime === 0) {
|
|
stroke.setColor(constants['@admin']);
|
|
stroke.setWidth(base(constants['@admin_level_2_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'admin' && adminLevel == 2 &&
|
|
disputed === 1 && maritime === 0) {
|
|
stroke.setColor(constants['@admin']);
|
|
stroke.setWidth(base(constants['@admin_level_2_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'admin' && adminLevel >= 3 && maritime === 1) {
|
|
stroke.setColor(constants['@water']);
|
|
stroke.setWidth(base(constants['@admin_level_3_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'admin' && adminLevel == 2 && maritime === 1) {
|
|
stroke.setColor(constants['@water']);
|
|
stroke.setWidth(base(constants['@admin_level_2_width']));
|
|
styles[length++] = line;
|
|
} else if (layer == 'country_label' && scalerank === 1) {
|
|
text.getText().setText(feature.get('name_en'));
|
|
text.getText().setFont('bold 11px ' + constants['@sans']);
|
|
fill.setColor(constants['@text']);
|
|
stroke.setColor(constants['@text_halo']);
|
|
stroke.setWidth(2);
|
|
styles[length++] = text;
|
|
} else if (layer == 'country_label' && scalerank === 2 && zoom >= 3) {
|
|
text.getText().setText(feature.get('name_en'));
|
|
text.getText().setFont('bold 10px ' + constants['@sans']);
|
|
fill.setColor(constants['@text']);
|
|
stroke.setColor(constants['@text_halo']);
|
|
stroke.setWidth(2);
|
|
styles[length++] = text;
|
|
} else if (layer == 'country_label' && scalerank === 3 && zoom >= 4) {
|
|
text.getText().setText(feature.get('name_en'));
|
|
text.getText().setFont('bold 9px ' + constants['@sans']);
|
|
fill.setColor(constants['@text']);
|
|
stroke.setColor(constants['@text_halo']);
|
|
stroke.setWidth(2);
|
|
styles[length++] = text;
|
|
} else if (layer == 'country_label' && scalerank === 4 && zoom >= 5) {
|
|
text.getText().setText(feature.get('name_en'));
|
|
text.getText().setFont('bold 8px ' + constants['@sans']);
|
|
fill.setColor(constants['@text']);
|
|
stroke.setColor(constants['@text_halo']);
|
|
stroke.setWidth(2);
|
|
styles[length++] = text;
|
|
} else if (layer == 'marine_label' && labelrank === 1 && geom == 'Point') {
|
|
text.getText().setText(feature.get('name_en'));
|
|
text.getText().setFont('italic 11px ' + constants['@sans']);
|
|
fill.setColor(constants['@marine_text']);
|
|
stroke.setColor(constants['@text_halo']);
|
|
stroke.setWidth(0.75);
|
|
styles[length++] = text;
|
|
} else if (layer == 'marine_label' && labelrank === 2 && geom == 'Point') {
|
|
text.getText().setText(feature.get('name_en'));
|
|
text.getText().setFont('italic 11px ' + constants['@sans']);
|
|
fill.setColor(constants['@marine_text']);
|
|
stroke.setColor(constants['@text_halo']);
|
|
stroke.setWidth(0.75);
|
|
styles[length++] = text;
|
|
} else if (layer == 'marine_label' && labelrank === 3 && geom == 'Point') {
|
|
text.getText().setText(feature.get('name_en'));
|
|
text.getText().setFont('italic 10px ' + constants['@sans']);
|
|
fill.setColor(constants['@marine_text']);
|
|
stroke.setColor(constants['@text_halo']);
|
|
stroke.setWidth(0.75);
|
|
styles[length++] = text;
|
|
} else if (layer == 'marine_label' && labelrank === 4 && geom == 'Point') {
|
|
text.getText().setText(feature.get('name_en'));
|
|
text.getText().setFont('italic 9px ' + constants['@sans']);
|
|
fill.setColor(constants['@marine_text']);
|
|
stroke.setColor(constants['@text_halo']);
|
|
stroke.setWidth(0.75);
|
|
styles[length++] = text;
|
|
} else if (layer == 'place_label' && type == 'city' && zoom >= 7) {
|
|
text.getText().setText(feature.get('name_en'));
|
|
text.getText().setFont('11px ' + constants['@sans']);
|
|
fill.setColor('#333');
|
|
stroke.setColor(constants['@text_halo']);
|
|
stroke.setWidth(1.2);
|
|
styles[length++] = text;
|
|
} else if (layer == 'place_label' && type == 'town' && zoom >= 9) {
|
|
text.getText().setText(feature.get('name_en'));
|
|
text.getText().setFont('9px ' + constants['@sans']);
|
|
fill.setColor('#333');
|
|
stroke.setColor(constants['@text_halo']);
|
|
stroke.setWidth(1.2);
|
|
styles[length++] = text;
|
|
} else if (layer == 'place_label' && type == 'village' && zoom >= 12) {
|
|
text.getText().setText(feature.get('name_en'));
|
|
text.getText().setFont('8px ' + constants['@sans']);
|
|
fill.setColor('#333');
|
|
stroke.setColor(constants['@text_halo']);
|
|
stroke.setWidth(1.2);
|
|
styles[length++] = text;
|
|
} else if (layer == 'place_label' && zoom >= 13 &&
|
|
(type == 'hamlet' || type == 'suburb' || type == 'neighbourhood')) {
|
|
text.getText().setText(feature.get('name_en'));
|
|
text.getText().setFont('bold 9px "Arial Narrow"');
|
|
fill.setColor('#633');
|
|
stroke.setColor(constants['@text_halo']);
|
|
stroke.setWidth(1.2);
|
|
styles[length++] = text;
|
|
}
|
|
styles.length = length;
|
|
return styles;
|
|
}
|
|
|
|
map = new ol.Map({
|
|
layers: [
|
|
new ol.layer.VectorTile({
|
|
source: new ol.source.VectorTile({
|
|
rightHandedPolygons: true,
|
|
format: new ol.format.MVT({
|
|
flyweight: true
|
|
}),
|
|
tileGrid: ol.tilegrid.createXYZ({maxZoom: 22}),
|
|
tilePixelRatio: 16,
|
|
tileUrlFunction: function(tileCoord) {
|
|
return ('http://{a-d}.tiles.mapbox.com/v4/mapbox.mapbox-streets-v6/' +
|
|
'{z}/{x}/{y}.vector.pbf?access_token=' + accessToken)
|
|
.replace('{z}', String(tileCoord[0]))
|
|
.replace('{x}', String(tileCoord[1]))
|
|
.replace('{y}', String(-tileCoord[2] - 1))
|
|
.replace('{a-d}', 'abcd'.substr(
|
|
((tileCoord[1] << tileCoord[0]) + tileCoord[2]) % 4, 1));
|
|
}
|
|
}),
|
|
style: styleFunction
|
|
})
|
|
],
|
|
target: 'map',
|
|
view: new ol.View({
|
|
center: [1823849, 6143760],
|
|
zoom: 3
|
|
})
|
|
});
|