這篇地圖開發(fā)教程先對uniapp開發(fā)map進行的說明显蝌,(uniapp是一個使用vue.js開發(fā)所有前端應(yīng)用的框架,開發(fā)者編寫一套代碼订咸,可以發(fā)布到ios曼尊,android,web以及各種小程序脏嚷,快應(yīng)用等多個平臺),并對uniapp使用map組件的基本使用方法做了詳細的介紹骆撇,并對地址搜索、獲取附近動態(tài)然眼,地圖上標(biāo)注附近的人艾船,定位附近門店、滑動軌跡高每、vue接入騰訊地圖接口等示例代碼與效果進行了完備的展示屿岂。
二、使用步驟
1.uniapp開發(fā)map說明
使用uniapp是因為它是一個使用vue.js開發(fā)所有前端應(yīng)用的框架鲸匿,開發(fā)者編寫一套代碼爷怀,可以發(fā)布到ios,android带欢,web以及各種小程序运授,快應(yīng)用等多個平臺烤惊。
使用map地圖組件開發(fā),地圖組件用于展示地圖(使用的時騰訊地圖)吁朦,說一下它的屬性有:
longitude(類型為Number柒室,沒有默認(rèn)值,表示中心經(jīng)度)
latitude(類型為Number逗宜,沒有默認(rèn)值雄右,表示中心緯度)
scale(類型為Number,默認(rèn)值為16纺讲,縮放級別取值范圍為5-18)
markers(類型為Array數(shù)組擂仍,類型為數(shù)組即表示地圖上可以有多個,沒有默認(rèn)值熬甚,表示標(biāo)記點)
polyline(類型為Array數(shù)組逢渔,沒有默認(rèn)值,表示路線乡括,數(shù)組上的所有點連成線)
circles(類型Array數(shù)組肃廓,表示圓)
controls(類型Array數(shù)組,表示控件)
include-points(類型Array數(shù)組粟判,表示縮放視野已包含所有給定的坐標(biāo)點)
enable-3D(類型為Boolean亿昏,默認(rèn)值為false峦剔,表示是否顯示3D摟塊)
show-compass(類型為Boolean档礁,默認(rèn)值為false,表示為是否顯示指南針)
enable-overlooking(類型為Boolean吝沫,默認(rèn)值為false呻澜,表示為是否開啟俯視)
enable-satellite(類型為Boolean,默認(rèn)值為false惨险,表示為是否開啟衛(wèi)星圖)
enable-traffic(類型為Boolean羹幸,默認(rèn)值為false,表示為是否開啟實時路況)
show-location(類型為Boolean辫愉,表示顯示帶有方向的當(dāng)前定位點)
polygons(類型Array栅受,表示為多邊形)
點擊屬性
- @markertap-表示點擊標(biāo)記點時觸發(fā),e.detail={markerId}
- @labeltap-表示點擊label時觸發(fā)恭朗,e.detail = {markerId}
- @callouttap-表示點擊標(biāo)記點對應(yīng)的氣泡時觸發(fā)屏镊,e.detail = {markerId}
- @controltap-表示點擊控件時觸發(fā),e.detail = {controlId}
- @regionchange-表示視野發(fā)生變化時觸發(fā)
- @tap-表示點擊地圖時觸發(fā); App-nuve痰腮、微信小程序2.9支持返回經(jīng)緯度
- @updated-表示在地圖渲染更新完成時觸發(fā)
我們在寫map組件時而芥,組件的寬/高推薦寫直接量,比如說是 750rpx膀值,不要設(shè)置百分比值棍丐,在uni-app中只支持gcj02坐標(biāo)误辑。
介紹markers屬性-類型為數(shù)組Array
由之前描述可知,markers屬性類型為Array歌逢,表示標(biāo)記點用于在地圖上顯示標(biāo)記的位置巾钉。這個數(shù)組屬性,它里面有它的對象配置屬性秘案,分別是:
- id睛琳,表示標(biāo)記點id,類型為Number踏烙,必填項师骗,marker點擊事件回調(diào)會返回此id,建議為每個marker設(shè)置上Number類型id讨惩,保證更新marker時有更好的性能辟癌。
- latitude,緯度荐捻,類型Number黍少,必填項,浮點數(shù)处面,范圍 -90 ~ 90
- longitude厂置,經(jīng)度,類型Number魂角,必填項昵济,浮點數(shù),范圍 -180 ~ 180
- title野揪,標(biāo)注點名访忿,類型String,不是必填斯稳,點擊時顯示海铆,callout存在時將被忽略
- iconPath,顯示的圖標(biāo)挣惰,類型String卧斟,必填項,項目目錄下的圖片路徑
- rotate憎茂,旋轉(zhuǎn)角度珍语,類型Number,不是必填唇辨,順時針旋轉(zhuǎn)的角度廊酣,范圍 0 ~ 360,默認(rèn)為 0
- alpha赏枚,標(biāo)注的透明度亡驰,類型Number晓猛,不是必填,默認(rèn)1凡辱,無透明戒职,范圍 0 ~ 1
- width,標(biāo)注圖標(biāo)寬度透乾,類型Number洪燥,不是必填,默認(rèn)為圖片實際寬度
- height乳乌,標(biāo)注圖標(biāo)高度捧韵,類型Number,不是必填汉操,默認(rèn)為圖片實際高度
- callout再来,自定義標(biāo)記點上方的氣泡窗口,類型Object磷瘤,不是必填 - 可識別換行符
- label芒篷,為標(biāo)記點旁邊增加標(biāo)簽,類型Object采缚,不是必填 - 可識別換行符
- anchor针炉,經(jīng)緯度在標(biāo)注圖標(biāo)的錨點,默認(rèn)底邊中點扳抽,不是必填篡帕,{x, y},x表示橫向(0-1)摔蓝,y表示豎向(0-1)赂苗。{x: .5, y: 1} 表示底邊中點
marker 上的氣泡 callout(Object類型)
marker數(shù)組 上屬性 callout 對象使用屬性:
- content愉耙,文本贮尉,String
- color坪它,文本顏色莹汤,String
- fontSize,文字大小辨嗽,Number
- borderRadius赌渣,callout邊框圓角魏铅,Number
- bgColor,背景色坚芜,String
- padding览芳,文本邊緣留白,Number
- display鸿竖,'BYCLICK':點擊顯示; 'ALWAYS':常顯沧竟,String
- textAlign铸敏,文本對齊方式。有效值: left, right, center悟泵,String
marker 上的標(biāo)簽 label(Object類型)
- content杈笔,文本,String
- color糕非,文本顏色蒙具,String
- fontSize,文字大小朽肥,Number
- x禁筏,label的坐標(biāo),原點是 marker 對應(yīng)的經(jīng)緯度衡招,Number
- y融师,label的坐標(biāo),原點是 marker 對應(yīng)的經(jīng)緯度蚁吝,Number
- borderWidth旱爆,邊框?qū)挾龋琋umber
- borderColor窘茁,邊框顏色怀伦,String
- borderRadius,邊框圓角山林,Number
- bgColor房待,背景色,String
- padding驼抹,文本邊緣留白桑孩,Number
- textAlign,文本對齊方式框冀。有效值: left, right, center流椒,String
polyline
polyline表示指定一系列坐標(biāo)點,從數(shù)組第一項連線至最后一項
- points明也,經(jīng)緯度數(shù)組宣虾,類型為Array,必填温数,如:[{latitude: 0, longitude: 0}]
- color绣硝,線的顏色,類型為String撑刺,不必填鹉胖,如:#0000AA
- width,線的寬度,類型為Number甫菠,不必填
- dottedLine败许,是否虛線,類型為Boolean淑蔚,不必填市殷,默認(rèn)值false
- arrowLine,帶箭頭的線刹衫,類型為Boolean醋寝,不必填,默認(rèn)值為false
- arrowIconPath带迟,更換箭頭圖標(biāo)音羞,類型為String,不必填仓犬,在arrowLine為true時嗅绰,默認(rèn)帶箭頭的線時生效
- borderColor,線的邊框顏色搀继,類型為String窘面,不必填
- borderWidth,線的厚度叽躯,類型為Number财边,不必填
polygon
polygon指定一系列坐標(biāo)點,根據(jù)points坐標(biāo)數(shù)據(jù)生成閉合多邊形 - points点骑,經(jīng)緯度數(shù)組酣难,array,必填黑滴,如:[{latitude: 0, longitude: 0}]
- strokeWidth憨募,描邊的寬度,Number袁辈,否
- strokeColor 描邊的顏色菜谣,String,否
- fillColor吵瞻,填充顏色葛菇,String,否
- zIndex橡羞,設(shè)置多邊形 Z 軸數(shù)值,Number济舆,否
circles
circles在地圖上顯示圓
- latitude卿泽,緯度,Number,必填签夭,浮點數(shù)齐邦,范圍 -90 ~ 90
- longitude,經(jīng)度第租,Number措拇,必填,浮點數(shù)慎宾,范圍-180 ~ 180
- color丐吓,描邊的顏色,String趟据,不必填券犁,如:#0000AA
- fillColor,填充顏色汹碱,String粘衬,不必填,如:#0000AA
- radius咳促,半徑稚新,Number,必填
- strokeWidth跪腹,描邊的寬度枷莉,Number,不必填
controls
controls在地圖上顯示控件尺迂,控件不隨著地圖移動 - id笤妙,控件id,Number噪裕,不必填蹲盘,在控件點擊事件回調(diào)會返回此id
- position,控件在地圖的位置膳音,Object召衔,必填,控件相對地圖位置
- iconPath祭陷,顯示的圖標(biāo)苍凛,String,必填兵志,項目目錄下的圖片路徑醇蝴,支持相對路徑寫法,以'/'開頭則表示相對項目根目錄想罕;也支持臨時路徑
- clickable悠栓,是否可點擊,Boolean,不必填惭适,默認(rèn)不可點擊
position - left笙瑟,距離地圖的左邊界多遠,Number癞志,不必填往枷,默認(rèn)為0
- top,距離地圖的上邊界多遠凄杯,Number错洁,不必填,默認(rèn)為0
- width盾舌,控件寬度墓臭,Number,不必填妖谴,默認(rèn)為圖片寬度
- height窿锉,控件高度,Number膝舅,不必填嗡载,默認(rèn)為圖片高度
注意在uniapp中地圖組件的經(jīng)緯度必填,如果不填仍稀,經(jīng)緯度則默認(rèn)值是北京的經(jīng)緯度洼滚。
2.uniapp使用map組件
基本使用方法
使用uniapp開發(fā)中的map組件,基本使用方法:
代碼如下(示例):
<map :scale="scale" style="width: 100%; height: 100%;"
enable-3D="false" show-compass="false" enable-overlooking="false"
:enable-satellite="false" :enable-traffic="false" show-location="false"
:latitude="latitude" :longitude="longitude" :markers="covers">
</map>
markers屬性的使用技潘,代碼如下(示例):
markers: [{
id: 1, // Number
title: '1', // String-標(biāo)注點名
rotate: 180, // Number - 順時針旋轉(zhuǎn)的角度遥巴,范圍 0 ~ 360,默認(rèn)為 0
alpha: 0.5, // 默認(rèn)1享幽,無透明铲掐,范圍 0 ~ 1
latitude: 39.899,
longitude: 116.39742,
width: 30,
height: 30,
// callout: {
// display: "BYCLICK",
// padding: 10,
// borderRadius: 5,
// content: '',
// },
// anchor: {},
iconPath: '../../../static/location.png', // 顯示的圖標(biāo)
}, {
id: 2,
title: '2', // String
latitude: 39.90,
longitude: 116.39,
callout: {
color: '#007AFF', // 文本顏色
bgColor: '#563BFF', // 背景色
display: "ALWAYS", // 'BYCLICK':點擊顯示; 'ALWAYS':常顯
fontSize: 15,
textAlign: 'left', // 文本對齊方式。有效值: left, right, center
padding: 10, // 文本邊緣留白
borderRadius: 5,
content: '騰訊地圖',
},
label: {
content: 'Jeskson',
color: '#000000',
fontSize: 12,
borderWidth: 12,
borderColor: '#007AFF',
borderRadius: 5,
padding: 5,
textAlign: 'center',
bgColor: '#563BFF',
},
iconPath: '../../../static/location.png'
}]
預(yù)覽效果如下:
controls:[{
// 在地圖上顯示控件值桩,控件不隨著地圖移動
id: 1, // 控件id
iconPath:'../../static/icon.png', // 顯示的圖標(biāo)
position:{
// 控件在地圖的位置
left: 15,
top: 15,
width: 50,
height: 50
},
}],
地址搜索
uni-app 只支持 gcj02 坐標(biāo)
uni.getLocation(OBJECT)中的object參數(shù)
獲取當(dāng)前的地理位置摆霉、速度。 在微信小程序中奔坟,當(dāng)用戶離開應(yīng)用后携栋,此接口無法調(diào)用,除非申請后臺持續(xù)定位權(quán)限咳秉;當(dāng)用戶點擊“顯示在聊天頂部”時婉支,此接口可繼續(xù)調(diào)用。
OBJECT參數(shù)說明
- type滴某,String磅摹,不必填滋迈,默認(rèn)為 wgs84 返回 gps 坐標(biāo)霎奢,gcj02 返回國測局坐標(biāo)户誓,可用于
uni.openLocation 的坐標(biāo),app平臺高德SDK僅支持返回gcj02 - altitude幕侠,Boolean帝美,不必填,傳入 true 會返回高度信息晤硕,由于獲取高度需要較高精確度悼潭,會減慢接口返回速度
- geocode,Boolean舞箍,不必填舰褪,默認(rèn)false,是否解析地址信息
- success疏橄,F(xiàn)unction占拍,必填,接口調(diào)用成功的回調(diào)函數(shù)捎迫,返回內(nèi)容詳見返回參數(shù)說明
- fail晃酒,F(xiàn)unction,不必填窄绒,接口調(diào)用失敗的回調(diào)函數(shù)
- complete贝次,F(xiàn)unction,不必填彰导,接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功蛔翅、失敗都會執(zhí)行)
對于success返回參數(shù)說明:
- latitude,緯度位谋,浮點數(shù)山析,范圍為-90~90,負(fù)數(shù)表示南緯
- longitude倔幼,經(jīng)度盖腿,浮點數(shù),范圍為-180~180损同,負(fù)數(shù)表示西經(jīng)
- speed翩腐,速度,浮點數(shù)膏燃,單位m/s
- accuracy茂卦,位置的精確度
- altitude,高度组哩,單位 m
- verticalAccuracy等龙,垂直精度处渣,單位 m(Android 無法獲取,返回 0)
- horizontalAccuracy蛛砰,水平精度罐栈,單位 m
- address,地址信息(僅App端支持泥畅,需配置geocode為true)
address 地址信息說明
- country荠诬,String,國家 如“中國”位仁,沒有則返回undefined
- province柑贞,String,省份名稱 如“北京市”聂抢,沒有則返回undefined
- city钧嘶,String,城市名稱琳疏,如“北京市”有决,沒有則返回undefined
- district,String轿亮,區(qū)疮薇,縣名稱 如“朝陽區(qū)”,沒有則返回undefined
- street我注,String按咒,街道信息,如“酒仙橋路”但骨,沒有則返回undefined
- streetNum励七,String,獲取街道門牌號信息奔缠,如“3號”掠抬,沒有則返回undefined
- poiName,String POI信息校哎,如“電子城.國際電子總部”两波,沒有則返回undefined
- postalCode,String闷哆,郵政編碼腰奋,如“100016”,沒有則返回undefined
- cityCode抱怔,String劣坊,城市代碼,如“010”屈留,沒有則返回undefined
uni.chooseLocation(OBJECT)打開地圖選擇位置局冰。
- latitude测蘑,String,不必填康二,目標(biāo)地緯度
- longitude碳胳,String,不必填赠摇,目標(biāo)地經(jīng)度
- keyword固逗,String浅蚪,不必填藕帜,搜索關(guān)鍵字,僅App平臺支持
- success惜傲,F(xiàn)unction洽故,必填
- fail,F(xiàn)unction盗誊,不必填
- complete时甚,F(xiàn)unction,不必填
success返回參數(shù)說明:
- name哈踱,位置名稱
- address荒适,詳細地址
- latitude,緯度开镣,浮點數(shù)刀诬,范圍為-90~90,負(fù)數(shù)表示南緯邪财,使用 gcj02 國測局坐標(biāo)系陕壹。
- longitude,經(jīng)度树埠,浮點數(shù)糠馆,范圍為-180~180,負(fù)數(shù)表示西經(jīng)怎憋,使用 gcj02 國測局坐標(biāo)系又碌。
代碼如下(示例):
chooseLocation(e) { //打開地圖選擇位置
uni.chooseLocation({
success: res => {
console.log('位置名稱:' + res.name);
console.log('詳細地址:' + res.address);
console.log('緯度:' + res.latitude);
console.log('經(jīng)度:' + res.longitude);
uni.getLocation({
type: 'gcj02',
altitude:true,
geocode:true,
success: function(res) {
console.log('當(dāng)前位置的經(jīng)度:' + res.longitude);
console.log('當(dāng)前位置的緯度:' + res.latitude);
}
});
console.log('省:' + res.address.slice(0, res.address.indexOf('省') + 1));
console.log('市:' + res.address.slice(res.address.indexOf('省') + 1, res.address.indexOf('市') + 1));
console.log('區(qū):' + res.address.slice(res.address.indexOf('市') + 1, res.address.indexOf('區(qū)') + 1));
this.query.address = res.address;
this.query.latitude = res.latitude;
this.query.longitude = res.longitude;
this.query.province = res.address.slice(0, res.address.indexOf('省') + 1)
this.query.city = res.address.slice(res.address.indexOf('省') + 1, res.address.indexOf('市') + 1)
this.query.district = res.address.slice(res.address.indexOf('市') + 1, res.address.indexOf('區(qū)') + 1)
}
});
},
預(yù)覽效果:
獲取附近的動態(tài)绊袋,點聚合
uni.getNetworkType(OBJECT)獲取網(wǎng)絡(luò)類型毕匀。
uni.createMapContext(mapId,this)創(chuàng)建并返回 map 上下文 mapContext 對象。在自定義組件下愤炸,第二個參數(shù)傳入組件實例this期揪,以操作組件內(nèi) <map> 組件。
mapContext-mapContext 通過 mapId 跟一個 <map> 組件綁定规个,通過它可以操作對應(yīng)的 <map> 組件凤薛。
該對象得方法列表:
- getCenterLocation OBJECT 獲取當(dāng)前地圖中心的經(jīng)緯度姓建,返回的是 gcj02 坐標(biāo)系,可以用于 uni.openLocation
- moveToLocation OBJECT 將地圖中心移動到當(dāng)前定位點缤苫,需要配合map組件的show-location使用
- translateMarker OBJECT 平移marker速兔,帶動畫
- includePoints OBJECT 縮放視野展示所有經(jīng)緯度
- getRegion OBJECT 獲取當(dāng)前地圖的視野范圍
- getScale OBJECT 獲取當(dāng)前地圖的縮放級別
- $getAppMap 獲取原生地圖對象 plus.maps.Map
getCenterLocation 的 OBJECT 參數(shù)列表
success Function 不必填,接口調(diào)用成功的回調(diào)函數(shù) 活玲,res = { longitude: "經(jīng)度", latitude: "緯度"}
moveToLocation 的 OBJECT 參數(shù)列表 - 可不必填
translateMarker 的 OBJECT 參數(shù)列表
- markerId Number 必填 指定 marker
- destination Object 必填 指定 marker 移動到的目標(biāo)點
- autoRotate Boolean 不必填 移動過程中是否自動旋轉(zhuǎn) marker
- rotate Number 不必填 marker 的旋轉(zhuǎn)角度
- duration Number 不必填 動畫持續(xù)時長涣狗,默認(rèn)值1000ms,平移與旋轉(zhuǎn)分別計算
- animationEnd Function 不必填 動畫結(jié)束回調(diào)函數(shù)
- fail Function 不必填 接口調(diào)用失敗的回調(diào)函數(shù)
代碼如下(示例):
<view id="activeMap">
<view @tap="activeMarker={}">
<view class="page-body map-view" style="z-index: 1;position: relative;">
<view class="page-section page-section-gap map-view">
<map :markers="shops" id="map1" :show-location="true" :latitude="latitude" :longitude="longitude" @regionchange="regionChange"
@markertap="markerTap" @tap="activeMarker={}">
<!-- @markertap 點擊標(biāo)記點時觸發(fā)舒憾,e.detail = {markerId}-->
<!-- @tap 點擊地圖時觸發(fā)-->
<!-- @regionchange 視野發(fā)生變化時觸發(fā)-->
</map>
<cover-image class="map-image" src="../static/address.png"></cover-image>
</view>
</view>
</view>
</view>
regionChange() { // 移動地圖后重新獲取門店
uni.createMapContext('map1', this).getCenterLocation({
success: res => {
console.log(res.latitude)
console.log(res.longitude)
this.shopTimeout = setTimeout(_ => {
this.shops = [{
address: "廣東省汕頭市xxx區(qū)xx大道1",
distance: 122,
end_time: "1",
id: 2,
latitude: "22.72078500009999",
longitude: "114.36090200009999",
shop: {
iconPath: '/static/logo.png',
id: 3,
latitude: "22.72078500009999",
longitude: "114.36090200009999",
height: 34,
width: 34,
shop: {return: 0}
},
return: 0,
height: 34,
width: 34,
start_time: "1",
store_name: "三星大酒店",
iconPath: '/static/shop.png',
}]
}, 500)
},
fail: res => {
uni.showModal({
content: '獲取位置失敗',
showCancel: false
})
}
})
},
預(yù)覽效果圖如下:
地圖上標(biāo)注附近的人
代碼如下(示例):
list: [{
id: 1264640,
user_id: 335187,
place: "Jeskson市",
text: "dadaqianduan.cn",
latitude: "27.267520",
longitude: "111.727120",
status: "normal",
nickname: "dada",
avatar: "https://image.aishencn.com/2020/10/20/002207441_40845724-user.jpg",
distance: 13419,
}, {
id: 1272720,
user_id: 36950,
place: "dadaqianduan市",
text: "dadaqianduan.cn",
latitude: "27.257640",
longitude: "111.747910",
deletetime: null,
status: "normal",
nickname: "dadaqianduan",
avatar: "https://image.aishencn.com/2020/04/09/004135379_37869100-user.jpg",
distance: 27070,
}, {
id: 1316740,
user_id: 366172,
place: "dadaqianduan.cn",
text: "dadaqianduan.cn",
images: "https://image.aishencn.com/2020/11/04/215134979_98197351-bbs.jpg",
latitude: "27.257430",
longitude: "111.732960",
status: "normal",
nickname: "dada",
avatar: "https://image.aishencn.com/2020/11/04/182622730_98197351-user.venus/cache/ext/crop/1604518314542_jpg",
distance: 27190,
images_arr: ["https://image.aishencn.com/2020/11/04/215134979_98197351-bbs.jpg"]
}],
預(yù)覽效果如圖: