微信小程序能使用海外版的地图开发应用吗

微信小程序能使用海外版的地图开发应用吗,第1张

这里贴下主要代码介绍下:

先是wxml文件:

<map id='parkingMap' class='mp_map' longitude="{{lon}}" latitude="{{lat}}" scale='14' markers='{{markers}}' controls='{{controls}}' bindcontroltap='controltap' bindmarkertap='markertap' show-location='true' bindregionchange='regionchange' bindtap='clickOther'> 1

标签里的属性API文档里都有介绍,应该没什么好说的了;

可以看到在地图上有标记p,点击需要有提示信息,查了下微信map上面无法在继续添加覆盖物,然后看了API文档有个cover-view,于是就用这个来做了个提示信息:

<cover-view class='parkingName'>{{parkingName}}</cover-view>

<cover-view class='space'>

<cover-view class='totalNum'>总车位:<cover-view style='color:red'>{{totalNum}}</cover-view></cover-view>

<cover-view class='leftNum'>剩余车位:<cover-view style='color:red'>{{leftNum}}</cover-view></cover-view>

</cover-view>

</cover-view>

<cover-view class='right'>

<cover-image src='../../image/arrow_right.png' class='arrow'></cover-image>

</cover-view>

</cover-view>

123456789101112131415

注意这里是要添加到map标签里面:<map><cover-view></cover-view></map>

加了个if判断,点击地图上的P才显示;

js文件:

初始化data:

//定义全局变量var longitude, latitude, mapCtxvar centerLongitude, centerLatitude, windowWidth, windowHeight /**

* 页面的初始数据

*/

data: {

lon: '',

lat: '',

is_show: false,

parkingName:'',

totalNum:'',

leftNum:'',

markers: [],

controls: []

},12345678910111213141516

首先是获取定位,使用微信小程序API提供的方式:

getloca:function(){

var that = this

var time

wx.getLocation({

type: "wgs84 ",

success: function (res) {

console.log(res.latitude)

console.log(res.longitude)

latitude = res.latitude

longitude = res.longitude

centerLatitude = latitude

centerLongitude = longitude

that.setData({

lat: res.latitude,

lon: res.longitude,

})

},

fail: function (res) {

}

})

},1234567891011121314151617181920212223

在实际测试中,发现有的android机掉用改API就是无法定位,测试过所需要的权限都有,最后尝试了下百度地图,居然发现成功了,一下是百度地图定位(具体可以查看百度地图小程序API)的方式:

//引入百度地图apivar bmap = require('../../libs/bmap-wx.min.js')//百度api定位我的位置

getLocaByBM:function(){

var that = this var BMap = new bmap.BMapWX({

ak: '你自己申请的ak'

}) var fail = function (data) {

console.log(data)

} var success = function (data) {

wxMarkerData = data.wxMarkerData

console.log(wxMarkerData)

centerLatitude = wxMarkerData[0].latitude

centerLongitude = wxMarkerData[0].longitude

that.setData({

markers: wxMarkerData

})

that.setData({

lat: wxMarkerData[0].latitude

})

that.setData({

lon: wxMarkerData[0].longitude

})

}//好像必须要加这个

BMap.regeocoding({

fail: fail,

success: success,

iconPath: '../../image/center.png',

iconTapPath: '../../img/center.png',

width:23,

height:40

})

},12345678910111213141516171819202122232425262728293031323334353637

好吧,这次的测试结果苹果,小米,华为,三星均能正常定位了;希望微信以后能改善这个问题吧。

不过这里需要注意一个问题,小程序是基于腾讯地图(使用火星坐标),百度地图定位出来的坐标需要转换才能正确的标识,文末会贴出转换的代码;

下面是map的 *** 作了,常见的几种添加markers,controls,地图移动时的监听处理;

先介绍地图移动的监听处理:

这里可以结合微信API文档来看会更清晰(文笔不好,写的有些乱),先获取map对象:

二、使用步骤

1.uniapp开发map说明

使用uniapp是因为它是一个使用vue.js开发所有前端应用的框架,开发者编写一套代码,可以发布到ios,android,web以及各种小程序,快应用等多个平台。 使用map地图组件开发,地图组件用于展示地图(使用的时腾讯地图),说一下它的属性有:

