leaflet离线地图开发,在web端能正常显示,在移动端无法显示。

557 阅读1分钟

使用uniapp 开发离线地图在浏览器能正常显示,运行到手机端是空白的。

方法1 使用 renderjs

renderjs使用方法及视图层和逻辑层的通信方法:

<view id="map" :layer="layer" @click="leaflet.emitData" :change:layer="leaflet.receiveName">
//视图层
<script module="leaflet" lang="renderjs">
    import L from "leaflet";
    import 'leaflet/dist/leaflet.css'
    export default {
        data() {
            return {
                src:'',
                NavAudio:'',
            };
	},
        mounted() {
            let map = L.map("map", {		
		center: [24.06554, 113.43704], // 地图中心
		zoom: 3, //默认缩放比例
		minZoom: 1,
		maxZoom: 18,
		animate: true,
		zoomControl: true, //禁用 + - 按钮
		doubleClickZoom: false, // 禁用双击放大
		bounceAtZoomLimits: false
            });
            let name = L.tileLayer(
		"./static/Tile/{z}/{x}/{y}.png", {}
            ).addTo(map);
            //点击renderjs层后发送数据到逻辑层
            emitData(e, ownerVm) {
                //多个数据用数组发送
		ownerVm.callMethod('receiveRenderData', [this.src, this.NavAudio])
            },
            //逻辑层layer数据变化 返回
            receiveName(newValue, oldValue, ownerVm, vm) {
                console.log(newValue)
            }
        }
        
   }
</script>
//逻辑层
<script>
//这里写js逻辑代码
    export default {
        data() {
            return {
                layer: '',//layer变化则会自动传递layer到视图层
            };
	},
        mounted() {
           // 接收renderjs发回的数据
            receiveRenderData(val) {
		console.log('receiveRenderName', val);	
            },                   
        }
   }
</script>

将视图层和逻辑层分开,因为在renderjs中无法使用uni方法,只能写在逻辑层,如果业务中有使用到了uni的方法,且视图层和这个方法存在交互的不建议使用renderjs。因为视图层和逻辑层的信息交流比较难搞,如果要频繁进行交互就会很卡。

image.png image.png

比如我的项目使用到了uni.createInnerAudioContext() 播放mp3,点击地图上的点就会播放一段内容,光这一个还不会卡,但到后面又加了一个uni方法的时候,逻辑层的视图层的通信就更多了,就变得非常卡。

方法2 使用 webview

相当于在手机端内嵌了一个浏览器内核,即将功能都在web端调试好,再使用webview标签引入。

在web端写好后,选择发行->网站->发行

image.png

打包好后打开目录,复制文件到hybrid下的html中

image.png

则可以删除之前写的web端代码,直接用webview标签引入

<template><web-view src='/hybrid/html/index.html'></web-view></template>