GIS工具maptalks开发手册(二)01——渲染点、文字和图片
1、渲染点
效果
2、渲染文字
效果
3、渲染图片
效果
4.1、html单页面
<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>图形 - Marker</title>
<style type="text/css">
html,
body {
margin: 0px;
height: 100%;
width: 100%;
}
.container {
width: 900px;
height: 500px;
margin: 50px;
}
</style>
<link rel="stylesheet" href="https://unpkg.com/maptalks/dist/maptalks.css">
<script type="text/javascript" src="https://unpkg.com/maptalks/dist/maptalks.min.js"></script>
<body>
<div id="map" class="container"></div>
<script>
var map = new maptalks.Map('map', {
center: [-0.113049, 51.498568],
zoom: 14,
baseLayer: new maptalks.TileLayer('base', {
urlTemplate: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',
subdomains: ['a', 'b', 'c', 'd'],
attribution: '© <a href="http://osm.org">OpenStreetMap</a> contributors, © <a href="https://carto.com/">CARTO</a>'
})
});
var point = new maptalks.Marker(
[-0.113049, 51.498568],
{
visible: true, // 可见的
editable: true, // 可编辑的
cursor: 'pointer', // 光标
shadowBlur: 0, // 阴影模糊
shadowColor: 'black', // 阴影颜色
draggable: false, // 拖动
dragShadow: false, // display a shadow during dragging (拖动时显示阴影)
drawOnAxis: null, // force dragging stick on a axis, can be: x, y (轴上的力拖动杆,可以是:x,y)
// symbol-记号样式
// 1、渲染文本
// symbol: {
// 文本呈现的样式,默认是: monospace, 当你设置 textFont时会覆盖这个属性
// 'textFaceName': 'sans-serif', // 文本面名称
// 'textName': 'MapTalks', // 文本名称
// 'textFill': '#34495e', // 文本填充色(字体颜色)
// textLineSpacing: 1, // 行距
// 'textHorizontalAlignment': 'right', // 文本水平对齐方式
// 文本标签与marker的距离,也就是与打点的位置的距离
// 'textDx': 20,
// 'textSize': 40 // 文本大小
// }
// 2、渲染图片
// symbol: {
// 'markerFile': 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg', // 标记图片文件地址
// 'markerWidth': 58,// 标记宽度
// 'markerHeight': 80, // 标记高度
// 'markerDx': 0, // 标记X轴
// 'markerDy': 0, // 标记y轴
// 'markerOpacity': 1 // 标记不透明度
// }
}
);
new maptalks.VectorLayer('vector', point).addTo(map);
</script>
</body>
</html>
效果-渲染图片格式
代码
index.html
<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>图形样式 - 图片标注</title>
<style type="text/css">
html,
body {
margin: 0px;
height: 100%;
width: 100%;
}
.container {
width: 900px;
height: 500px;
margin: 50px;
}
</style>
<link rel="stylesheet" href="https://unpkg.com/maptalks/dist/maptalks.css">
<script type="text/javascript" src="https://unpkg.com/maptalks/dist/maptalks.min.js"></script>
<body>
<div id="map" class="container"></div>
<script>
var map = new maptalks.Map('map', {
center: [-0.113049, 51.49856],
zoom: 14,
baseLayer: new maptalks.TileLayer('base', {
urlTemplate: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',
subdomains: ['a', 'b', 'c', 'd'],
attribution: '© <a href="http://osm.org">OpenStreetMap</a> contributors, © <a href="https://carto.com/">CARTO</a>'
})
});
var center = map.getCenter();
var layer = new maptalks.VectorLayer('vector').addTo(map);
var marker1 = new maptalks.Marker(
center.sub(0.009, 0),
{
'symbol': {
'markerFile': './01.svg',
'markerWidth': 300,
'markerHeight': 400,
'markerDx': 0,
'markerDy': 0,
'markerOpacity': 1
}
}
).addTo(layer);
</script>
</body>
</html>
获取中心点-getCenter()
https://maptalks.org/maptalks.js/api/0.x/Map.html#getCenter
设置中心点-setCenter(coordinate)
https://maptalks.org/maptalks.js/api/0.x/Map.html#setCenter
4.2、vue单页面
index.vue
<template>
<!-- maptalks渲染线 -->
<div id="map" class="container"></div>
</template>
<script>
import "maptalks/dist/maptalks.css";
import * as maptalks from "maptalks";
export default {
mounted() {
this.$nextTick(() => {
this.init();
});
},
methods: {
init() {
var map = new maptalks.Map('map', {
center: [-0.113049, 51.498568],
zoom: 14,
baseLayer: new maptalks.TileLayer('base', {
urlTemplate: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',
subdomains: ['a', 'b', 'c', 'd'],
attribution: '© <a href="http://osm.org">OpenStreetMap</a> contributors, © <a href="https://carto.com/">CARTO</a>'
})
});
var point = new maptalks.Marker(
[-0.113049, 51.498568],
{
visible: true, // 可见的
editable: true, // 可编辑的
cursor: 'pointer', // 光标
shadowBlur: 0, // 阴影模糊
shadowColor: 'black', // 阴影颜色
draggable: false, // 拖动
dragShadow: false, // display a shadow during dragging (拖动时显示阴影)
drawOnAxis: null, // force dragging stick on a axis, can be: x, y (轴上的力拖动杆,可以是:x,y)
// symbol-记号样式
// 1、渲染文本
// symbol: {
// 'textFaceName': 'sans-serif', // 文本面名称
// 'textName': 'MapTalks', // 文本名称
// 'textFill': '#34495e', // 文本填充颜色
// 'textHorizontalAlignment': 'right', // 文本水平对齐方式
// 'textSize': 40 // 文本大小
// }
// 2、渲染图片
// symbol: {
// 'markerFile': 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg', // 标记图片文件地址
// 'markerWidth': 58,// 标记宽度
// 'markerHeight': 80, // 标记高度
// 'markerDx': 0, // 标记X轴
// 'markerDy': 0, // 标记y轴
// 'markerOpacity': 1 // 标记不透明度
// }
}
);
new maptalks.VectorLayer('vector', point).addTo(map);
},
},
};
</script>
<style lang="scss">
html,
body {
margin: 0px;
height: 100%;
width: 100%;
}
.container {
width: 1200px;
height: 700px;
margin: 50px;
}
</style>
5、vue版-图片
5.1、渲染图片-铺满视野
铺满api
extent: map.getExtent(), // 图片大小:铺满地图视野
注意:
url链接如果出现跨域,请求头需要进行配置
src/utils/request.js
'Access-Control-Allow-Origin': '*' // 允许任何域访问
请求响应头
// request拦截器
service.interceptors.request.use(config => {
// config.mode = 'no-cors',
config.headers['Access-Control-Allow-Origin']= '*'
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false
if (getToken() && !isToken) {
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际
try {
config.headers['orgId'] = store.getters.userInfo.orgId//
} catch (e) {
alert('当前orgId不存在,请重新登录!')
//TODO handle the exception
}
}
return config
}, error => {
console.log(error)
Promise.reject(error)
})
后端-Response Headers响应头也需要进行处理:允许任何域访问
效果1
index.vue
<template>
<!-- maptalks初始化 -->
<div id="map" class="container"></div>
</template>
<script>
import "maptalks/dist/maptalks.css";
import * as maptalks from "maptalks";
export default {
mounted() {
this.$nextTick(() => {
this.init();
});
},
methods: {
// 初始化
init() {
const map = new maptalks.Map("map", {
// 默认中心点点位
center: [116.3972282409668, 39.90960456049752],
// 缩放层级
zoom: 14,
// 倾斜度
pitch: 50,
// 轴承
// bearing: 90,
// 最小缩放层级
minZoom: 1,
// 最大缩放层级
maxZoom: 22,
// baseLayer 表示基础图层,它可以添加多个,逗号隔开
baseLayer: new maptalks.TileLayer("base", {
// // 出现跨域问题,要设置这个,一定是undefined
// crossOrigin: undefined,
// 电子地图图层
urlTemplate:
"http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png", // 初始常规主题
// urlTemplate:"https://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}", // 彩色主题
// urlTemplate: 'http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}',// 黑色主题
subdomains: ["a", "b", "c", "d"],
attribution:
'© <a href="http://osm.org">OpenStreetMap</a> contributors, © <a href="https://carto.com/">CARTO</a>',
}),
});
console.log("map: ", map);
let layerImg = new maptalks.ImageLayer("images", [
{
url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg', // 饿了么图片
// url: this.$store.state.user.imgValue,
extent: map.getExtent(), // 图片大小
// extent: [114.40184088740602, 37.002608169667695, 114.4028259092072, 37.00181114116637], // 左上 右下
opacity: 0.5, // 不透明度
},
]);
layerImg.addTo(map);
},
},
};
</script>
<style lang="scss">
html,
body {
margin: 0px;
height: 100%;
width: 100%;
}
.container {
width: 1200px;
height: 700px;
margin: 50px;
}
</style>
5.2、渲染图片-限制图片渲染大小
和地图层级结合使用,可以获取坐标数据
效果-限制图片大小
index.vue
<template>
<!-- maptalks初始化 -->
<div id="map" class="container"></div>
</template>
<script>
import "maptalks/dist/maptalks.css";
import * as maptalks from "maptalks";
export default {
mounted() {
this.$nextTick(() => {
this.init();
});
},
methods: {
init() {
const map = new maptalks.Map("map", {
// 默认中心点点位
center: [116.3972282409668, 39.90960456049752],
// 缩放层级
zoom: 18,
// 倾斜度
// pitch: 50,
// 轴承
// bearing: 90,
// 最小缩放层级
minZoom: 1,
// 最大缩放层级
maxZoom: 22,
// baseLayer 表示基础图层,它可以添加多个,逗号隔开
baseLayer: new maptalks.TileLayer("base", {
// // 出现跨域问题,要设置这个,一定是undefined
// crossOrigin: undefined,
// 电子地图图层
urlTemplate:
"http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png", // 初始常规主题
// urlTemplate:"https://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}", // 彩色主题
// urlTemplate: 'http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}',// 黑色主题
subdomains: ["a", "b", "c", "d"],
attribution:
'© <a href="http://osm.org">OpenStreetMap</a> contributors, © <a href="https://carto.com/">CARTO</a>',
}),
});
console.log("map: ", map);
let extent = map.getExtent();
// console.log(extent);
// console.log(extent.xmax); // -0.0012234410202154322
extent.xmax =
extent.xmax -
0.0009520458196448089 -
0.0013465535936347806 -
0.0013146624997943945;
extent.xmin = extent.xmin + 0.0008865151057761977 - 0.0013146624997943945;
extent.ymax = extent.ymax - 0.0013408400707248802 - 0.0013465535936347806;
extent.ymin = extent.ymin + 0.0013416043410643397;
let layerImg = new maptalks.ImageLayer("images", [
{
url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg', // 饿了么图片
// url: this.$store.state.user.imgValue,
extent: extent,
// extent: [114.40184088740602, 37.002608169667695, 114.4028259092072, 37.00181114116637], // 左上 右下
opacity: 0.5,
},
]);
layerImg.addTo(map);
},
},
};
</script>
<style lang="scss">
html,
body {
margin: 0px;
height: 100%;
width: 100%;
}
.container {
width: 1200px;
height: 700px;
margin: 50px;
}
</style>