longitude(类型为Number,没有默认值,表示中心经度)

latitude(类型为Number,没有默认值,表示中心纬度)

scale(类型为Number,默认值为16,缩放级别取值范围为5-18)

markers(类型为Array数组,类型为数组即表示地图上可以有多个,没有默认值,表示标记点)

polyline(类型为Array数组,没有默认值,表示路线,数组上的所有点连成线)

circles(类型Array数组,表示圆)

controls(类型Array数组,表示控件)

include-points(类型Array数组,表示缩放视野已包含所有给定的坐标点)

enable-3D(类型为Boolean,默认值为false,表示是否显示3D搂块)

show-compass(类型为Boolean,默认值为false,表示为是否显示指南针)

enable-overlooking(类型为Boolean,默认值为false,表示为是否开启俯视)

enable-satellite(类型为Boolean,默认值为false,表示为是否开启卫星图)

enable-traffic(类型为Boolean,默认值为false,表示为是否开启实时路况)

show-location(类型为Boolean,表示显示带有方向的当前定位点)

polygons(类型Array,表示为多边形)

点击属性

@markertap-表示点击标记点时触发,e.detail={markerId}

@labeltap-表示点击label时触发,e.detail = {markerId}

@callouttap-表示点击标记点对应的气泡时触发,e.detail = {markerId}

@controltap-表示点击控件时触发,e.detail = {controlId}

@regionchange-表示视野发生变化时触发

@tap-表示点击地图时触发App-nuve、微信小程序2.9支持返回经纬度

@updated-表示在地图渲染更新完成时触发

我们在写map组件时,组件的宽/高推荐写直接量,比如说是 750rpx,不要设置百分比值,在uni-app中只支持gcj02坐标。 介绍markers属性-类型为数组Array

由之前描述可知,markers属性类型为Array,表示标记点用于在地图上显示标记的位置。这个数组属性,它里面有它的对象配置属性,分别是:

id,表示标记点id,类型为Number,必填项,marker点击事件回调会返回此id,建议为每个marker设置上Number类型id,保证更新marker时有更好的性能。

latitude,纬度,类型Number,必填项,浮点数,范围 -90 ~ 90

longitude,经度,类型Number,必填项,浮点数,范围 -180 ~ 180

title,标注点名,类型String,不是必填,点击时显示,callout存在时将被忽略

iconPath,显示的图标,类型String,必填项,项目目录下的图片路径

rotate,旋转角度,类型Number,不是必填,顺时针旋转的角度,范围 0 ~ 360,默认为 0

alpha,标注的透明度,类型Number,不是必填,默认1,无透明,范围 0 ~ 1

width,标注图标宽度,类型Number,不是必填,默认为图片实际宽度

height,标注图标高度,类型Number,不是必填,默认为图片实际高度

callout,自定义标记点上方的气泡窗口,类型Object,不是必填 - 可识别换行符

label,为标记点旁边增加标签,类型Object,不是必填 - 可识别换行符

anchor,经纬度在标注图标的锚点,默认底边中点,不是必填,{x, y},x表示横向(0-1),y表示竖向(0-1)。{x: .5, y: 1} 表示底边中点

marker 上的气泡 callout(Object类型) marker数组 上属性 callout 对象使用属性:

content,文本,String

color,文本颜色,String

fontSize,文字大小,Number

borderRadius,callout边框圆角,Number

bgColor,背景色,String

padding,文本边缘留白,Number

display,'BYCLICK':点击显示'ALWAYS':常显,String

textAlign,文本对齐方式。有效值: left, right, center,String

marker 上的标签 label(Object类型)

content,文本,String

color,文本颜色,String

fontSize,文字大小,Number

x,label的坐标,原点是 marker 对应的经纬度,Number

y,label的坐标,原点是 marker 对应的经纬度,Number

borderWidth,边框宽度,Number

borderColor,边框颜色,String

borderRadius,边框圆角,Number

bgColor,背景色,String

padding,文本边缘留白,Number

textAlign,文本对齐方式。有效值: left, right, center,String

polyline polyline表示指定一系列坐标点,从数组第一项连线至最后一项

points,经纬度数组,类型为Array,必填,如:[{latitude: 0, longitude: 0}]

color,线的颜色,类型为String,不必填,如:#0000AA

