222 lines
6.1 KiB
Vue
222 lines
6.1 KiB
Vue
<template>
|
||
<div class="map">
|
||
<el-autocomplete
|
||
style="width: 100%"
|
||
class="mb8"
|
||
v-model="keyword"
|
||
:fetch-suggestions="fetchLocationData"
|
||
placeholder="请输入查询关键字"
|
||
@select="handleSelect"
|
||
>
|
||
<i slot="prefix" class="el-input__icon el-icon-search"></i>
|
||
</el-autocomplete>
|
||
<div id="mapBox" class="map-box" style="width: 100%"></div>
|
||
<div class="map-tool">
|
||
<el-button type="primary" plain size="mini" :disabled="!!this.polygon" @click="handleCreateBthClick">新建</el-button>
|
||
<el-button type="success" plain size="mini" @click="handleCreateBthClick">编辑</el-button>
|
||
<el-button type="warning" plain size="mini" @click="handleClearBthClick">清除</el-button>
|
||
<el-button type="danger" plain size="mini" @click="handleCloseBthClick">结束</el-button>
|
||
</div>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
// import AMapLoader from '@amap/amap-jsapi-loader';
|
||
// import { listBaseinfo } from '@/api/agriculture/baseinfo';
|
||
export default {
|
||
name: 'DrawArea',
|
||
props: {
|
||
polygonPath: {
|
||
type: String,
|
||
default: '',
|
||
},
|
||
polygonStyle: {
|
||
type: Object,
|
||
default: () => {
|
||
return {
|
||
fillColor: '#26EB23',
|
||
fillOpacity: 0.9,
|
||
strokeColor: '#00D3FC',
|
||
strokeOpacity: 0.9,
|
||
strokeWeight: 2,
|
||
};
|
||
},
|
||
},
|
||
},
|
||
data() {
|
||
return {
|
||
keyword: '',
|
||
searchOverlays: [], //搜索图层
|
||
polygon: null,
|
||
};
|
||
},
|
||
watch: {
|
||
polygonStyle: {
|
||
handler: function (n, o) {
|
||
if (this.polygon) {
|
||
this.resetPolygonStyle();
|
||
this.removePolygon();
|
||
this.addPolygon();
|
||
}
|
||
},
|
||
deep: true,
|
||
},
|
||
},
|
||
async mounted() {
|
||
await this.initMap();
|
||
this.initPolygonEditor();
|
||
},
|
||
|
||
methods: {
|
||
/** 初始化map */
|
||
async initMap() {
|
||
const { AMap } = this;
|
||
this.map = new AMap.Map('mapBox', {
|
||
//设置地图容器id
|
||
//pitch: 40,
|
||
viewMode: '3D', //是否为3D地图模式
|
||
mapStyle: 'amap://styles/802500eb9c17892dd91047988cc1ece1',
|
||
zoom: 16, //初始化地图级别
|
||
//center: this.$zb, //初始化地图中心点位置
|
||
layers: [
|
||
new AMap.TileLayer.Satellite(),
|
||
//new AMap.TileLayer.RoadNet()
|
||
],
|
||
//showLabel: false,
|
||
});
|
||
/** 添加空间 控件 */
|
||
this.map.addControl(new AMap.Scale());
|
||
//this.map.addControl(new AMap.ToolBar());
|
||
this.map.addControl(new AMap.MapType());
|
||
/** 创建PlaceSearch实例 */
|
||
this.placeSearch = new AMap.PlaceSearch({ city: '全国' });
|
||
},
|
||
/** init polygonEditor
|
||
* isData:determine whether to render with value
|
||
*/
|
||
initPolygonEditor(isData = true) {
|
||
/** 创建多边形吸附实例 */
|
||
if (this.polygonPath && isData) {
|
||
this.polygon = new AMap.Polygon({ path: this.polygonPath.split('|').map((item) => item.split(',')) });
|
||
this.resetPolygonStyle();
|
||
this.map.add(this.polygon);
|
||
this.polygonEditor = new AMap.PolygonEditor(this.map, this.polygon);
|
||
} else {
|
||
this.polygonEditor = new AMap.PolygonEditor(this.map);
|
||
}
|
||
this.polygonEditor.on('add', ({ target: polygon }) => {
|
||
this.polygon = polygon;
|
||
this.resetPolygonStyle();
|
||
});
|
||
this.polygonEditor.on('end', ({ target: polygon }) => {
|
||
this.resetPolygonStyle();
|
||
});
|
||
this.polygonEditor.on('adjust', ({ target: polygon }) => {
|
||
this.$emit('change-path', this.polygon._opts.path);
|
||
});
|
||
this.map.setFitView();
|
||
},
|
||
/** 位置查询处理 */
|
||
fetchLocationData(queryString, cb) {
|
||
if (queryString) {
|
||
clearTimeout(this.timer);
|
||
// 延迟 1.2 s
|
||
this.timer = setTimeout(() => {
|
||
this.placeSearch.search(queryString, (status, result) => {
|
||
console.log(result);
|
||
if (status === 'complete') {
|
||
cb(result.poiList.pois.map((item) => ({ ...item, value: item.address })));
|
||
} else {
|
||
cb([]);
|
||
}
|
||
});
|
||
}, 1200);
|
||
} else {
|
||
cb([]);
|
||
}
|
||
},
|
||
/** handle select */
|
||
handleSelect(item) {
|
||
const { map, searchOverlays } = this;
|
||
const { location, address } = item;
|
||
const { lng, lat } = location;
|
||
map.panTo([lng, lat]);
|
||
},
|
||
/** handle create button click event */
|
||
handleCreateBthClick() {
|
||
this.polygonEditor.close();
|
||
this.polygonEditor.open();
|
||
},
|
||
/** handle close button click event */
|
||
handleCloseBthClick() {
|
||
this.polygonEditor.close();
|
||
this.$emit('change-path', this.polygon._opts.path);
|
||
},
|
||
/** handle clear button click */
|
||
handleClearBthClick() {
|
||
this.clearPolygonEditor();
|
||
},
|
||
/** 清除多边形编辑工具 */
|
||
clearPolygonEditor() {
|
||
//TODO:【项目】需优化
|
||
this.polygon = null;
|
||
this.map.destroy();
|
||
this.initMap();
|
||
this.initPolygonEditor(false);
|
||
},
|
||
/** 重设polygon样式 */
|
||
resetPolygonStyle() {
|
||
const {
|
||
polygon,
|
||
polygonStyle: { fillColor, fillOpacity, strokeColor, strokeOpacity, strokeWeight },
|
||
} = this;
|
||
polygon._opts.fillColor = fillColor;
|
||
polygon._opts.fillOpacity = fillOpacity;
|
||
polygon._opts.strokeColor = strokeColor;
|
||
polygon._opts.strokeOpacity = strokeOpacity;
|
||
polygon._opts.strokeWeight = strokeWeight;
|
||
},
|
||
/** 移除多边形 */
|
||
removePolygon() {
|
||
this.map.remove(this.polygon);
|
||
},
|
||
/** 添加多边形 */
|
||
addPolygon() {
|
||
this.map.add(this.polygon);
|
||
},
|
||
},
|
||
};
|
||
</script>
|
||
<style lang="scss" scoped>
|
||
.map {
|
||
width: 100%;
|
||
height: 500px;
|
||
display: flex;
|
||
flex-direction: column;
|
||
position: relative;
|
||
// overflow: hidden;
|
||
}
|
||
.map-box {
|
||
flex: auto;
|
||
}
|
||
.map-tool {
|
||
display: flex;
|
||
flex-direction: column;
|
||
position: absolute;
|
||
right: 10px;
|
||
bottom: 10px;
|
||
background-color: #fff;
|
||
padding: 10px;
|
||
border-radius: 5px;
|
||
}
|
||
::v-deep .el-button + .el-button {
|
||
margin: 0;
|
||
}
|
||
::v-deep .el-button + .el-button:nth-child(2) {
|
||
margin: 5px 0;
|
||
}
|
||
::v-deep .el-button + .el-button:nth-child(3) {
|
||
margin-bottom: 5px;
|
||
}
|
||
</style>
|