微信小程序地图开发总结
<p> 最近在做一个微信小程序地图插件,通过传入起始位置名称和经纬度信息,就可以跳转到路线规划插件页面中,在该页面中,可以根据起始位置查询自驾,公共交通,步行等方式的路线信息,并且在地图上显示路线信息,在这个过程中,用到了微信小程序的组件map和腾讯地图sdk,接下来主要对微信小程序的地图开发进行总结</p><p> </p>
<p><strong><span style="font-size: 18px">一、微信小程序地图组件</span></strong></p>
<p><span style="font-size: 14px"> 为了方便微信小程序使用地图的相关功能,微信小程序为我们提供了map组件,通过这个组件,我们可以很简单的引入地图,并且还可以进行个性化地图的开发</span></p>
<p><strong><span style="font-size: 16px">1、map组件</span></strong></p>
<p><span style="font-size: 14px"> 微信小程序提供的地图组件,使用该组件只需要在wxml文件中加入下面的代码</span></p>
<div class="cnblogs_code">
<pre><map id="map" longitude="113.324520" latitude="23.099994" scale="14" style="width: 100%; height: 300px;"></map></pre>
</div>
<p> 上面这个例子中,我们只是简单的为该组件传入经纬度信息,并且设置缩放级别,当然,map组件还包括以下一些常用的属性</p>
<table style="height: 220px; width: 904px" border="1">
<tbody>
<tr style="background-color: rgba(11, 132, 243, 1)">
<td><strong><span style="color: rgba(0, 0, 0, 1)">属性</span></strong></td>
<td><strong><span style="color: rgba(0, 0, 0, 1)">类型</span></strong></td>
<td><strong><span style="color: rgba(0, 0, 0, 1)">说明</span></strong></td>
<td><strong><span style="color: rgba(0, 0, 0, 1)">是否必填</span></strong></td>
</tr>
<tr>
<td>longitude</td>
<td>number</td>
<td>中心经度</td>
<td>是</td>
</tr>
<tr>
<td>latitude</td>
<td>number</td>
<td>中心纬度</td>
<td>是</td>
</tr>
<tr>
<td>scale</td>
<td>number</td>
<td>缩放级别,取值范围为3-20</td>
<td>否</td>
</tr>
<tr>
<td>markers</td>
<td>Array.<marker></td>
<td>标记点</td>
<td>否</td>
</tr>
<tr>
<td>polyline</td>
<td>Array.<polyline></td>
<td>路线</td>
<td>否</td>
</tr>
<tr>
<td>include-points</td>
<td>Array.<point></td>
<td>缩放视野以包含所有给定的坐标点</td>
<td>否</td>
</tr>
<tr>
<td>enable-traffic</td>
<td>boolean</td>
<td>是否开启实时路况</td>
<td>否</td>
</tr>
<tr>
<td>bindregionchange</td>
<td>eventhandle</td>
<td>视野发生变化时触发</td>
<td>否</td>
</tr>
<tr>
<td>bindpoitap</td>
<td>eventhandle</td>
<td>点击地图poi点时触发</td>
<td>否</td>
</tr>
</tbody>
</table>
<p> 其中,longitude和latitude这两个属性是必须填写的,如果没有填写,地图将无法正常显示,除了上面的属性之外,还有很多其它属性,其它属性请前往微信小程序官方文档进行查看</p>
<p><strong><span style="font-size: 16px">2、map组件常用的属性介绍</span></strong></p>
<p><span style="font-size: 16px"><span style="font-size: 14px">(1)longitude和latitude属性</span></span><strong><span style="font-size: 16px"><br></span></strong></p>
<p><span style="font-size: 16px"><span style="font-size: 14px"> 一般来说,我们需要设置地图的中心经纬度地图才能够正常显示,如果我们传入的是起点经纬度srcLat和srcLng,终点经纬度dstLat和dstLng,如果想要得到其中心坐标,可以通过如下的计算得到:</span></span></p>
<p><span style="font-size: 16px"><span style="font-size: 14px"> centerLat = (srcLat + dstLat) / 2</span></span></p>
<p><span style="font-size: 16px"><span style="font-size: 14px"> centerLng = (srcLng + dstLng) / 2</span></span></p>
<p><span style="font-size: 16px"><span style="font-size: 14px"> 通过以下简单的计算,就可以设置出地图的中心经纬度</span></span></p>
<p><span style="font-size: 16px"><span style="font-size: 14px">(2)markers属性</span></span></p>
<p><span style="font-size: 16px"><span style="font-size: 14px"> 在很多情况下,我们经常需要在地图上添加一些标记点,比如我们希望插件中指定的起点和终点都能够用自定义的图标进行表示,这个时候就可以用到markers属性啦</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">Page({
data: {
markers: [{
iconPath: </span>"/resources/start.png"<span style="color: rgba(0, 0, 0, 1)">,
id: </span>0<span style="color: rgba(0, 0, 0, 1)">,
latitude: srcLat,
longitude: srcLng,
width: </span>50<span style="color: rgba(0, 0, 0, 1)">,
height: </span>50<span style="color: rgba(0, 0, 0, 1)">
},
{
iconPath: </span>"/resources/end.png"<span style="color: rgba(0, 0, 0, 1)">,
id: </span>0<span style="color: rgba(0, 0, 0, 1)">,
latitude: dstLat,
longitude: dstLng,
width: </span>50<span style="color: rgba(0, 0, 0, 1)">,
height: </span>50<span style="color: rgba(0, 0, 0, 1)">
}]
})</span></pre>
</div>
<p>(3)polyline属性</p>
<p> polyline属性主要指定一系列坐标点,当我们设置了这些坐标点之后,将会从这些坐标点的第一个坐标点连线连到最后一个坐标点,当我们需要在地图上显示起点和终点之间的路线时,就可以用polyline属性进行设置</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">Page({
data: {
polyline: [{
points: [{
longitude: </span>113.3245211<span style="color: rgba(0, 0, 0, 1)">,
latitude: </span>23.10229<span style="color: rgba(0, 0, 0, 1)">
}, {
longitude: </span>113.324520<span style="color: rgba(0, 0, 0, 1)">,
latitude: </span>23.21229<span style="color: rgba(0, 0, 0, 1)">
}],
color:</span>"#FF0000DD"<span style="color: rgba(0, 0, 0, 1)">,
width: </span>2<span style="color: rgba(0, 0, 0, 1)">,
dottedLine: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
}]
})</span></pre>
</div>
<p> 关于polyline属性的具体属性介绍,可以查看微信小程序官方文档</p>
<p><strong><span style="font-size: 16px">3、地图相关的API</span></strong></p>
<p><span style="font-size: 14px"> 为了更好的使用地图的功能,微信小程序也是为我们提供了关于操作地图的相关API</span></p>
<p> (1)wx.createMapContext(string mapId, Object this)</p>
<p> 创建map上下文MapContext 对象</p>
<p> (2)MapContext.getCenterLocation(Object object)</p>
<p> 获取当前地图中心的经纬度</p>
<p> (3)MapContext.getRegion(Object object)</p>
<p> 获取当前地图的视野范围</p>
<p> (4)MapContext.getScale(Object object)</p>
<p> 获取当前地图的缩放级别</p>
<p> (5)MapContext.includePoints(Object object)</p>
<p> 缩放视野展示所有经纬度</p>
<p> (6)MapContext.moveToLocation()</p>
<p> 将地图中心移动到当前定位点</p>
<p> (7)MapContext.translateMarker(Object object)</p>
<p> 平移marker,带动画</p>
<p> 使用上面的这些API,可以方便我们对map组件进行一些操作,下面来看个简单的例子</p>
<div class="cnblogs_code">
<pre><map id="myMap" show-location />
<button type="primary" bindtap="getCenterLocation">获取位置</button></pre>
</div>
<p> 当点击获取位置时,我们可以通过相关的API进行获取当前的中心位置</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">Page({
onReady: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (e) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 使用 wx.createMapContext 获取 map 上下文</span>
<span style="color: rgba(0, 0, 255, 1)">this</span>.mapCtx = wx.createMapContext('myMap'<span style="color: rgba(0, 0, 0, 1)">)
},
getCenterLocation: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.mapCtx.getCenterLocation({
success: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(res){
console.log(res.longitude)
console.log(res.latitude)
}
})
}
})</span></pre>
</div>
<p><strong><span style="font-size: 16px">4、使用位置服务相关的API</span></strong></p>
<p><span style="font-size: 14px"> 在进行地图开发的时候,我们经常需要使用内置软件,高德地图,腾讯地图这些进行导航,这个时候可以使用相关的位置服务API</span></p>
<p><span style="font-size: 14px"> (1)</span>wx.openLocation(Object object)</p>
<p> 使用微信内置地图查看位置</p>
<p> (2)wx.getLocation(Object object)</p>
<p> 获取当前的地理位置、速度</p>
<p> (3)wx.chooseLocation(Object object)</p>
<p> 打开地图选择位置</p>
<p> 当我们指定一个终点位置,然后希望能够使用内置地图软件进行导航时,可以这样实现</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.openLocation({
latitude: dstLat,
longitude: dstLng,
name: </span>'终点名称'<span style="color: rgba(0, 0, 0, 1)">
})</span></pre>
</div>
<p><strong><span style="font-size: 16px"> 5、使用map组件的一些问题</span></strong></p>
<p><span style="font-size: 14px"> map组件提供了很多地图的相关功能,但是使用map组件可能会遇到下面这些问题</span></p>
<p><span style="font-size: 14px"> (1)map组件及微信小程序的API无法提供路线规划,地址转换等功能</span></p>
<p><span style="font-size: 14px"> 可以使用腾讯地图sdk,高德地图sdk,百度地图sdk等进行开发,比如腾讯位置服务为微信小程序提供了基础的标点能力、线和圆的绘制接口等地图组件和位置展示、地图选点等地图API位置服务能力支持,使得开发者可以自由地实现自己的微信小程序产品,通过使用这些服务,再配合map组件,可以开发出具有各种各样功能的地图</span></p>
<p><span style="font-size: 14px"> (2)map组件的层级问题</span></p>
<p><span style="font-size: 14px"> <span style="color: rgba(153, 51, 0, 1)">map组件的层级被设置为最高,不能通过z-index进行设置,因此使用map组件可能会遮住一些文字图片等内容,可以通过cover-view进行解决,将文字和图片内容嵌套在cover-view中,但是cover-view只能嵌套cover-view和cover-image</span></span></p>
<p> </p>
<p><strong><span style="font-size: 18px; color: rgba(0, 0, 0, 1)">二、在微信小程序中使用腾讯地图服务</span></strong></p>
<p><span style="font-size: 14px"><span style="color: rgba(0, 0, 0, 1)"> 虽然map组件使我们可以很方便的使用地图,但是<span style="color: rgba(153, 51, 0, 1)">map组件只提供了最基本的地图显示功能</span>,同时,微信小程序提供的关于地图的API也只是提供了一些简单的功能,在实际中无法满足我们的各种需求,如果需要使用到路线规划,距离计算等功能,我们可以在微信小程序中接入<span style="color: rgba(153, 51, 0, 1)">腾讯地图,高德地图,百度地图</span>等服务,再结合map组件,去实现我们需要的功能</span></span></p>
<p><span style="font-size: 14px"><span style="color: rgba(0, 0, 0, 1)"> 下面以腾讯地图为例来介绍如何在微信小程序中使用腾讯地图服务</span></span></p>
<p><strong><span style="font-size: 16px"><span style="color: rgba(0, 0, 0, 1)">1、密钥的申请以及域名的设置</span></span></strong></p>
<p><span style="font-size: 14px"><span style="color: rgba(0, 0, 0, 1)"> 在微信小程序中使用腾讯地图服务大致需要进行如下几个过程:</span></span></p>
<p><span style="font-size: 14px"><span style="color: rgba(0, 0, 0, 1)"> (1)申请开发者密钥</span></span></p>
<p><span style="font-size: 14px"><span style="color: rgba(0, 0, 0, 1)"> <img src="https://img2018.cnblogs.com/blog/831247/201907/831247-20190704160132953-2128894527.png" alt="" width="477" height="166"></span></span></p>
<p> 这里需要填写Key的名称,名称可以根据实际项目应用来命名,申请成功后,会生成一串开发者密钥</p>
<p> (2)开通webserviceAPI服务</p>
<p> a、点击右上角的控制台</p>
<p> b、选择key管理</p>
<p> c、进入设置,勾选webserviceAPI,点击保存</p>
<p> (3)域名的配置</p>
<p> 上面的两个步骤都是在腾讯位置服务平台上进行的操作,要进行域名的配置,还需要登录微信公众平台进行域名的配置</p>
<p> 在开发小程序时,我们都会使用自己的APPID进行开发,只有配置了相关的域名,在请求时才能向指定的域名发送请求</p>
<p> 在“设置” -> “开发设置”中设置request合法域名,添加https://apis.map.qq.com</p>
<p> (4)下载微信小程序JavaScriptSDK</p>
<p> 如果完成了上面几个步骤,我们就可以在微信小程序中使用腾讯地图服务啦,在微信小程序中新建一个项目,写入APPID,记得这个APPID需要在微信公众平台中进行了域名的配置,不然会报错</p>
<p><strong><span style="font-size: 16px">2、实现路线规划</span></strong></p>
<p><span style="font-size: 14px"> 下面举一个简单的小例子,给定起点和终点经纬度,计算出起点和终点之间的路线</span></p>
<p><span style="font-size: 14px"> 首先,需要引入我们刚才下载的JavaScriptSDK</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 引入SDK核心类</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> QQMapWX = require('xxx/qqmap-wx.js');</pre>
</div>
<p> 进行API核心类的实例化</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 实例化API核心类</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> qqmapsdk = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> QQMapWX({
key: </span>'开发密钥(key)' <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 必填</span>
});</pre>
</div>
<p> 接着,我们需要通过调用路线规划的接口direction获取路线,direction接口可以提供驾车、骑行、步行、公交等路线规划功能</p>
<p> direction接口传入的参数如下</p>
<p> (1)mode</p>
<p> String,路线规划选择,可选值:'driving'(驾车)、'walking'(步行)、'bicycling'(骑行)、'transit'(公交),默认:'driving'</p>
<p> (2)from</p>
<p> String格式:lat<纬度>,lng<经度>(例:from: '39.984060,116.307520')</p>
<p> Object格式:{latitude: 纬度,longitude: 经度}<em id="__mceDel"><em id="__mceDel">(例:from: { </em></em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">latitude: 39.984060,</em></em></em></em></em></em></em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">longitude: 116.307520</em></em></em></em></em></em></em></em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">})</em></em></em></em></em></em></em></em></em></p>
<p> (3)to<em><em><em><em><em><em><em><em><br></em></em></em></em></em></em></em></em></p>
<p> String格式:lat<纬度>,lng<经度>(例:location: '39.984060,116.307520')</p>
<p> <em id="__mceDel"><em id="__mceDel">Object格式:</em><em id="__mceDel"><em id="__mceDel">{</em></em></em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">latitude: 纬度,</em></em></em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">longitude: 经度</em></em></em></em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">}</em></em></em></em></em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">(例:to: { </em></em></em></em></em></em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">latitude: 39.984060,</em></em></em></em></em></em></em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">longitude: 116.307520</em></em></em></em></em></em></em></em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">})</em></em></em></em></em></em></em></em></em></p>
<p><em><em><em><em><em><em><em><em><em> </em></em></em></em></em></em></em></em></em>下面给一个根据起点和终点实现路线规划的例子</p>
<div class="cnblogs_code">
<pre><!--wxml-->
<map id="myMap" style="width: 100%; height: 300px;"<span style="color: rgba(0, 0, 0, 1)">
longitude</span>="{{longitude}}" latitude="{{latitude}}" scale='16' polyline="{{polyline}}" show-location></map>
<!--js-->
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 引入SDK核心类</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> QQMapWX = require('xxx/qqmap-wx.js'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 实例化API核心类</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> qqmapsdk = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> QQMapWX({
key: </span>'开发密钥(key)' <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 必填</span>
<span style="color: rgba(0, 0, 0, 1)">});
Page({
data: {
srcLat: </span>'起点经度'<span style="color: rgba(0, 0, 0, 1)">,
srcLng: </span>'起点纬度'<span style="color: rgba(0, 0, 0, 1)">,
dstLat: </span>'终点经度'<span style="color: rgba(0, 0, 0, 1)">,
dstLng: </span>'起点纬度'<span style="color: rgba(0, 0, 0, 1)">,
latitude: </span>''<span style="color: rgba(0, 0, 0, 1)">,
longitude: </span>''<span style="color: rgba(0, 0, 0, 1)">
},
onLoad() {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> _this = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用距离计算接口</span>
<span style="color: rgba(0, 0, 0, 1)"> qqmapsdk.direction({
mode: </span>'driving',<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">可选值:'driving'(驾车)、'walking'(步行)、'bicycling'(骑行),不填默认:'driving',可不填</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">from参数不填默认当前地址</span>
<span style="color: rgba(0, 0, 0, 1)"> from: {
latitude: _this.data.srcLat,
longitude: _this.data.srcLng
},
to: {
latitude: _this.data.dstLat,
longitude: _this.data.dstLng
},
success: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (res) {
console.log(res);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> ret =<span style="color: rgba(0, 0, 0, 1)"> res;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> coors = ret.result.routes.polyline, pl =<span style="color: rgba(0, 0, 0, 1)"> [];
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">坐标解压(返回的点串坐标,通过前向差分进行压缩)</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> kr = 1000000<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = 2; i < coors.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
coors </span>= Number(coors) + Number(coors) /<span style="color: rgba(0, 0, 0, 1)"> kr;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将解压后的坐标放入点串数组pl中</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = 0; i < coors.length; i += 2<span style="color: rgba(0, 0, 0, 1)">) {
pl.push({ latitude: coors, longitude: coors })
}
console.log(pl)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置polyline属性,将路线显示出来,将解压坐标第一个数据作为起点</span>
<span style="color: rgba(0, 0, 0, 1)"> _this.setData({
latitude:pl[</span>0<span style="color: rgba(0, 0, 0, 1)">].latitude,
longitude:pl[</span>0<span style="color: rgba(0, 0, 0, 1)">].longitude,
polyline: [{
points: pl,
color: </span>'#FF0000DD'<span style="color: rgba(0, 0, 0, 1)">,
width: </span>4<span style="color: rgba(0, 0, 0, 1)">
}]
})
},
fail: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (error) {
console.error(error);
},
complete: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (res) {
console.log(res);
}
});
}
}) </span></pre>
</div>
<p> 腾讯地图服务还提供了距离计算等其它功能,具体功能可以查看腾讯地图服务官方文档</p>
<p> </p>
<p> 刚开始接触微信小程序,还有很多东西需要学习,大家一起交流学习呀</p>
<p><em id="__mceDel"><span style="font-size: 14px"> </span></em></p>
<p> </p><br><br>
来源:https://www.cnblogs.com/Yellow-ice/p/11133283.html
頁:
[1]