天地图移动端部署(一):创建一个基础地图服务(uni-app环境)

前言:

在一家测绘公司上班,接手了一个移动端APP项目,用uni-app开发的,地图服务用天地图底层支持,嗯,测绘用天地图十分合理。

“这地图看起来糊糊的,你给换成XX地图吧。” 老大某天跟我说。

圣谕下达,开始拉代码,读代码。

嗯,依旧是一坨的“清朝”项目代码,一堆的log,一堆的警告,一堆的 if ,就是段子里的代码了。

一段时间后,硬着头皮给替换成XX地图了,以为可以安稳一阵子了,结果就是这么离谱,刚写完,XX地图宣布对企业不在免费提供地图服务,某天突然地图的API接口服务全部无效,公司不愿意购买XX地图服务,老大沟通无果后决定API部分采用天地图的服务,嗯,于是就将接口层的API全部替换为了天地图。(懂得人都懂吧,两者的坐标系差异,转换有被恶心到)

安稳了半个月,又是某天,突然,测试跟我说,地图图层加载不出来了...

我先是差异,然后就是意料之中,终于还是来了,XX地图给图层渲染服务也关闭了

最后没办法,兜兜转转,又回到了天地图,谁叫它免费呢。

原来的老组件功能冗余,代码阅读性极差,所以决定舍弃,基于天地图重构一个地图服务。

好了,起因经过就是如此,开始整活。

哦,等等,整活前有几个说明需要读一下的。

本系列会包含哪些内容?

1、天地图在移动端APP与H5的渲染及其常见的场景应用;

2、天地图API服务的使用;

3、天地图文档的阅读说明;

本系列适用于什么平台,哪些场景?

1、仅适用于移动端APP、移动端H5,Web等,不支持小程序端;

2、适用于地图渲染、标注渲染、区块渲染、地图选点等场景;

 

一、资源申请

天地图官网:http://lbs.tianditu.gov.cn/home.html

进入控制台申请资源信息(注意不要频繁爬取天地图数据,会被锁)

连带之后 公司服务访问会被拦截无法申请资源哦

二、创建一个基础的地图服务

注意:创建涉及到renderJS内容

贴代码,胜过千言万语:

<template>
	<view class="map_container">
		<!-- #ifdef APP-PLUS || H5 -->
		<!-- :change:props="update" 绑定change props会被执行一次 -->
		<view id="MapContainer" :props="randerProps" :change:props="update" 
			style="width: 100%;height: 100%;"></view>
		<!-- #endif -->
	</view>
</template>

<script>
	
</script>

<script module="randerJSMap" lang="renderjs">
	export default {
		props: [ 'randerProps' ],
		data(){
			return{
				mapRef: null
			}
		},
		methods: {
			// props触发更新回调
			update() {
				
			},
			// 初始化地图
			initAmap() {
				try{
					const T = window.T
					this.mapRef = new T.Map('MapContainer');
					let lng = 112.955088;
					let lat = 28.197111;
					// 设置中心点
					this.mapRef.centerAndZoom(new T.LngLat(lng, lat), 14);
					// 设置图层 卫星图:TMAP_HYBRID_MAP 矢量图:TMAP_HYBRID_MAP
					this.mapRef.setMapType(TMAP_NORMAL_MAP)
                    // 创建地图事件
                    this.mapRef.addEventListener("moveend", (e) => {})
                }catch(e){
					console.log('e', e);
				}
			},
		},
		mounted() {
            // 检测是否存在地图实例 避免重复创建
			if ( typeof window.T == 'function' ) {
				this.initAmap();
			} else {
				const script = document.createElement('script');
				script.src = `https://api.tianditu.gov.cn/api?v=4.0&tk=${你的资源Key}`;
				script.onload = this.initAmap.bind(this);
				document.head.appendChild(script);
			}
		}
	}
</script>

<style scoped lang="scss">
	.map_container{
		position: relative;
		width: 100vw;
		height: 100vh;
	}
</style>

渲染效果:

 

结语:

在Vue环境中,可以直接在index.html 直接创建<script> 完成初始化,移动端是用randerJS创建<script> 初始化,本质上同源。

因为randerJS限制,仅在H5环境以及APP环境生效,小程序端不支持。

另外的一种渲染模式可以使用<iframe> 引入本地的地图dist包(隔壁GIS组就是这么干的),理论上可以解决小程序端不支持的问题,未具体验证,读者可以自行尝试。

posted on 2024-09-27 10:52  泔茶先呐  阅读(464)  评论(0编辑  收藏  举报

导航