灰壳显灵 發表於 2024-8-15 15:56:00

uni-app使用天地图

<h2 id="原因">原因:</h2>
<p>由于主流地图(百度,高德,腾讯)商用收费属实昂贵,不得已很多人开始转战天地图。<br>
&nbsp;&nbsp;</p>
<h2 id="方案">方案:</h2>
<p>天地图想要在uniapp项目中正常使用目前的方案有两种</p>
<p><strong>1.通过web-view将html天地图嵌入项目中</strong><br>
&nbsp;&nbsp;<br>
优点:可以同时兼容微信小程序和APP</p>
<p>缺点:地图嵌入后数据交互繁琐,小程序兼容了,但是兼的不是很容(由于微信小程序web-view原生组件必须占满全屏,无法修改大小)<br>
&nbsp;&nbsp;</p>
<p><strong>2.通过renderjs直接操作dom来实现</strong><br>
&nbsp;&nbsp;<br>
优点:与页面数据交互更方便,无需考虑web-view在各个设备上带来的一些兼容问题</p>
<p>缺点:无法在微信小程序使用(小程序:我都没有dom,你想操作什么)</p>
<h3 id="本篇文章我会采用第一种方案后续可能会更新第二种">本篇文章我会采用第一种方案<span style="color: rgba(255, 0, 0, 1); font-size: 14px">(后续可能会更新第二种)</span></h3>
<p><em>本人十分不建议在微信小程序使用天地图,因为小程序本身的地图组件已经足够支撑一些简单的需求了。天地图嵌入小程序中,无论是使用还是开发都是非常灾难的体验。</em><br>
&nbsp;&nbsp;</p>
<h2 id="开始">开始</h2>
<h3 id="准备工作">准备工作:</h3>
<p><span style="color: rgba(255, 0, 0, 1); font-size: 12px">此步骤是为了app使用本地html页面,无需部署线上H5,微信小程序(必须使用线上H5)和使用线上H5的可以跳过此步骤</span></p>
<p>在项目中创建hybrid目录,在目录下创建对应的文件,此处的js是用来与父页面进行通讯使用的</p>
<p>js文件地址:<br>
https://gitcode.com/dcloud/hello-uni-app-x/blob/alpha/hybrid/html/uni.webview.1.5.5.js</p>
<p><img src="https://img2024.cnblogs.com/blog/1917308/202408/1917308-20240815150548612-1584235437.png" alt="image" loading="lazy"><br>
&nbsp;&nbsp;</p>
<h2 id="代码">代码</h2>
<p><strong>map.html</strong></p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html style=""&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"/&gt;
&lt;meta name="viewport"
       content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0"&gt;
&lt;title&gt;&lt;/title&gt;
&lt;!-- 引入uniapp --&gt;
&lt;script src="./js/hybrid_html_uni.webview.1.5.5.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;!-- 引入天地图 --&gt;
&lt;script src="http://api.tianditu.gov.cn/api?v=4.0&amp;tk=秘钥" type="text/javascript"&gt;&lt;/script&gt;
&lt;script&gt;
   let map; //地图实例
   let zoom = 16; //缩放等级

   //等待dom加载
   function onLoad() {
   let lnglat = {};
   map = new T.Map('mapDiv');//实例化地图
   map.centerAndZoom(new T.LngLat(114.09974, 22.549), zoom);//默认数值
   let geolocation = new T.Geolocation()


   getCurrentPositionCallback = function (e) {
       //根据经纬度重新设置地图
       if (this.getStatus() == 0) {
         map.centerAndZoom(e.lnglat, 16)
         lnglat = e.lnglat
         var marker = new T.Marker(e.lnglat);
         map.addOverLay(marker);
       }
       if (this.getStatus() == 1) {
         map.centerAndZoom(e.lnglat, e.level)
         lnglat = e.lnglat
         var marker = new T.Marker(e.lnglat);
         map.addOverLay(marker);
       }
   }

   //获取当前用户经纬度
   geolocation.getCurrentPosition(getCurrentPositionCallback);

   // 等待uniapp加载完成后发送信息
   document.addEventListener('UniAppJSBridgeReady', function () {
       uni.postMessage({
         data: {
         title: '天地图',
         msg: '我滴任务完成啦'
         },
       })
   })
   }
&lt;/script&gt;

&lt;style&gt;
   body, html {
   padding: 0;
   margin: 0;
   width: 100%;
   height: 100%;
   transform: translateX(-1.5px);
   }
&lt;/style&gt;
&lt;/head&gt;
&lt;body style="width:100%; height:100%" onLoad="onLoad()"&gt;
&lt;div id="mapDiv" style="width:100%; height:100%"&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>&nbsp;&nbsp;<br>
<strong>page.vue</strong></p>
<pre><code>&lt;template&gt;
&lt;view class="map"&gt;
    &lt;web-view src="/hybrid/html/map.html"
            @onPostMessage="handlePostMessage"
            @message="handlePostMessage"
            :webview-styles="webviewStyles"&gt;
    &lt;/web-view&gt;
&lt;/view&gt;
&lt;/template&gt;

&lt;script&gt;
export default {
data() {
    return {
      webviewStyles: { // web-view样式
      width: "95%",
      height: 200,
      top: 150,
      left: '2.5%'
      },
    }
},
methods: {
    //获取天地图参数
    handlePostMessage(data) {
      console.log(data.detail.data, '天地图发来的数据')
    },

}
}
&lt;/script&gt;

&lt;style scoped lang="scss"&gt;
.map {
overflow: hidden;
position: relative;
height: 200px;
}
&lt;/style&gt;

</code></pre>
<p><strong>OK,你已经成功在uniapp项目中渲染出了天地图</strong><br>
&nbsp;&nbsp;</p>
<h2 id="文档">文档</h2>
<p><strong>uniapp web-view</strong><br>
https://uniapp.dcloud.net.cn/component/web-view.html#web-view</p>
<p><strong>天地图api</strong><br>
http://lbs.tianditu.gov.cn/api/js4.0/guide.html<br>
&nbsp;&nbsp;</p>
<h2 id="问题和注意事项">问题和注意事项</h2>
<p><strong>由于天地图是属于国家项目,他的很多数据会与当前主流地图不同,如果你真的决定要用天地图就得先考虑好这些问题</strong></p>
<p>列如:行政区划码长度(天地图带了国家),省市区等级(曾今是县,升级成了市),一些地名的变动(杭州的一些区)<br>
&nbsp;&nbsp;<br>
<strong>天地图接口更新是没有文档说明的</strong></p>
<p>天地图在接口更新或者废止的时候都是没有文档和通知的,有问题以后建议是直接通过电话和邮箱去联系天地图的工作人员,如果你的项目需要非常稳定,不可以出事故,那我建议还是老老实实交钱去用主流地图吧<br>
&nbsp;&nbsp;<br>
<strong>天地图的经纬度编码</strong></p>
<p>天地图使用的是CGCS2000,2000国家大地坐标系,与主流地图都不一样,不过该坐标系与地球坐标系(WGS-84)基本没有偏差,所以用的时候可以当做WGS-84来用。</p><br><br>
来源:https://www.cnblogs.com/yilei-zero/p/18360851
頁: [1]
查看完整版本: uni-app使用天地图