地图组件联动开发
地图组件联动开发
开发目标简介:
- 1、点击按钮切换到场景2。
- 2、在该场景的div中创建两个地图组件,分别用于展示原始地图和综合后地图数据。
- 3、使两个地图组件互相影响,缩放或拖动其中一个子组件中的地图,另外一个也跟着变化
创建地图组件
开发目标:
- 实现瓦片地图加载啊
- 地图缩放控件
- 地图图层切换控件
使用leaflet.chinatmsproviders新建多种图层
基本语法:L.tileLayer.chinaProvider('Geoq.Normal.PurplishBlue',{})
该方法的第一个参数定义了图层类型
首先使用该方法返回并接受图层
接着定义baseLayer对象,其中保存了图层名及其值也就是上述函数返回的图层
然后这是地图初始化需要的值mapValue,是一个对象,其中包括坐标系、中心点经纬度、缩放等级、图层类型、是否添加缩放空间等属性。
定义初始化函数,在挂载时调用。添加控件
1 | // map是在初始化函数外定义的响应式数据 |
完整的代码,此时还未实现动图组件互动
1 | <template> |
在父组件中导入组件
1 | <template> |
互动效果实现
使用自定义事件emit,当地图发生缩放或者拖拽时,在附件中监听到该自定义事件。在父组件通知另外一个地图组件进行中心点和缩放等级的变化。
因此步骤如下
- 在左中两个地图组件中,监听地图实例的缩放和拖拽事件
- 监听到拖拽事件触发自定义事件 map-moved
- 在父组件中分别获取到两个地图组件的实例,使用ref
- 在父组件中的
和 监听到map-move的后,分别调用handelMapmove2和handelMapmove1 - 在父组件中定义handelMapmove2和handelMapmove1函数,前者用于调整中间地图组件的中心和缩放等级,后者用于调整左边地图组件。
- 分别在两个地图组件中定义setMapView函数,并暴露出来,这样父组件中才能使用$refs调用该方法
1 | //地图组件中代码 |
1 | //父组件中代码 |
踩到的坑们
setup
1、在子组件的setup中定义的方法,在父组件中通过子组件实例(在父组件中的子组件标签中使用ref=’ziname’)ziname.的方法无法调用,必须在setup中暴露出该方法才行;暴露的方法也踩了坑,由于使用ts,一直提示不能使用return暴露函数。应该使用defineExpose({ setMapView })
2、地图总是加载左上角,因为组件的大小不是固定的px值,所以会发生变化,因此,需要在初始化完成后强制地图进行大小和位置计算。且在组件卸载后要清空地图的配置值。
3、将地图配置对象mapValue设置成响应式对象,对导致第一个被初始化的地图能加载出地图,而另外一个不能。因此放弃了响应式配置值实现互动的方法。
4、vue3中不能使用this,自定义方法,组件实例调用方法,均和vue2有差异
1 | const emit = defineEmits(['map-moved']) |
总结
以为自己掌握了知识,实践中却有很多问题。学好底层逻辑有助于快速发现问题和解决问题