UNPKG

rlayers

Version:

React Components for OpenLayers

143 lines (138 loc) 3.51 kB
import {FeatureLike} from 'ol/Feature'; import {Style, Text, Fill, Stroke, Circle} from 'ol/style'; export function styleTown(size: number, feature: FeatureLike): Style { let width: number; let font: string; switch (size) { case 0: width = 6; font = '2em'; break; case 1: width = 5; font = '1.2em'; break; case 2: width = 3; font = '0.8em'; break; default: width = 1; font = '0.5em'; break; } font += ' helvetica, sans-serif'; const color1 = '#00007f'; const color2 = '#ffffff'; const style = new Style({ image: new Circle({ fill: new Fill({ color: color1 }), radius: width, stroke: new Stroke({ color: color1, width: width }) }), text: new Text({ font: font, text: feature.get('n'), fill: new Fill({ color: color2 }), stroke: new Stroke({ color: color1, width: 2 }) }) }); return style; } export const styleBorder = new Style({ stroke: new Stroke({ color: 'blue', width: 2 }) }); // Styles inspired from https://openlayers.org/en/latest/examples/osm-vector-tiles.html const roadStyleCache: Record<string, Style> = {}; const roadColor: Record<string, string> = { motorway: '#776', trunk: '#ccb', highway: '#f39' }; export const buildingStyle = new Style({ fill: new Fill({ color: '#666' }), stroke: new Stroke({ color: '#444', width: 1 }) }); export const waterStyle = new Style({ fill: new Fill({ color: '#9db9e8' }) }); export const boundaryStyle = new Style({ stroke: new Stroke({ color: '#8B008B', width: 2 }) }); export const roadStyle = function (feature: FeatureLike) { const kind = feature.get('class'); const railway = feature.get('railway'); const sort_key = feature.get('sort_key'); const styleKey = kind + '/' + railway + '/' + sort_key; let style = roadStyleCache[styleKey]; if (!style) { let color, width; if (railway) { color = '#7de'; width = 1; } else { color = roadColor[kind]; width = kind == 'highway' ? 1.5 : 1; } style = new Style({ stroke: new Stroke({ color: color, width: width }), zIndex: sort_key }); roadStyleCache[styleKey] = style; } return style; }; const placeBase = new Style({ image: new Circle({ radius: 5, fill: new Fill({ color: '#000080' }) }) }); const textStroke = new Stroke({ color: 'white', width: 2 }); export const placeStyle = function (feature: FeatureLike): Style { if (feature.get('class') == 'country') return null as unknown as Style; if (feature.get('name')) { const style = placeBase.clone(); style.setText( new Text({ text: feature.get('name'), offsetY: -5, font: 'bold 16px sans-serif', stroke: textStroke }) ); return style; } return null as unknown as Style; };