map
地图。
属性 | 类型 | 默认值 | 必填 | 说明 | 最低版本 |
---|---|---|---|---|---|
type | String | tmap | 否 | 地图类型 | |
subkey | String | 是 | 地图使用的key,可前往各地图厂商开发者网站申请 | ||
view-mode | String | 3D | 否 | 地图模式 3D/2D | |
longitude | Number | 是 | 中心经度 | ||
latitude | Number | 是 | 中心纬度 | ||
scale | Number | 16 | 否 | 缩放级别,取值范围为3-20 | |
min-scale | Number | 3 | 否 | 最小缩放级别 | |
max-scale | Number | 20 | 否 | 最大缩放级别 | |
markers | Array | 否 | 标记点 | ||
polyline | Array | 否 | 路线 | ||
circles | Array | 否 | 圆 | ||
polygons | Array | 否 | 多边形 | ||
include-points | Array | 否 | 缩放视野以包含所有给定的坐标点 | ||
show-location | Boolean | false | 否 | 显示带有方向的当前定位点 | |
layer-style | String | 否 | 个性化地图配置的 style | ||
rotate | Number | 0 | 否 | 旋转角度,范围 0 ~ 360, 地图正北和设备 y 轴角度的夹角 | |
skew | Number | 0 | 否 | 倾斜角度,范围 0 ~ 40 , 关于 z 轴的倾角 | |
enable-3D | Boolean | false | 否 | 展示3D楼块(工具暂不支持) | |
show-compass | Boolean | false | 否 | 显示指南针 | |
show-scale | Boolean | false | 否 | 显示比例尺,工具暂不支持 | |
enable-overlooking | Boolean | false | 否 | 开启俯视 | |
enable-zoom | Boolean | true | 否 | 是否支持缩放 | |
enable-scroll | Boolean | true | 否 | 是否支持拖动 | |
enable-rotate | Boolean | false | 否 | 是否支持旋转 | |
enable-satellite | Boolean | false | 否 | 是否开启卫星图 | |
enable-traffic | Boolean | false | 否 | 是否开启实时路况 | |
enable-poi | Boolean | true | 否 | 是否展示 POI 点 | |
enable-building | Boolean | 否 | 是否展示建筑物 | ||
setting | Object | 否 | 配置项 | ||
subSetting | Object | 否 | 扩展配置项,具体设置查看各类型地图 JS API 文档 | ||
bindtap | EventHandle | 否 | 点击地图时触发, 起返回经纬度信息 | ||
bindmarkertap | EventHandle | 否 | 点击标记点时触发,e.detail = {markerId} | ||
bindlabeltap | EventHandle | 否 | 点击label时触发,e.detail = {markerId} | ||
bindcontroltap | EventHandle | 否 | 点击控件时触发,e.detail = {controlId} | ||
bindcallouttap | EventHandle | 否 | 点击标记点对应的气泡时触发e.detail = {markerId} | ||
bindupdated | EventHandle | 否 | 在地图渲染更新完成时触发 | ||
bindregionchange | EventHandle | 否 | 视野发生变化时触发, | ||
bindpoitap | EventHandle | 否 | 点击地图poi点时触发,e.detail = {name, longitude, latitude} | ||
bindanchorpointtap | EventHandle | 否 | 点击定位标时触发,e.detail = {longitude, latitude} |
marker
支持的地图类型
值 | 坐标系 | 说明 | 最低版本 |
---|---|---|---|
tmap | GCJ-02 | 腾讯地图 如何申请key Javascript API GL 1.0 | |
bmap | BD09 | 百度地图 如何申请key JavaScript API GL v1.0 | |
amap | GCJ-02 | 高德地图 如何申请key JS API v2.0 |
marker
标记点用于在地图上显示标记的位置
属性 | 类型 | 默认值 | 必填 | 说明 | 最低版本 |
---|---|---|---|---|---|
id | 标记点 id | Number | 否 | marker 点击事件回调会返回此 id。建议为每个 marker 设置上 number 类型 id,保证更新 marker 时有更好的性能。 | |
clusterId | 聚合簇的 id | Number | 否 | 自定义点聚合簇效果时使用 | |
joinCluster | 是否参与点聚合 | Boolean | 否 | 默认不参与点聚合 | |
latitude | 纬度 | Number | 是 | 浮点数,范围 -90 ~ 90 | |
longitude | 经度 | Number | 是 | 浮点数,范围 -180 ~ 180 | |
title | 标注点名 | String | 否 | 点击时显示,callout存在时将被忽略 | |
zIndex | 显示层级 | Number | 否 | ||
iconPath | 显示的图标 | String | 是 | 项目目录下的图片路径,支持网络路径、本地路径、代码包路径( ) | |
rotate | 旋转角度 | Number | 否 | 顺时针旋转的角度,范围 0 ~ 360,默认为 0 | |
alpha | 标注的透明度 | Number | 否 | 默认 1,无透明,范围 0 ~ 1 | |
width | 标注图标宽度 | Number/String | 否 | 默认为图片实际宽度 | |
height | 标注图标高度 | Number/String | 否 | 默认为图片实际高度 | |
anchor | 经纬度在标注图标的锚点,默认底边中点 | Object | 否 | {x, y},x 表示横向(0-1),y 表示竖向(0-1)。{x: .5, y: 1} 表示底边中点 | |
callout | 标记点上方的气泡窗口 | Object | 否 | 支持的属性见下表,可识别换行符。 | |
customCallout | 自定义气泡窗口 | Object | 否 | 支持的属性见下表 | |
label | 为标记点旁边增加标签 | Object | 否 | 支持的属性见下表,可识别换行符。 |
属性 | 类型 | 说明 | 最低版本 |
---|---|---|---|
content | String | 文本 | |
Color | String | 文本颜色 | |
fontSize | Number | 文字大小 | |
borderRadius | Number | 边框圆角 | |
borderWidth | Number | 边框宽度 | |
borderColor | String | 边框颜色 | |
bgColor | String | 背景色 | |
padding | Number | 文本边缘留白 | |
display | String | 'BYCLICK':点击显示; 'ALWAYS':常显 | |
textAlign | String | 文本对齐方式。有效值: left, right, center | |
anchorX | Number | 横向偏移量,向右为正数 | |
anchorY | Number | 纵向偏移量,向下为正数 |
marker 上的自定义气泡 customCallout
customCallout
存在时将忽略callout
与title
属性。自定义气泡采用采用cover-view
定制,灵活度更高。
属性 | 类型 | 说明 | 最低版本 |
---|---|---|---|
display | String | 'BYCLICK':点击显示; 'ALWAYS':常显 | |
anchorX | Number | 横向偏移量,向右为正数 | |
anchorY | Number | 纵向偏移量,向下为正数 |
使用方式如下,map 组件下添加名为 callout 的 slot 节点,其内部的 cover-view 通过 marker-id 属性与 marker 绑定。当 marker 创建时,该 cover-view 显示的内容将作为 callout 显示在标记点上方。
<map>
<cover-view slot="callout">
<cover-view marker-id="1"></cover-view>
<cover-view marker-id="2"></cover-view>
</cover-view>
</map>
属性 | 类型 | 说明 | 最低版本 |
---|---|---|---|
content | String | 文本 | |
Color | String | 文本颜色 | |
fontSize | Number | 文字大小 | |
x | Number | label的坐标(废弃) | |
y | Number | label的坐标(废弃) | |
anchorX | Number | label的坐标,原点是 marker 对应的经纬度 | |
anchorY | Number | label的坐标,原点是 marker 对应的经纬度 | |
borderWidth | Number | 边框宽度 | |
borderColor | String | 边框颜色 | |
borderRadius | Number | 边框圆角 | |
bgColor | String | 背景色 | |
padding | Number | 文本边缘留白 | |
textAlign | String | 文本对齐方式。有效值: left, right, center |
polyline
指定一系列坐标点,从数组第一项连线至最后一项。绘制彩虹线时,需指定不同分段的颜色,如 points 包含 5 个点,则 colorList 应传入 4 个颜色值;若 colorList 长度小于 points.length - 1,则剩下的分段颜色与最后一项保持一致。
属性 | 类型 | 默认值 | 必填 | 说明 | 最低版本 |
---|---|---|---|---|---|
points | Array | [] | 是 | 经纬度数组 [{latitude: 0, longitude: 0}] | |
color | String | 否 | 线的颜色 | ||
colorList | Array | 否 | 彩虹线 存在时忽略 color 值 | ||
width | Number | 否 | 线的宽度 | ||
dottedLine | Boolean | false | 否 | 是否虚线 | |
arrowLine | Boolean | false | 否 | 带箭头的线 | |
borderColor | String | 否 | 线的边框颜色 | ||
borderWidth | Number | 否 | 线的厚度 | ||
zIndex | Number | 否 | 设置Z轴数值 | ||
subSetting | Object | 否 | 扩展配置项 |
circle
在地图上显示圆
属性 | 类型 | 默认值 | 必填 | 说明 | 最低版本 |
---|---|---|---|---|---|
latitude | Number | 0 | 是 | 纬度,浮点数,范围 -90 ~ 90 | |
longitude | Number | 0 | 是 | 经度,浮点数,范围 -180 ~ 180 | |
radius | Number | 0 | 是 | 半径 | |
color | String | 否 | 描边的颜色 | ||
fillColor | String | 否 | 填充颜色 | ||
strokeWidth | Number | 否 | 描边的宽度 | ||
zIndex | Number | 否 | 设置Z轴数值 | ||
subSetting | Object | 否 | 扩展配置项 |
polygon
指定一系列坐标点,根据 points 坐标数据生成闭合多边形
属性 | 类型 | 默认值 | 必填 | 说明 | 最低版本 |
---|---|---|---|---|---|
points | Array | [] | 是 | 经纬度数组 [{latitude: 0, longitude: 0}] | |
strokeWidth | Number | 否 | 描边的宽度 | ||
strokeColor | String | 否 | 描边的颜色 | ||
fillColor | String | 否 | 填充颜色 | ||
zIndex | Number | 否 | 设置Z轴数值 | ||
subSetting | Object | 否 | 扩展配置项 |
setting
提供 setting 对象统一设置地图配置。同时对于一些动画属性如rotate
和skew
,通过setData
分开设置时无法同时生效,需通过settting
统一修改。
const setting = {
skew: 0,
rotate: 0,
showLocation: false,
showScale: false,
subKey: '',
layerStyle: 1,
enableZoom: true,
enableScroll: true,
enableRotate: false,
showCompass: false,
enable3D: false,
enableOverlooking: false,
enableSatellite: false,
enableTraffic: false,
}
this.setData({
// 仅设置的属性会生效,其它的不受影响
setting: {
enable3D: true,
enableTraffic: true
}
})
regionchange 返回值
视野改变时,regionchange 会触发两次,返回的 type 值分别为 begin 和 end。
e = {causedBy, type, detail: {rotate, skew, scale, centerLocation, region}}
Tips:
- 地图组件集成了各厂家地图的 JavaScript 版本,需要开发者自行申请对应的key,使用
subKey
设置 - 根据设置的地图类型,请你使用对应地图的坐标系坐标
subSetting
可通过此属性添加未集成的控件属性,属性值参考各地图的 JS API文档
示例代码:
<!--pages/component/pages/map/map.mcml-->
<view style="width:100%;height:100%;overflwo:hidden;">
<view bindtap="bindtestap" style="width:100%;height:50%;">
<map
type=""
viewMode=""
latitude=""
longitude=""
scale=""
min-scale=""
max-scale=""
skew=""
rotate=""
enable-3D=""
show-compass=""
show-scale=""
enable-zoom=""
enable-scroll=""
enable-rotate=""
enable-satellite=""
enable-road=""
enable-traffic=""
enable-poi=""
enable-building=""
show-location=""
enable-overlooking=""
include-points=""
markers=""
polyline=""
polygons=""
circles=""
bindtap="bindevent"
bindlabeltap="bindevent"
bindmarkertap="bindevent"
bindcontroltap="bindevent"
bindcallouttap="bindevent"
bindupdated="bindevent"
bindregionchange="bindevent"
bindpoitap="bindevent"
bindanchorpointtap="bindevent"
>
<cover-view slot="callout">
<cover-view marker-id="1">我是customCallout</cover-view>
</cover-view>
</map>
</view>
<scroll-view scroll-y>
<view class="container">
<view class="statement">地图。</view>
<view class="cssname">type: 修改后地图会重新初始化</view>
<view>
<radio-group bindchange="typeChanged">
<radio checked value="tmap">腾讯</radio>
<radio value="bmap">百度</radio>
<radio value="amap">高德</radio>
</radio-group>
</view>
<view class="cssname">viewMode: 修改后地图会重新初始化</view>
<view>
<radio-group bindchange="viewModeChanged">
<radio checked value="3D">3D</radio>
<radio value="2D">2D</radio>
</radio-group>
</view>
<view class="cssname">scale</view>
<slider min="" max="" bindchange="scaleChanged" show-value value="16">缩放级别</slider>
<view class="cssname">min-scale, max-scale</view>
<checkbox-group bindchange="limitScale">
<checkbox name="scale" value="scale">限制缩放级别: 10-15</checkbox>
</checkbox-group>
<view class="cssname">rotate</view>
<slider min="0" max="360" bindchange="rotateChanged" show-value value="0">旋转角度</slider>
<view class="cssname">skew</view>
<slider min="0" max="80" bindchange="skewChanged" show-value value="0">倾斜角度</slider>
<view class="cssname">include-points</view>
<button bindtap="includeTap">视野包含指定坐标点</button>
<block mc:for="">
<view class="cssname"></view>
<view class="propClass">
<view></view>
<switch checked="" bindchange="propChanged" data-prop=""></switch>
</view>
</block>
<block mc:for="">
<view class="cssname">undefined:undefined, 参数event.detail</view>
<text space="nbsp" user-select="true" class="scrollDetail">{{item.detail || ''}}</text>
</block>
</view>
</scroll-view>
</view>
// pages/component/pages/map/map.js
var _properties = [
{name: 'enable-3D', prop:'enable3D', desc: '展示3D楼块', checked: false},
{name: 'show-compass', prop:'showCompass', desc: '显示指南针', checked: false},
{name: 'show-scale', prop:'showScale', desc: '显示比例尺', checked: false},
{name: 'show-location', prop:'showLocation', desc: '显示带有方向的当前定位点', checked: false},
{name: 'enable-overlooking', prop:'enableOverlooking', desc: '开启俯视', checked: false},
{name: 'enable-zoom', prop:'enableZoom', desc: '是否支持缩放', checked: true},
{name: 'enable-scroll', prop:'enableScroll', desc: '是否支持拖动', checked: true},
{name: 'enable-rotate', prop:'enableRotate', desc: '是否支持旋转', checked: false},
{name: 'enable-satellite', prop:'enableSatellite', desc: '是否开启卫星图', checked: false},
{name: 'enable-traffic', prop:'enableTraffic', desc: '是否开启实时路况', checked: false},
{name: 'enable-poi', prop:'enablePoi', desc: '是否展示 POI 点', checked: true},
{name: 'enable-building', prop:'enableBuilding', desc: '是否展示建筑物', checked: true}
];
var _data = {};
_properties.forEach(function (_prop) {
_data[_prop.prop] = _prop.checked
})
Page({
data: Object.assign({
includePoints: [
],
latitude:39.90923,
longitude:116.397428,
type: 'tmap',
scale: 13,
minScale: 3,
maxScale: 20,
skew: 0,
markers:[
{
clusterId: 'c0',
latitude:39.910,
longitude: 116.404,
zIndex: 10,
rotate: 0,
alpha: 0.8,
title: '我是title',
label:{
content: '我是label1',
borderColor:'#ff0000',
borderWidth: '1',
anchorX: 10
}
},
{
clusterId: 'c1',
latitude:39.915,
longitude: 116.395,
width:30,
height:30,
zIndex: 1,
rotate: 90,
alpha: 1,
anchor: {x: 0.5, y: 0.5},
iconPath: '/assets/images/car.png',
callout: { content:'我是callout', color: '#00ff00'},
subsetting: {
faceTo: 'map'
}
},
{
id: 1,
clusterId: 'c1',
latitude:39.918,
longitude: 116.394,
zIndex: 0,
alpha: 1,
customCallout: {}
}
],
polyline:[
{
points: [
{ latitude:39.915, longitude: 116.395},
{ latitude:39.915, longitude: 116.405},
{ latitude:39.900, longitude: 116.425},
{ latitude:39.900, longitude: 116.415}
],
colorList: ['#0000ff', '#00ff00', '#ff0000'],
width: 6,
color: '#0000ff',
arrowLine: true,
arrowIconPath: '/assets/images/car.png',
dottedLine: false
},
{
points: [
{ latitude:39.920, longitude: 116.387},
{ latitude:39.918, longitude: 116.394}
],
width: 3,
color: '#0000ff',
dottedLine: true
}
],
polygons:[
{
points: [
{ latitude:39.920, longitude: 116.387},
{ latitude:39.923, longitude: 116.385},
{ latitude:39.937, longitude: 116.394},
{ latitude:39.931, longitude: 116.401}
],
strokeWidth: 2,
strokeColor: '#0000ff',
fillColor: '#ff000070'
}
],
circles: [
{
latitude:39.900, longitude: 116.425,
radius: 1000,
color: '#0000ff',
strokeWidth: 2,
fillColor: '#ff000070'
}
],
properties:_properties,
events:[
{"name" : "bindtap", "desc" : "点击地图时触发"},
{"name" : "bindmarkertap", "desc" : "点击标记点时触发"},
{"name" : "bindlabeltap", "desc" : "点击label时触发"},
{"name" : "bindcallouttap", "desc" : "点击标记点对应的气泡时触发"},
{"name" : "bindupdated", "desc" : "在地图渲染更新完成时触发"},
{"name" : "bindregionchange", "desc" : "视野发生变化时触发"},
{"name" : "bindpoitap", "desc" : "点击地图poi点时触发"},
{"name" : "bindanchorpointtap", "desc" : "点击定位标时触发"}
]
}, _data),
includeTap: function () {
this.setData({
includePoints: [
{ latitude:39.920, longitude: 116.387},
{ latitude:39.923, longitude: 116.385},
{ latitude:39.937, longitude: 116.394},
{ latitude:39.931, longitude: 116.401},
{ latitude:39.915, longitude: 116.395},
{ latitude:39.915, longitude: 116.405},
{ latitude:39.900, longitude: 116.425},
{ latitude:39.900, longitude: 116.415}
]
})
},
viewModeChanged: function (e) {
this.setData({
viewMode: e.detail.value
})
},
typeChanged: function (e) {
this.setData({
type: e.detail.value
})
},
limitScale: function (e) {
if(e.detail.value.length > 0){
this.setData({
minScale: 10,
maxScale: 15
})
}
else{
this.setData({
minScale: 3,
maxScale: 20
})
}
},
scaleChanged: function(e){
this.setData({
scale: e.detail.value
})
},
skewChanged: function(e){
this.setData({
skew: e.detail.value
})
},
rotateChanged: function (e) {
this.setData({
rotate: e.detail.value
})
},
propChanged: function(e){
var data = {};
data[e.currentTarget.dataset.prop] = e.detail.value;
this.setData(data);
},
bindevent: function(e){
var eventName = 'bind' + (['begin', 'end'].indexOf(e.type) > -1 ? 'regionchange' : e.type);
var index = 0;
for(var i = 0; i < this.data.events.length; i++){
if(this.data.events[i].name == eventName){
index = i;
break;
}
}
var eventIndex = 'events[' + index + '].detail';
this.setData({
[eventIndex] : JSON.stringify(e, null, 2)
})
console.log(e);
}
})