“画布”,像素的位图
<canvas id="canvas" width="800" height="800"></canvas>
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
实现
<canvas id="canvas" width="800" height="800"></canvas>
<script>
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
// 矩形
ctx.fillStyle = "red";
ctx.fillRect(0, 0, 50, 50);
// 线段
ctx.beginPath();
ctx.lineWidth = 1;
ctx.strokeStyle = "blue";
ctx.moveTo(100, 100);
ctx.lineTo(250, 75);
ctx.lineTo(300, 100);
ctx.stroke();
//绘制圆形
ctx.beginPath();
ctx.lineWidth = 2;
ctx.strokeStyle = "green";
ctx.fillStyle = "red";
ctx.arc(200, 200, 50, 0, 2 * Math.PI);
ctx.stroke();
ctx.fill();
</script>
图片压缩
<input type="file" id="upload" />
<script>
const ACCEPT = ["image/gif", "image/jpeg"];
const MAXSIZE = 1024 * 1024 * 1024;
const upload = document.getElementById("upload");
// 转base64
function converImageToBase64(file, callback) {
let reader = new FileReader();
reader.addEventListener("load", function(e) {
// console.log(reader.result);
const base64Image = e.target.result;
callback && callback(base64Image);
reader = null; //内存回收
});
reader.readAsDataURL(file);
}
// 压缩
function compress(base64Image, callback) {
let maxW = 1024;
let maxH = 1024;
// 获取base64
// console.log(base64Image);
// 创建标签
const image = new Image();
image.src = base64Image;
// 图片宽高进行压缩
image.addEventListener("load", function(e) {
let ratio;
let needCompress = false;
if (maxW < image.naturalWidth) {
needCompress = true;
ratio = image.naturalWidth / maxW;
maxH = image.naturalHeight / ratio;
} else if (maxH < image.naturalHeight) {
needCompress = true;
ratio = image.naturalHeight / maxH;
maxW = image.naturalHeight / ratio;
}
if (!needCompress) {
maxW = image.naturalWidth;
maxH = image.naturalHeight;
}
document.body.appendChild(image);
// canvas 压缩 压缩尺寸/分辨率
const canvas = document.createElement("canvas");
canvas.setAttribute("id", "_compress_");
canvas.width = maxW;
canvas.height = maxH;
// canvas.style.visibility = "visible";
canvas.style.visibility = "hidden";
document.body.appendChild(canvas);
const ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, maxW, maxH);
// 压缩大小
ctx.drawImage(image, 0, 0, maxW, maxH);
// 压缩分辨率
const compressImage = canvas.toDataURL("image/jpeg", 0.9);
// console.log(compressImage);
// 创建image显示
callback && callback(compressImage);
canvas.remove();
image.remove();
});
// 输出base64
}
function uploadToServer(compressImage) {
console.log("发送给后端", compressImage);
}
upload.addEventListener("change", function(e) {
const [file] = e.target.files;
if (!file) {
upload.value = "";
return;
}
const {
type: fileType,
size: fileSize
} = file;
// 判断包含
// console.log(fileType);
if (!ACCEPT.includes(fileType)) {
alert("不支持");
upload.value = "";
return;
}
if (fileSize > MAXSIZE) {
alert("文件超出1mb");
upload.value = "";
return;
}
// 压缩文件
converImageToBase64(file, (base64Image) =>
compress(base64Image, uploadToServer)
);
});
</script>
矢量图形
实现
<svg width="800" height="800">
<!-- 矩形 -->
<rect
width="50"
height="50"
style="fill: red; stroke-width: 1px; stroke: #000;"
></rect>
<!-- 线段 -->
<line
x1="100"
y1="100"
x2="250"
y2="75"
style="stroke: blue; stroke-width: 1px;"
></line>
<line
x1="250"
y1="75"
x2="300"
y2="100"
style="stroke: blue; stroke-width: 1px;"
></line>
<!-- 圆形 -->
<circle
cx="200"
cy="200"
r="50"
stroke="green"
stroke-width="2"
fill="red"
></circle>
</svg>
定义成组件
隐藏里面的内容
引用g id=“more”
同g 但是可以在g 设定viewBox,不用引用者设
transform="translate(10,10) rotate(30) skewX(30) skewY(30) scale(0.5)"
@keyframes circle{
from{
stroke-dasharray:0 1131;
}
to{
stroke-dasharray:1131 1131;
}
}
.circle{
animation: circle 5s linear infinite;
}
.logo{
width: 100%;
height: 100%;
fill:none;
stroke:#333;
stroke-width: 8px;
stroke-dasharray: 5029.8291015625 ;
animation:logo 5s linear 1 ;
}
@keyframes logo {
0% {
stroke-dashoffset:5029.8291015625;
}
50% {
stroke-dashoffset:0;
}
75%{
fill:red;
}
100%{
fill:burlywood
}
}
<svg width="200px" hegith="200px" >
<rect x="0" y="0" fill="red" width="100" height="50" >
<set attributeName="x" attributeType="XML" to="10" begin="1s">set>
<set attributeName="x" attributeType="XML" to="20" begin="2s">set>
<set attributeName="fill" attributeType="XML" to="blue" begin="3s">set>
rect>
svg>
2、
repeatCount=“indefinite” 动画无数次 repeatCount=“1” 动画一次
fill=“freeze” 动画结束后停留最后 fill=“remove” 动画结束后回到最初
<svg width="200px" hegith="200px" >
<circle cx="0" cy="0" r="30" fill="blue" stroke="black" stroke-width="1">
<animate attributeName="cx" attributeType="css" from="0" to="100" dur="5s" repeatCount="1" fill="freeze">animate>
<animate attributeName="cy" attributeType="css" from="0" to="100" dur="5s" repeatCount="1" fill="freeze">animate>
circle>
svg>
3、
抛弃了
4、
type=“scale” 要设置动画的属性
from=“1” to=“2” 设置动画的初始结束
<animateTransform attributeName="transform" attributeType="XML" begin="0" dur="5s" type="scale" from="1" to="2" repeatCount="1" fill="freeze">animateTransform>
5、
轨迹运动
M Z 起止
M10 10 起点 10 10
L110 10 画线 110 10
M10 10 L110 10 L110 110 L10 110 Z : (10,10) (110,10) (110,110) (10.110)的闭合线段
<div class="container">
<svg width="200px" hegith="200px" >
<rect x="0" y="0" fill="red" width="10" height="10" >
<animateMotion
id="backward-rect"
path="M10 110 L110 110 L110 10 L10 10"
dur="5s"
rotate="0"
fill="freeze"
begin="forward-rect.end + 0.5s"
/>
<animate
id="red-to-blue"
attributeName="fill"
attributeType="XML"
from="red" to="blue"
dur="2s"
fill="freeze"
begin="0;blue-to-red.end + 0.5s"
/>
<animate
id="blue-to-red"
attributeName="fill"
attributeType="XML"
from="blue" to="red"
dur="2s"
fill="freeze"
begin="red-to-blue.end+0.5s"
/>
rect>
<path d="M10 10 L110 10 L110 110 L10 110" fill="none" stroke="green">path>
svg>
div>
<div class="container">
<svg width="400" height="400">
<defs>
<mask id="test-mask">
<rect x="5" y="5" width="390" height="390" fill="green" >rect>
<circle r="50" cx="50" cy="50" />
mask>
defs>
<rect x="5" y="5" width="390" height="390" fill="red" >rect>
<rect x="5" y="5" width="390" height="390" fill="blue"
mask="url(#test-mask)"
>rect>
svg>
div>
由数据来决定绘图流程的程序设计模型
D3 是一个JavaScript的函数库,是用来做数据可视化的。
D3数据绑定案例
<p>vue</p>
<p>react</p>
<p>agular</p>
<button id="datum">datum</button>
<button id="data">data</button>
<script src="https://d3js.org/d3.v5.js"></script>
<script>
const body = d3.select("body");
const p = body.selectAll("p");
document.getElementById("datum").addEventListener("click", function(e) {
doDatum();
});
document.getElementById("data").addEventListener("click", function(e) {
doData();
});
function doDatum() {
const str = "TTT";
p.datum(str); //p标签内容修改
p.text(function(d, i) {
console.log(d, i);
return `${d}-${i}`;
});
}
function doData() {
const dataset = ["vue", "react", "agular"];
p.data(dataset).text(function(d, i) {
console.log(d, i);
return `${d}-${i}`;
});
}
</script>
Zrender是一个全新的轻量级Canvas类库
echarts是基于zrender进行封装的。
const zr = zrender.init(document.getElementById("container"));
zr.add(rect);
实现
<div id="container" style="width: 800px; height: 800px;"></div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/zrender.js"></script>
<script>
const zr = zrender.init(document.getElementById("container"));
// 矩形
const rect = new zrender.Rect({
shape: {
x: 0,
y: 0,
width: 50,
height: 50,
},
style: {
fill: "red",
lineWidth: 0,
},
});
// 线段
const line = new zrender.Polyline({
shape: {
points: [
[100, 100],
[250, 75],
[300, 100],
],
},
style: {
stroke: "blue",
lineWidth: 1,
},
});
// 圆形
const circle = new zrender.Circle({
shape: {
cx: 200,
cy: 200,
r: 50,
},
style: {
fill: "red",
stroke: "green",
lineWidth: 2,
},
});
// 点
const point = new zrender.Polyline({
shape: {
points: [
[300, 300],
[300, 301],
],
},
style: {
stroke: "red",
lineWidth: 1,
},
});
zr.add(rect);
zr.add(line);
zr.add(circle);
zr.add(point);
</script>
运行在浏览器中的 3D 引擎(基于WebGL的API的封装)
矩形3d旋转
WebGL API:只能会点、线、三角形
1、获取顶点坐标
2、图元装配(即画出一个个三角形)
3、光栅化(生成片元,即一个个像素点)
three:
将webGL基于光栅化的2D API,封装成了我们人类能看懂的 3D API。
<html>
<head>
<title>My first three.js apptitle>
<style>
body {
margin: 0;
}
canvas {
width: 100%;
height: 100%;
}
style>
head>
<body>
<script src="https://threejs.org/build/three.js">script>
<script>
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
var geometry = new THREE.BoxGeometry(1, 1, 1);
var material = new THREE.MeshBasicMaterial({
color: 0x00ff00,
});
var cube = new THREE.Mesh(geometry, material);
scene.add(cube);
camera.position.z = 5;
var animate = function() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
};
animate();
script>
body>
html>
数据驱动,高度易用,可扩展的可视化图形语法。
<div id="g2-chart">div>
<script src="https://unpkg.com/@antv/g2plot@latest/dist/g2plot.js">script>
<script>
const data = [{
year: "1991",
value: 3,
}, {
year: "1992",
value: 4,
}, {
year: "1993",
value: 3.5,
}, {
year: "1994",
value: 5,
}, {
year: "1995",
value: 4.9,
}, {
year: "1996",
value: 6,
}, {
year: "1997",
value: 7,
}, {
year: "1998",
value: 9,
}, {
year: "1999",
value: 13,
}, ];
const chartDom = document.getElementById("g2-chart");
const line = new G2Plot.Line(chartDom, {
title: {
visible: true,
text: "这是一个基础折线图",
},
description: {
visible: true,
text: "副标题",
},
data,
xField: "year",
yField: "value",
point: {
visible: true,
size: 5,
color: "#fff",
style: {
stroke: "#fe7407",
lineWidth: 1,
fillOpacity: 0.6,
},
},
label: {
visible: true,
},
color: "#fe7407",
yAxis: {
formatter: (v) => {
return `${v}k`;
},
},
});
line.render();
script>
便捷的关系数据可视化引擎与图分析工具。
<div id="g6-chart">div>
<script src="https://gw.alipayobjects.com/os/antv/pkg/_antv.g6-3.5.10/dist/g6.min.js">script>
<script>
const data = {
nodes: [{
id: "node1",
x: 100,
y: 200,
label: "起始点",
size: 60,
labelCfg: {
// position: "left",
style: {
fontSize: 12,
fill: "#FFF",
},
},
style: {
fill: "#ff0000",
stroke: "#888",
lineWidth: 1,
},
}, {
id: "node2",
x: 300,
y: 200,
label: "目标1",
size: 80,
labelCfg: {
// position: "left",
style: {
fontSize: 12,
fill: "#FFF",
},
},
style: {
fill: "#000",
stroke: "#888",
lineWidth: 1,
},
}, {
id: "node3",
x: 500,
y: 200,
label: "目标2",
size: 100,
labelCfg: {
// position: "left",
style: {
fontSize: 12,
fill: "#FFF",
},
},
style: {
fill: "blue",
stroke: "#888",
lineWidth: 1,
},
}, {
id: "node4",
x: 300,
y: 400,
label: "目标4",
size: 100,
labelCfg: {
// position: "left",
style: {
fontSize: 12,
fill: "#FFF",
},
},
style: {
fill: "blue",
stroke: "#888",
lineWidth: 1,
},
}, ], // 所有的点
edges: [{
source: "node1",
target: "node2",
label: "连接线1",
}, {
source: "node2",
target: "node3",
label: "连接线2",
}, {
source: "node3",
target: "node4",
label: "连接线3",
}, ], // 所有的边线
};
const graph = new G6.Graph({
container: "g6-chart", // String | HTMLElement,必须,在 Step 1 中创建的容器 id 或容器本身
width: 800, // Number,必须,图的宽度
height: 500, // Number,必须,图的高度
});
graph.data(data);
graph.render();
script>
高性能/高渲染质量的地理空间数据可视化框架。
<div id="L7-chart">div>
<script src="https://unpkg.com/@antv/l7">script>
<script>
// 地图
const scene = new L7.Scene({
id: "L7-chart",
map: new L7.GaodeMap({
style: "dark", // 样式URL
center: [120.19382669582967, 30.258134],
pitch: 0,
zoom: 4,
token: "高德地图API token",
}),
});
// 点图层
scene.on("loaded", () => {
fetch(
"https://gw.alipayobjects.com/os/basement_prod/337ddbb7-aa3f-4679-ab60-d64359241955.json"
)
.then((res) => res.json())
.then((data) => {
data.features = data.features.filter((item) => {
return item.properties.capacity > 800;
});
const pointLayer = new L7.PointLayer({})
.source(data)
.shape("circle")
.size("capacity", [0, 16])
.color("capacity", [
"#34B6B7",
"#4AC5AF",
"#5FD3A6",
"#7BE39E",
"#A1EDB8",
"#CEF8D6",
])
.active(true)
.style({
opacity: 0.5,
strokeWidth: 0,
});
scene.addLayer(pointLayer);
});
});
script>
纯 JavaScript 编写的 HTML5 图表库。
<div id="container" style="width: 600px;height:400px;">div>
<script src="http://cdn.highcharts.com.cn/highcharts/highcharts.js">script>
<script>
// 图表配置
var options = {
chart: {
type: 'bar' //指定图表的类型,默认是折线图(line)
},
title: {
text: '我的第一个图表' // 标题
},
xAxis: {
categories: ['苹果', '香蕉', '橙子'] // x 轴分类
},
yAxis: {
title: {
text: '吃水果个数' // y 轴标题
}
},
series: [{ // 数据列
name: '小明', // 数据列名
data: [1, 0, 4] // 数据
}, {
name: '小红',
data: [5, 7, 3]
}]
};
// 图表初始化函数
var chart = Highcharts.chart('container', options);
script>
一个基于 JavaScript 的开源可视化图表库
由zrender发展过来的
<script src="echarts.min.js">script>
<div id="main" style="width: 600px;height:400px;">div>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
legend: {
data:['销量']
},
xAxis: {
data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
},
yAxis: {},
series: [{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
script>
用于创建多图表。例如 一个图表包含柱状图 折线图 和饼图。
一组数值以及他们映射成的图。
一个 系列 包含的要素至少有:一组数值、图表类型(series.type)、以及其他的关于这些数据如何映射成图的参数。
用于是否显示某个组件,比如tooltip(提示框组件)
在系列之上,echarts 中各种内容,被抽象为“组件”。
xAxis(直角坐标系 X 轴)、yAxis(直角坐标系 Y 轴)、grid(直角坐标系底板)、angleAxis(极坐标系角度轴)、radiusAxis(极坐标系半径轴)、polar(极坐标系底板)、geo(地理坐标系)、dataZoom(数据区缩放组件)、visualMap(视觉映射组件)、tooltip(提示框组件)、toolbox(工具栏组件)、series(系列)
坐标系用于布局图,以及显示数据的刻度等等
系列单个样式:itemStyle:阴影、透明度、颜色、边框颜色、边框宽度样式。
系列的文本设置在 label.textStyle。
背景色全局的: option 下设置 backgroundColor。
文本的样式全局:option 下设置textStyle。
标签的视觉引导线;labelLine.lineStyle。
明暗度的变化:visualMap。
当我们把系列(series)对应到“列”的时候,那么每一列就称为一个“维度(dimension)”,而每一行称为数据项(item)。反之,如果我们把系列(series)对应到表行,那么每一行就是“维度(dimension)”,每一列就是数据项(item)。
维度可以有单独的名字,便于在图表中显示。维度名(dimension name)可以在定义在 dataset 的第一行(或者第一列)。
可以使用单独的 dataset.dimensions 或者 series.dimensions来定义。
var option1 = {
dataset: {
dimensions: [
{name: 'score'},
// 可以简写为 string,表示维度名。
'amount',
// 可以在 type 中指定维度类型。
{name: 'product', type: 'ordinal'}
],
source: [...]
},
...
};
var option2 = {
dataset: {
source: [...]
},
series: {
type: 'line',
// 在系列中设置的 dimensions 会更优先采纳。
dimensions: [
null, // 可以设置为 null 表示不想设置维度名
'amount',
{name: 'product', type: 'ordinal'}
]
},
...
};
设定维度,使用 encode 来做映射
var option = {
// 维度
dataset: {
source: [
['score', 'amount', 'product'],
[89.3, 58212, 'Matcha Latte'],
[57.1, 78254, 'Milk Tea'],
[74.4, 41032, 'Cheese Cocoa'],
[50.1, 12755, 'Cheese Brownie'],
[89.7, 20145, 'Matcha Cocoa'],
[68.1, 79146, 'Tea'],
[19.6, 91852, 'Orange Juice'],
[10.6, 101852, 'Lemon Juice'],
[32.7, 20112, 'Walnut Brownie']
]
},
xAxis: {},
yAxis: {type: 'category'},
series: [
{
type: 'bar',
// 映射
encode: {
// 将 "amount" 列映射到 X 轴。
x: 'amount',
// 将 "product" 列映射到 Y 轴。
y: 'product'
}
}
]
};
类似 CSS Media Query 的自适应能力
media: [ // 这里定义了 media query 的逐条规则。
{
query: {...}, // 这里写规则。
option: { // 这里写此规则满足下的option。
legend: {...},
...
}
},
{
query: {...}, // 第二个规则。
option: { // 第二个规则对应的option。
legend: {...},
...
}
},
{ // 这条里没有写规则,表示『默认』,
option: { // 即所有规则都不满足时,采纳这个option。
legend: {...},
...
}
}
]
在 ECharts 中事件分为两种类型,一种是用户鼠标操作点击,或者 hover 图表的图形时触发的事件,还有一种是用户在使用可以交互的组件后触发的行为事件。
所有的鼠标事件包含参数 params,可以区分鼠标点击
// 处理点击事件并且跳转到相应的百度搜索页面
myChart.on('click', function (params) {
window.open('https://www.baidu.com/s?wd=' + encodeURIComponent(params.name));
});
renderItem 函数提供了两个参数:
params:包含了当前数据信息(如 seriesIndex、dataIndex 等等)和坐标系的信息(如坐标系包围盒的位置和尺寸)。
api:是一些开发者可调用的方法集合(如 api.value()、api.coord())。
import * as echarts from 'echarts/core';
Antv:文档好
Antv:产品拆分清晰
Echart : 社区强大
Echart :使用广泛
Highcharts:兼容性更好ie6 E:ie8
Highcharts:文档会更好
Highcharts:收费
Highcharts:svg
element官方:基于 Vue2.0 和 echarts 封装的 v-charts 图表组件
<template>
<ve-line :data="chartData" :settings="chartSettings">ve-line>
template>
<script>
export default {
data () {
this.chartSettings = {
labelMap: {
PV: '访问用户',
Order: '下单用户'
}
}
return {
chartData: {
columns: ['date', 'PV', 'Order'],
rows: [
{ 'date': '2018-05-22', 'PV': 32371, 'Order': 19810 },
{ 'date': '2018-05-23', 'PV': 12328, 'Order': 4398 },
{ 'date': '2018-05-24', 'PV': 92381, 'Order': 52910 }
]
}
}
}
}
script>
百度echarts官方提供的echarts基于 Vue.js开发的组件
<template>
<v-chart :options="polar"/>
template>
<style>
/**
* 默认尺寸为 600px×400px,如果想让图表响应尺寸变化,可以像下面这样
* 把尺寸设为百分比值(同时请记得为容器设置尺寸)。
*/
.echarts {
width: 100%;
height: 100%;
}
style>
<script>
import ECharts from 'vue-echarts'
import 'echarts/lib/chart/line'
import 'echarts/lib/component/polar'
export default {
components: {
'v-chart': ECharts
},
data () {
let data = []
for (let i = 0; i <= 360; i++) {
let t = i / 180 * Math.PI
let r = Math.sin(2 * t) * Math.cos(2 * t)
data.push([r, i])
}
return {
polar: {
title: {
text: '极坐标双数值轴'
},
legend: {
data: ['line']
},
polar: {
center: ['50%', '54%']
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
}
},
angleAxis: {
type: 'value',
startAngle: 0
},
radiusAxis: {
min: 0
},
series: [
{
coordinateSystem: 'polar',
name: 'line',
type: 'line',
showSymbol: false,
data: data
}
],
animationDuration: 2000
}
}
}
}
script>
<style type="text/css">
#container {
width: 90%;
height: 90%;
}
// 隐藏logo
.anchorBL {
display: none;
}
style>
<div id="container">div>
<script
type="text/javascript"
src="https://api.map.baidu.com/api?v=1.0&&type=webgl&ak=您的密钥"
>script>
<script>
var map = new BMapGL.Map("container");
// 创建点坐标
var point = new BMapGL.Point(116.404, 39.915);
// 设置坐标点和地图显示大小
map.centerAndZoom(point, 15);
// 滚轮
map.enableScrollWheelZoom(true);
script>
<div id="container">div>
<script>
//百度地图API功能
// 挂载在window上
function init() {
var map = new BMap.Map("container"); // 创建Map实例
var point = new BMap.Point(116.404, 39.915); // 创建点坐标
map.centerAndZoom(point, 15);
map.enableScrollWheelZoom(); //启用滚轮放大缩小
}
// 需要时候,下载地图api
// 使用script,配合window.onload在页面加载后创建标签
// 在src后加入callback=init,进行初始化操作
function loadJScript() {
var script = document.createElement("script");
script.type = "text/javascript";
script.src =
"https://api.map.baidu.com/api?v=2.0&ak=您的密钥&callback=init";
document.body.appendChild(script);
}
// 页面加载完之后
window.onload = loadJScript; //异步加载地图
script>
使用BMapGL,并开启服务器。
BMapGL比Bmap内容丰富,更多的3D效果。
var map = new BMapGL.Map("container");
var point = new BMapGL.Point(116.404, 39.915);
map.centerAndZoom(point, 8);
// 滚轮
map.enableScrollWheelZoom(true);
// 旋转 3d建筑
var heading = 0;
map.setHeading(heading); //设置地图旋转角度
map.setTilt(73); //设置地图的倾斜角度
setInterval(() => {
heading++;
map.setHeading(heading);
}, 500);
//3d地球
map.setMapType(BMAP_EARTH_MAP);
使用BMapGL,并开启服务器。
// 隐藏logo
.BMap_stdMpZoom {
display: inline-block;
}
var map = new BMapGL.Map("container", {
// 限制放大缩小
minZoom: 8,
maxZoom: 12,
enableAutoResize: true,
});
var point = new BMapGL.Point(116.404, 39.915);
map.centerAndZoom(point, 8);
// 滚轮
map.enableScrollWheelZoom(true);
// 控件 缩放
var zoomCtrl = new BMapGL.ZoomControl({
anchor: BMAP_ANCHOR_BOTTOM_LEFT,
// 控件位移
offset: new BMapGL.Size(15, 15),
});
map.addControl(zoomCtrl);
map.addEventListener("zoomstart", function () {
console.log("开始", map.getZoom());
});
map.addEventListener("zoomend", function () {
console.log("结束", map.getZoom());
});
// 控件 比例
var scaleCtrl = new BMapGL.ScaleControl({
anchor: BMAP_ANCHOR_TOP_LEFT,
offset: new BMapGL.Size(15, 15),
});
map.addControl(scaleCtrl);
vue接入百度地图.
<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=密钥">script>
<style>