要注意清空柱狀圖形
<template>
<div class="contentBox">
<div id="map"></div>
</div>
</template>
<script>
import AMap from 'AMap'
export default {
data() {
return {
object3Dlayer: null,//柱狀圖
}
},
methods: {
setHomeMap(mapData, code) {
//柱狀圖顏色設置
const prismData = {
height: 500,
radius: 100,
topColor: [1, 0.8, 0.4, 0.8],
topFaceColor: [1, 0.8, 0.5, 0.8],//頂部
bottomColor: [1, 0.72, 0, 0.8]
};
this.object3Dlayer = new AMap.Object3DLayer();
this.map.add(this.object3Dlayer);
this.offset = new AMap.Pixel(0, 0);
//柱狀圖
let center_3d = this.map.lngLatToGeodeticCoord('中心點座標');
this._createCylinder(center_3d, prismData, this.object3Dlayer);
},
initMap() {
if (!this.map) {
this.map = new AMap.Map('map', {
viewMode: '3D',
pitch: 50,
resizeEnable: true,
zoom: 15.85,
center: [121.536233, 31.172555],
});
this.map.setMapStyle("amap://styles/blue")
}
},
_createCylinder(center, prismData, object3Dlayer) {
//圓柱設置
let segment = 32;//棱柱的形狀,圓
let topColor = prismData.topColor;
let topFaceColor = prismData.topFaceColor;
let bottomColor = prismData.bottomColor;
// let height = prismData.height;
let setRadius = prismData.radius;
this.cylinder = new AMap.Object3D.Mesh();
let geometry = this.cylinder.geometry;
let verticesLength = segment * 2;
let path = [];
for (let i = 0; i < segment; i += 1) {
let angle = 2 * Math.PI * i / segment;
let x = center.x + Math.cos(angle) * setRadius;
let y = center.y + Math.sin(angle) * setRadius;
path.push([x, y]);
geometry.vertices.push(x, y, 0); //底部頂點
geometry.vertices.push(x, y, -prismData.height); //頂部頂點
geometry.vertexColors.push.apply(geometry.vertexColors, bottomColor); //底部顏色
geometry.vertexColors.push.apply(geometry.vertexColors, topColor); //頂部顏色
let bottomIndex = i * 2;
let topIndex = bottomIndex + 1;
let nextBottomIndex = (bottomIndex + 2) % verticesLength;
let nextTopIndex = (bottomIndex + 3) % verticesLength;
geometry.faces.push(bottomIndex, topIndex, nextTopIndex); //側面三角形1
geometry.faces.push(bottomIndex, nextTopIndex, nextBottomIndex); //側面三角形2
}
// 構建頂面三角形,爲了區分頂面點和側面點使用不一樣的顏色,所以需要獨立的頂點
for (let i = 0; i < segment; i += 1) {
geometry.vertices.push.apply(geometry.vertices, geometry.vertices.slice(i * 6 + 3, i * 6 + 6)); //底部頂點
geometry.vertexColors.push.apply(geometry.vertexColors, topFaceColor);
}
let triangles = AMap.GeometryUtil.triangulateShape(path);
let offset = segment * 2;
for (let v = 0; v < triangles.length; v += 3) {
geometry.faces.push(triangles[v] + offset, triangles[v + 2] + offset, triangles[v + 1] + offset);
}
this.cylinder.transparent = true; // 如果使用了透明顏色,請設置true
object3Dlayer.add(this.cylinder);
},
},
},
mounted() {
this.initMap();
}
}
</script>