width,线的宽度,类型为Number,不必填

dottedLine,是否虚线,类型为Boolean,不必填,默认值false

arrowLine,带箭头的线,类型为Boolean,不必填,默认值为false

arrowIconPath,更换箭头图标,类型为String,不必填,在arrowLine为true时,默认带箭头的线时生效

borderColor,线的边框颜色,类型为String,不必填

borderWidth,线的厚度,类型为Number,不必填

polygon polygon指定一系列坐标点,根据points坐标数据生成闭合多边形

points,经纬度数组,array,必填,如:[{latitude: 0, longitude: 0}]

strokeWidth,描边的宽度,Number,否

strokeColor 描边的颜色,String,否

fillColor,填充颜色,String,否

zIndex,设置多边形 Z 轴数值,Number,否

circles circles在地图上显示圆

latitude,纬度,Number,必填,浮点数,范围 -90 ~ 90

longitude,经度,Number,必填,浮点数,范围-180 ~ 180

color,描边的颜色,String,不必填,如:#0000AA

fillColor,填充颜色,String,不必填,如:#0000AA

radius,半径,Number,必填

strokeWidth,描边的宽度,Number,不必填

controls controls在地图上显示控件,控件不随着地图移动

id,控件id,Number,不必填,在控件点击事件回调会返回此id

position,控件在地图的位置,Object,必填,控件相对地图位置

iconPath,显示的图标,String,必填,项目目录下的图片路径,支持相对路径写法,以'/'开头则表示相对项目根目录;也支持临时路径

clickable,是否可点击,Boolean,不必填,默认不可点击

position

left,距离地图的左边界多远,Number,不必填,默认为0

top,距离地图的上边界多远,Number,不必填,默认为0

width,控件宽度,Number,不必填,默认为图片宽度

height,控件高度,Number,不必填,默认为图片高度

注意在uniapp中地图组件的经纬度必填,如果不填,经纬度则默认值是北京的经纬度。 2.uniapp使用map组件 基本使用方法 使用uniapp开发中的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-标注点名

rotate: 180, // Number - 顺时针旋转的角度,范围 0 ~ 360,默认为 0

alpha: 0.5, // 默认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', // 显示的图标

}, {

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'

}]

说明 :uni-app基于 Vue 2.0 实现,开发者需注意Vue 1.0 ->2.0 的使用差异,详见 从 Vue 1.x 迁移 。

uni-app不仅支持应用生命周期和页面生命周期,还支持 vue 实例的如下生命周期函数:

注意 :不要在选项属性或回调上使用箭头函数,比如 created: () =>console.log(this.a) 或 vm.$watch('a', newValue =>this.myMethod())。因为箭头函数是和父级上下文绑定在一起的,this 不会是如你做预期的 Vue 实例,且 this.a 或 this.myMethod 也会是未定义的。

几乎全支持 Vue官方文档:模板语法 ,下面讲下不支持的情况。

(1)不支持纯HTML

uni-app的非H5端里所有的 BOM/DOM 都不能用,也就是说 v-html 指令不能用,可以使用 rich-text组件 代替。或者使用三方组件wxparse,在hello uni-app中有示例。

(2)不支持部分复杂的 JavaScript 渲染表达式

非H5端无法支持复杂的 JavaScript 表达式。目前可以使用的有 + - * % ?: ! == === ><[] .,剩下的还待完善。

(3)不支持过滤器

编译到 App 和小程序平台时不支持使用过滤器,可以使用计算属性(computed)提前计算出数据(如果是数组类型,就提前计算整个数组),用以代替过滤器。

备注 : 自HBuilderX 1.7.1起,在微信小程序平台支持使用过滤器。

data 必须声明为返回一个初始数据对象的函数;否则页面关闭时,数据不会自动销毁,再次打开该页面时,会显示上次数据。

注意 :在微信小程序端,uni-app 将数据绑定功能委托给Vue,开发者需按Vue 2.0的写法实现数据绑定,不支持微信小程序的数据绑定写法,故如下写法不支持:

需修改为:

支持 Vue官方文档:计算属性 。

实现全局变量的方式需要遵循 Vue 单文件模式的开发规范。详细参考: uni-app全局变量的几种实现方式 。

非H5端不支持在 template 内使用 methods 中的函数。

备注 : 自HBuilderX 1.7.1起,在微信小程序平台支持支持在 template 内使用 methods 中的函数。

为节约性能,我们将 Class 与 Style 的表达式通过 compiler 硬编码到 uni-app 中。

全支持 Vue官方文档:条件渲染 。

全支持vue列表渲染 Vue官方文档:列表渲染 。只是需要注意一点,嵌套列表渲染,必须指定不同的索引!需要填写 :key="xx" 。

注意 :同级多个 v-for 时 key 的值是不允许重复的,key 的绑定是不支持表达式的,需要按照以下方式处理。

几乎全支持 Vue官方文档:事件处理器 。事件映射表如下所示:

注意 :

(1)事件映射表中没有的原生事件也可以使用,例如map组件的regionchange 事件直接在组件上写成 @regionchange,同时这个事件也非常特殊,它的 event type 有 begin 和 end 两个,导致我们无法在handleProxy 中区分到底是什么事件,所以你在监听此类事件的时候同时监听事件名和事件类型既 <map @regionchange="functionName" @end="functionName" @begin="functionName"><map>。

(2)为兼容各端,事件需使用 v-on 或 @ 的方式绑定,请勿使用小程序端的bind 和 catch 进行事件绑定。

(3)事件修饰符

(4)若需要禁止蒙版下的页面滚动,可使用 @touchmove.stop.prevent="moveHandle",moveHandle 可以用来处理 touchmove 的事件,也可以是一个空函数。

(5)按键修饰符:uni-app运行在手机端,没有键盘事件,所以不支持按键修饰符。

支持 Vue官方文档:表单控件绑定 。建议开发过程中直接使用 uni-app:表单组件 。用法示例:

(1)H5 的select 标签用 picker 组件进行代替

(2)表单元素 radio 用 radio-group 组件进行代替

组件是整个 Vue.js 中最复杂的部分,支持 Vue官方文档:组件 。有且只能使用单文件组件(.vue 组件)的形式进行支持。其他的诸如:动态组件,自定义 render ,和 <script type="text/x-template"> 字符串模版等非H5端都不支持。详细的非H5端不支持列表:

(1)暂不支持在组件引用时,在组件上定义 click 等原生事件、v-show(可用 v-if 代替)和 class style 等样式属性(例:<card class="class-name"></card>样式是不会生效的)。

Slot(scoped 暂时还没做支持)

(2)动态组件

(3)异步组件

(4)inline-template

(5)X-Templates

(6)keep-alive

(7)transition

(8)class

(9)style

(10)组件里使用 slot 嵌套的其他组件时不支持 v-for

uni-app提供了丰富的 UI组件 ,比如: picker , map 等,需要注意的是原生组件上的事件绑定,需要以 vue 的事件绑定语法来绑定,如 bindchange="eventName" 事件,需要写成 @change="eventName" 。如:

uni-app 支持配置全局组件,需在 main.js 里进行全局注册,注册后就可在所有页面里使用该组件。 注意 :Vue.component 的第一个参数必须是静态的字符串。示例:

(1)main.js 里进行全局注册

(2)index.vue 里可直接使用组件

在 uni-app 中以下这些作为保留关键字,不可作为组件名。

备注 :除以上列表中的名称外,标准的 HTML 及 SVG 标签名也不能作为组件名。

(1) 如何获取上个页面传递的数据

在 onLoad 里得到,onLoad 的参数是其他页面打开当前页面所传递的数据。

(2) 如何设置全局的数据和全局的方法

uni-app内置了 vuex ,在app里的使用,可参考 hello-uniapp 的 store/index.js 。

(3)如何捕获 app 的 onError

由于 onError 并不是完整意义的生命周期,所以只提供一个捕获错误的方法,在 app 的根组件上添加名为 onError 的回调函数即可。如下:

(4)组件属性设置不生效解决办法

当重复设置某些属性为相同的值时,不会同步到view层。 例如:每次将scroll-view组件的scroll-top属性值设置为0,只有第一次能顺利返回顶部。 这和props的单向数据流特性有关,组件内部scroll-top的实际值改动后,其绑定的属性并不会一同变化。解决办法有两种(以scroll-view组件为例):

备注 :第二种解决方式在某些组件可能造成抖动,推荐第一种解决方式。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11396606.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存