效果展示

HTML结构
<template>
<div class="featruesStyle_BOX">
<div id="featruesStyle" class="featruesStyle-demo"></div>
<el-form ref="form" :model="form" label-width="120px" class="formClass">
<el-row :gutter="10">
<el-col :span="8">
<el-card>
<div
slot="header"
style="
display: flex;
justify-content: space-between;
line-height: 28px;
"
>
<span>点要素样式</span>
<el-button type="text" @click="PonitUp">更新</el-button>
</div>
<el-tabs v-model="activePoint">
<el-tab-pane label="图形样式" name="first_Point">
<el-form-item label="点大小(radius)">
<el-input v-model="point.Size"></el-input>
</el-form-item>
<el-form-item label="填充颜色(color)">
<el-color-picker v-model="point.FillColor"></el-color-picker>
</el-form-item>
<el-form-item label="边框颜色(color)">
<el-color-picker
v-model="point.StrokeColor"
></el-color-picker>
</el-form-item>
<el-form-item label="边框宽度(width)">
<el-input v-model="point.StrokeWidth"></el-input>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="文字样式" name="second_Point">
<el-form-item label="文字位置">
<el-select v-model="point.TextAglin" placeholder="请选择">
<el-option
v-for="item in TextAglinArray"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="文字基线">
<el-select v-model="point.TextBaseline" placeholder="请选择">
<el-option
v-for="item in TextBaselineArray"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="文字旋转角度">
<el-input v-model="point.TextRotation">
<span slot="append">°</span>
</el-input>
</el-form-item>
<el-form-item label="字体">
<el-select v-model="point.TextFont" placeholder="请选择">
<el-option
v-for="item in pointTextFontArray"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="粗细">
<el-select v-model="point.TextWeight" placeholder="请选择">
<el-option
v-for="item in TextWeightArray"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="大小">
<el-input v-model="point.TextSize">
<span slot="append">px</span>
</el-input>
</el-form-item>
<el-form-item label="x偏移量">
<el-input v-model="point.TextOffsetX"> </el-input>
</el-form-item>
<el-form-item label="y偏移量">
<el-input v-model="point.TextOffsetY"> </el-input>
</el-form-item>
<el-form-item label="外框颜色">
<el-color-picker v-model="point.TextColor"></el-color-picker>
</el-form-item>
<el-form-item label="外框宽度">
<el-input v-model="point.TextOutlineColor"></el-input>
</el-form-item>
</el-tab-pane>
</el-tabs>
</el-card>
</el-col>
<el-col :span="8">
<el-card>
<div
slot="header"
style="
display: flex;
justify-content: space-between;
line-height: 28px;
"
>
<span>线要素样式</span>
<el-button type="text" @click="LineUp">更新</el-button>
</div>
<el-tabs v-model="activeLine">
<el-tab-pane label="图形样式" name="first_Line">
<el-form-item label="边框颜色(color)">
<el-color-picker v-model="line.StrokeColor"></el-color-picker>
</el-form-item>
<el-form-item label="边框宽度(width)">
<el-input v-model="line.StrokeWidth"></el-input>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="文字样式" name="second_Line">
<el-form-item label="文字位置">
<el-select v-model="line.TextAglin" placeholder="请选择">
<el-option
v-for="item in TextAglinArray"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="文字基线">
<el-select v-model="line.TextBaseline" placeholder="请选择">
<el-option
v-for="item in TextBaselineArray"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="文字旋转角度">
<el-input v-model="line.TextRotation">
<span slot="append">°</span>
</el-input>
</el-form-item>
<el-form-item label="字体">
<el-select v-model="line.TextFont" placeholder="请选择">
<el-option
v-for="item in pointTextFontArray"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="粗细">
<el-select v-model="line.TextWeight" placeholder="请选择">
<el-option
v-for="item in TextWeightArray"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="大小">
<el-input v-model="line.TextSize">
<span slot="append">px</span>
</el-input>
</el-form-item>
<el-form-item label="x偏移量">
<el-input v-model="line.TextOffsetX"> </el-input>
</el-form-item>
<el-form-item label="y偏移量">
<el-input v-model="line.TextOffsetY"> </el-input>
</el-form-item>
<el-form-item label="外框颜色">
<el-color-picker v-model="line.TextColor"></el-color-picker>
</el-form-item>
<el-form-item label="外框宽度">
<el-input v-model="line.TextOutlineColor"></el-input>
</el-form-item>
</el-tab-pane>
</el-tabs>
</el-card>
</el-col>
<el-col :span="8">
<el-card>
<div
slot="header"
style="
display: flex;
justify-content: space-between;
line-height: 28px;
"
>
<span>区要素样式</span>
<el-button type="text" @click="polygonUp">更新</el-button>
</div>
<el-tabs v-model="activePolygon">
<el-tab-pane label="图形样式" name="first_Polygon">
<el-form-item label="填充颜色(color)">
<el-color-picker
v-model="polygon.FillColor"
></el-color-picker>
</el-form-item>
<el-form-item label="边框颜色(color)">
<el-color-picker
v-model="polygon.StrokeColor"
></el-color-picker>
</el-form-item>
<el-form-item label="边框宽度(width)">
<el-input v-model="polygon.StrokeWidth"></el-input>
</el-form-item>
</el-tab-pane>
<el-tab-pane label="文字样式" name="second_Polygon">
<el-form-item label="文字位置">
<el-select v-model="polygon.TextAglin" placeholder="请选择">
<el-option
v-for="item in TextAglinArray"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="文字基线">
<el-select
v-model="polygon.TextBaseline"
placeholder="请选择"
>
<el-option
v-for="item in TextBaselineArray"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="文字旋转角度">
<el-input v-model="polygon.TextRotation">
<span slot="append">°</span>
</el-input>
</el-form-item>
<el-form-item label="字体">
<el-select v-model="polygon.TextFont" placeholder="请选择">
<el-option
v-for="item in pointTextFontArray"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="粗细">
<el-select v-model="polygon.TextWeight" placeholder="请选择">
<el-option
v-for="item in TextWeightArray"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="大小">
<el-input v-model="polygon.TextSize">
<span slot="append">px</span>
</el-input>
</el-form-item>
<el-form-item label="x偏移量">
<el-input v-model="polygon.TextOffsetX"> </el-input>
</el-form-item>
<el-form-item label="y偏移量">
<el-input v-model="polygon.TextOffsetY"> </el-input>
</el-form-item>
<el-form-item label="外框颜色">
<el-color-picker
v-model="polygon.TextColor"
></el-color-picker>
</el-form-item>
<el-form-item label="外框宽度">
<el-input v-model="polygon.TextOutlineColor"></el-input>
</el-form-item>
</el-tab-pane>
</el-tabs>
</el-card>
</el-col>
</el-row>
</el-form>
</div>
</template>
<style scoped>
.featruesStyle_BOX {
display: flex;
justify-content: space-between;
height: 800px;
}
.featruesStyle-demo {
width: 50%;
height: 800px;
}
.formClass {
width: 50%;
}
>>> .el-card__header {
padding: 10px;
font-size: 12px;
font-weight: bold;
}
>>> .el-card__body,
.el-main {
padding: 5px;
}
</style>
初始化公共方法和变量
let pointFeature = new Feature({
geometry: new Point(
transform(
[104.06576156616212, 30.657443157369386],
"EPSG:4326",
"EPSG:3857"
)
),
name: "Point Feature",
}),
lineFeature = new Feature({
geometry: new LineString([
transform(
[104.06576156616212, 30.657443157369386],
"EPSG:4326",
"EPSG:3857"
),
transform(
[105.44677734375001, 28.86147544303663],
"EPSG:4326",
"EPSG:3857"
),
]),
name: "Line Feature",
}),
polygonFeature = new Feature({
geometry: new Polygon([
[
transform(
[104.20738220214845, 30.833966831300685],
"EPSG:4326",
"EPSG:3857"
),
transform(
[104.23150062561037, 30.84214707744351],
"EPSG:4326",
"EPSG:3857"
),
transform(
[104.22454833984376, 30.67368532516591],
"EPSG:4326",
"EPSG:3857"
),
transform(
[104.08550262451172, 30.668739135911846],
"EPSG:4326",
"EPSG:3857"
),
transform(
[104.20738220214845, 30.833966831300685],
"EPSG:4326",
"EPSG:3857"
),
],
]),
name: "Line Feature",
});
function createText(
{
TextAglin,
TextBaseline,
TextFont,
FillColor,
TextColor,
TextOutlineColor,
TextOffsetX,
TextOffsetY,
TextRotation,
TextWeight,
TextSize,
},
feature
) {
return new Text({
textAlign: TextAglin,
textBaseline: TextBaseline,
font: `${TextWeight} ${TextSize}px ${TextFont}`,
text: feature.get("name"),
fill: new Fill({ color: FillColor }),
stroke: new Stroke({ color: TextColor, width: TextOutlineColor }),
offsetX: TextOffsetX,
offsetY: TextOffsetY,
rotation: (TextRotation / 180) * Math.PI,
});
}
function createPointStyleFn(feature, Point) {
let { Size, FillColor, StrokeColor, StrokeWidth } = Point;
return new Style({
image: new CircleStyle({
radius: Size,
fill: new Fill({ color: FillColor }),
stroke: new Stroke({ color: StrokeColor, width: StrokeWidth }),
}),
text: createText(Point, feature),
});
}
function createLineStyleFn(feature, Line) {
let { StrokeColor, StrokeWidth } = Line;
return new Style({
stroke: new Stroke({ color: StrokeColor, width: StrokeWidth }),
text: createText(Line, feature),
});
}
function createPolygonStyleFn(feature, Polygon) {
let { FillColor, StrokeColor, StrokeWidth } = Polygon;
return new Style({
fill: new Fill({ color: FillColor }),
stroke: new Stroke({ color: StrokeColor, width: StrokeWidth }),
text: createText(Polygon, feature),
});
}
Vue-data 初始化
data() {
return {
form: {},
activePoint: "first_Point",
activeLine: "first_Line",
activePolygon: "first_Polygon",
map: null,
vectorPoints: null,
vectorLine: null,
vectorPolygon: null,
polygon: {
FillColor: "#aa3300",
StrokeColor: "#f00",
StrokeWidth: "2",
TextAglin: "center",
TextBaseline: "middle",
TextRotation: 0,
TextFont: "Arial",
TextWeight: "normal",
TextSize: "12",
TextOffsetX: "0",
TextOffsetY: "0",
TextColor: "#0ff",
TextOutlineColor: "3",
},
point: {
Size: 10,
FillColor: "#aa3300",
StrokeColor: "#f00",
StrokeWidth: "2",
TextAglin: "center",
TextBaseline: "middle",
TextRotation: 0,
TextFont: "Arial",
TextWeight: "normal",
TextSize: "12",
TextOffsetX: "0",
TextOffsetY: "0",
TextColor: "#0ff",
TextOutlineColor: "3",
},
line: {
StrokeColor: "#f00",
StrokeWidth: "2",
TextAglin: "center",
TextBaseline: "middle",
TextRotation: 0,
TextFont: "Arial",
TextWeight: "normal",
TextSize: "12",
TextOffsetX: "0",
TextOffsetY: "0",
TextColor: "#0ff",
TextOutlineColor: "3",
},
TextWeightArray: ["normal", "bold", "bolder"],
pointTextFontArray: ["Arial", "Courier New", "Verdana"],
TextAglinArray: ["center", "end", "left", "right", "start"],
TextBaselineArray: [
"alphabetic",
"bottom",
"hanging",
"ideographic",
"middle",
"top",
],
};
},
Map 初始化
mounted() {
let { point, polygon, line } = this;
let vectorPoints = new VectorLayer({
source: new VectorSource({
features: [pointFeature],
}),
style: createPointStyleFn(pointFeature, point),
}),
vectorLine = new VectorLayer({
source: new VectorSource({
features: [lineFeature],
}),
style: createLineStyleFn(lineFeature, line),
}),
vectorPolygon = new VectorLayer({
source: new VectorSource({
features: [polygonFeature],
}),
style: createPolygonStyleFn(polygonFeature, polygon),
});
let map = new Map({
layers: [gaodeMapLayer, vectorPoints, vectorLine, vectorPolygon],
view: new View({
center: transform([104.065735, 30.659462], "EPSG:4326", "EPSG:3857"),
zoom: 9,
minZoom: 1,
maxZoom: 21,
rotation: 0,
}),
target: "featruesStyle",
});
this.vectorPoints = vectorPoints;
this.vectorLine = vectorLine;
this.vectorPolygon = vectorPolygon;
this.map = map;
},
样式更新
methods: {
PonitUp() {
let { point, vectorPoints } = this;
vectorPoints.setStyle(createPointStyleFn(pointFeature, point));
},
LineUp() {
let { line, vectorLine } = this;
vectorLine.setStyle(createLineStyleFn(lineFeature, line));
},
polygonUp() {
let { polygon, vectorPolygon } = this;
vectorPolygon.setStyle(createPolygonStyleFn(polygonFeature, polygon));
},
},