样式
创建样式
createStyle
调用了 createTextStyle 和 createCircleStyle 两个方法,分别用于创建文本样式和点样式。
点我查看代码
vue
<script lang="ts" setup>
import { createOpenStreetMapLayer, createVectorLayer, EPSG_4326, OlMap } from '@summeruse/ol'
import { Feature, Map as OLMap } from 'ol'
import { LineString, Point, Polygon } from 'ol/geom'
import { createStyle } from '.'
const olMap = new OLMap()
const osmLayer = createOpenStreetMapLayer()
olMap.addLayer(osmLayer)
const { source, layer } = createVectorLayer({
style: createStyle({
circleOptions: {
radius: 10,
fillOptions: {
color: 'red',
},
strokeOptions: {
color: 'black',
width: 4,
},
},
fillOptions: {
color: 'green',
},
strokeOptions: {
color: 'blue',
width: 5,
lineDash: [10, 10],
},
textOptions: {
text: 'hello',
font: '20px Calibri,sans-serif',
padding: [5, 5, 5, 5],
offsetY: 30,
fillOptions: {
color: 'red',
},
strokeOptions: {
color: 'black',
width: 4,
},
backgroundFillOptions: {
color: 'rgb(255, 255, 255)',
},
backgroundStrokeOptions: {
color: 'rgb(0, 0, 0)',
width: 4,
},
},
}),
})
olMap.addLayer(layer)
const point = new Feature({
geometry: new Point([120, 30]),
})
source.addFeature(point)
const line = new Feature({
geometry: new LineString([[120.1, 30.1], [120.2, 30.2]]),
})
source.addFeature(line)
const polygon = new Feature({
geometry: new Polygon([[[120.11, 30.15], [120.15, 30.25], [120.1, 30.2], [120.11, 30.15]]]),
})
source.addFeature(polygon)
</script>
<template>
<OlMap :ol-map :projection="EPSG_4326" :center="[120, 30]" :zoom="10" class="w-100% h-400px" />
</template>源代码
点我查看代码
ts
import { Circle, Fill, Icon, Stroke, Style, Text } from 'ol/style'
export type FillOptions = ConstructorParameters<typeof Fill>[0]
export type StrokeOptions = ConstructorParameters<typeof Stroke>[0]
export type IconOptions = ConstructorParameters<typeof Icon>[0]
export type _StyleOptions = ConstructorParameters<typeof Style>[0]
export type _CircleOptions = ConstructorParameters<typeof Circle>[0]
export type _TextOptions = ConstructorParameters<typeof Text>[0]
export type CircleOptions = _CircleOptions & {
fillOptions?: FillOptions
strokeOptions?: StrokeOptions
}
export type TextOptions = _TextOptions & {
fillOptions?: FillOptions
strokeOptions?: StrokeOptions
backgroundFillOptions?: FillOptions
backgroundStrokeOptions?: StrokeOptions
}
export type StyleOptions = _StyleOptions & {
fillOptions?: FillOptions
strokeOptions?: StrokeOptions
iconOptions?: IconOptions
circleOptions?: CircleOptions
textOptions?: TextOptions
}
export function createCircleStyle(options: CircleOptions) {
const { fillOptions, strokeOptions, ...rest } = options
return new Circle({
...rest,
fill: fillOptions ? new Fill(fillOptions) : undefined,
stroke: strokeOptions ? new Stroke(strokeOptions) : undefined,
})
}
export function createTextStyle(options: TextOptions) {
const { fillOptions, strokeOptions, backgroundFillOptions, backgroundStrokeOptions, ...rest }
= options
return new Text({
...rest,
fill: fillOptions ? new Fill(fillOptions) : undefined,
stroke: strokeOptions ? new Stroke(strokeOptions) : undefined,
backgroundFill: backgroundFillOptions ? new Fill(backgroundFillOptions) : undefined,
backgroundStroke: backgroundStrokeOptions ? new Stroke(backgroundStrokeOptions) : undefined,
})
}
export function createStyle(options: StyleOptions) {
const { fillOptions, strokeOptions, iconOptions, circleOptions, textOptions, stroke: _stroke, image: _image, fill: _fill, text: _text, ...rest } = options
const fill = _fill || (fillOptions ? new Fill(fillOptions) : undefined)
const stroke = _stroke || (strokeOptions ? new Stroke(strokeOptions) : undefined)
const image = _image || (iconOptions ? new Icon(iconOptions) : (circleOptions ? createCircleStyle(circleOptions) : undefined))
const text = _text || (textOptions ? createTextStyle(textOptions) : undefined)
return new Style({
...rest,
fill,
stroke,
image,
text,
})
}