范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

微信小程序添加外部地图服务数据

  先上效果:
  缘起
  使用微信小程序做地图相关功能的时候,有个需求是需要接入自己发布的地图服务。查看微信小程序地图组件文档,发现它对地图相关的支持很少,只有一些基础功能,比如添加点、线、面、气泡和一些常规的地图事件监听,并没有添加地图服务相关的支持。
  不过有了需求,也要想办法解决呀。 图层查询
  既然小程序不能直接添加地图服务,那就把图层数据查出来,然后通过添加点线面方式添加到地图,具体要怎么实现呢?
  首先想到的是通过图层查询接口把所有数据查出来。
  但是既然数据是按图层发布的,一般数据量都比较大,把所有数据查询出来,一次性添加过多的数据到地图,地图组件会受不了从而变的卡顿,另外微信小程序单次 setData() 的数据不能超过1024kB ,因此这种方案就不可取了。矢量瓦片
  既然一次性请求数据量太大,是不是可以分批次请求呢?于是就想到了矢量瓦片。矢量瓦片对于做 GIS 的人来说,大家都很熟悉了,这也是目前各种GIS 产品对大数据量地图展示所采用的主要方式。但是,我们如何让不支持添加外部图层的小程序地图组件支持矢量瓦片呢?
  查看地图组件相关文档,会看到其中有个 regionchange 事件,该事件是在地图视野改变,也就是拖动、缩放地图时触发,它会返回当前中心点、缩放级别、地图范围等信息。
  获取瓦片
  接下来就是如何根据这些参数获取到矢量瓦片了。
  假设,地图切图的原点是 (originX,originY) ,地图的瓦片大小是tileSize ,地图屏幕上1像素代表的实际距离是resolution 。计算坐标点(x,y) 所在的瓦片的行列号的公式是:col = floor((x0 - x)/( tileSize*resolution)) row = floor((y0 - y)/( tileSize*resolution))
  这个公式应该不难理解,简单点说就是,先算出一个瓦片所包含的实际长度 LtileSize ,然后再算出此时屏幕上的地理坐标点离瓦片切图的起始点间的实际距离LrealSize ,然后用实际距离除以一个瓦片的实际长度,即可得此时的瓦片行列号:LrealSize/LtileSize 。
  具体代码如下: getTileXY: function (lon, lat, level) {   let originX = -180; //坐标系原点的x的值,   let originY = 90; //坐标系原点的y的值   //根据你自己对应的切片方案改,这个就是其分辨率resolution   let resolution = [1.40625, 0.703125, 0.3515625, 0.17578125, 0.087890625, 0.0439453125, 0.02197265625,     0.010986328125, 0.0054931640625, 0.00274658203125, 0.001373291015625, 0.0006866455078125, 0.0003433227539062,     0.0001716613769531, 0.0000858306884766, 0.0000429153442383, 0.0000214576721191, 0.0000107288360596,     0.0000053644180298, 0.0000026822090149, 0.0000013411045074, 0.0000006705522537, 0.0000003352761269   ]    let tileSize = 256//这个值表示的是每张切片的大小,一般都是256   let coef = resolution[level] * tileSize;   let x = Math.floor((lon - originX) / coef); // 向下取整,丢弃小数部分   let y = Math.floor((originY - lat) / coef); // 向下取整,丢弃小数部分   let tmsY = Math.pow(2, (level - 1)) - y - 1;   return {     x: x,     y: y,     z: level - 1,     tmsY: tmsY   } }, 这里可以看到我返回的数据中有一个y值,还有一个 tmsY ,这是因为WMTS 、TMS 两种方式调用切片时,传入的y值是不同的,不过两者之间是有可以转换的,也就是tmsY = Math.pow(2, (level - 1)) - y - 1 ,WMTS 用的是这里返回的y,TMS 用的是这里返回 的tmsY 。
  参考链接:
  https://www.cnblogs.com/zhaoyanhaoBlog/p/9026035.html
  https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames
  https://blog.csdn.net/yanqing0924/article/details/6066713
  接下来我们只需根据当前地图可视范围的最大、最小坐标以及地图层级,即可获取包含当前地图可视范围的瓦片的编号。
  由于微信小程序地图组件使用的是国测局加密坐标,而我发布的地图服务数据为 wgs84 坐标,因此这里在获取切片编号时需要用坐标转换方法将国测局坐标转成wgs84 坐标,坐标纠偏方法可参考leaflet中如何优雅的解决百度、高德地图的偏移问题。getXYZList: function (region, level) {   // 坐标转换   var newsouthwest = appcoord.gcj02_To_gps84(region.southwest.longitude, region.southwest.latitude);    var northeastwest = appcoord.gcj02_To_gps84(region.northeast.longitude, region.northeast.latitude);   // 获取瓦片编号   var xyzInfo1 = this.getTileXY(newsouthwest.lng, northeastwest.lat, level)   var xyzInfo2 = this.getTileXY(northeastwest.lng, newsouthwest.lat, level)   var z = level - 1   for (var x = xyzInfo1.x; x <= xyzInfo2.x; x++) {     for (var y = xyzInfo1.y; y <= xyzInfo2.y; y++) {       this.getGeoJson(x, y, z)     }   } },
  然后通过 wx.request 传入请求地址以及x、y、z参数,即可获取到对应矢量切片的geojson 格式数据getGeoJson: function (x, y, z) {   const v = this   wx.request({     url: "http://127.0.0.1:7000/geoserver/gwc/service/wmts/rest/test:test/EPSG:4326/EPSG:4326:" +       z + "/" + y + "/" + x + "?format=application/json;type=geojson",     method: "get",     success(res) {       var tileId = "tile-" + x + "-" + y + "-" + z       tileData[tileId] = {         tileId: tileId,         features: []       }       if(res.statusCode === 200){         tileData[tileId].features = res.data.features       }       v.addFeatures(tileId)     }   }) },
  注意,这里我是用 geoserver 发布的矢量瓦片,在调用过程中发现个问题,其中一个点图层瓦片返回的数据中,各个瓦片总有很多重复数据,经检查测试发现,这是由于发布该图层(点图层)时使用的样式为一张大小为40x88 的图片点样,这就导致切图时整体向外缓冲了不少的像素值,所以,如果 geoserver 发布的图层是用于矢量切片调用,最好将点图层样式设置为一个像素大小的像素点,这样可以有效减少瓦片数据冗余添加数据
  最后再通过微信小程序地图组件中添加点线面的方法把获取切片数据添加到地图即可 addFeatures: function (tileId) {   var polylines = this.data.polylines   var markers = this.data.markers   tileData[tileId].features.forEach(feature => {     if (feature.geometry.type === "LineString") {       polylines.push(this.getPolyline(feature.geometry.coordinates, tileId))     } elseif (feature.geometry.type === "Point") {       markers.push(this.getMarker(feature.geometry.coordinates, tileId))     }   });   this.setData({     polylines: polylines,     markers: markers   }) }, 存在问题
  至此,微信小程序添加矢量瓦片数据已经完成,基本能满足浏览外部矢量图层的需求,但是,这里还是有一些不足的地方 需要发布 geojson 格式矢量瓦片图层地图拖动时图层会闪一下,这是小程序重新往地图上绘制点线面图层引起的 在小比例尺瓦片返回数据量较大时可能会有卡顿现象(可以通过限定最小比例尺优化) 图层配图效果受小程序地图点线面样式限制
  虽然该解决方案存在一些问题,但是鉴于微信小程序地图组件的限制,并且确实又有添加图层的需求,此方案还是可取的。 总结微信小程序地图组件不支持添加外部图层服务 通过发布 geojson 格式矢量瓦片服务,然后按当前可视范围获取geojson 格式瓦片数据通过小程序地图组件的 regionchange 事件监听地图拖动、缩放,可以获取到当前中心点、缩放级别、地图范围根据缩放级别、地图范围可以获取到当前可视范围的瓦片编号 请求瓦片数据,通过微信小程序地图组件中添加点线面的方法把切片数据添加到地图 代码地址
  代码地址:http://gisarmory.xyz/blog/index.html?source=WechatVectorTile
  原文地址: http://gisarmory.xyz/blog/index.html?blog=WechatVectorTile
  欢迎关注《GIS兵器库》

数据中心变绿能源消耗瘦身数据中心是新型基础设施节能降耗的关键环节,也是促进全社会降碳增效的有力抓手。近年来,我国数据中心规模不断壮大,推进数据中心绿色化转型升级势在必行。通过优化供电架构提高绿电使用比例绿在网贷平台贷款,因银行卡号输错导致资金被银监会冻结了,这种情况该如何处理?前几天我朋友也遇到过同样的问题,当时着急用钱,就在APP上申请了5万,认证需要提交银行卡号,当时的银行卡号是从手机银行的APP上复制过去的,一会儿提示借款成功,然后有客户经理就打电中国手机厂商百亿资金助力印度制造,为何还是被频频刁难?日前,印度扣押了小米公司48亿元资产,这让网民感到惊讶。印度手机市场前五,有四家是中国厂商。这让人担心,它们把从中国赚的钱投入印度,助力印度制造,仍频频被刁难,会不会竹篮打水一场空三星S22Ultra真香!上手体验后,不黑不吹地说说优缺点深深的被三星S22Ultra的外观吸引了,论设计,三星绝对yyds。虽然看上去像是方方正正的,但是边框部分设计了弧度,并不会硌手,反而这种弧面握上去非常的贴合舒适。屏幕素质拉满,什毁约校招生,套路消费者,新势力销冠小鹏正在持续失信凤凰网风暴眼出品文凤凰网财经张沃若5月初理想汽车毁约2022届应届生的热度还没下去,小鹏就立马接棒了鸽掉校招生的毁约新势力。去年还一年增员1。8万人频传薪酬翻倍的蔚小理,已经有两家腾讯起诉手机厂商不正当竞争,南山必胜客这下难了5月18日,腾讯方面发布了2022年的第一季度财报,交出了营收与利润双双不及市场预期的一份成绩,但这份财报并不是腾讯在当天登上热搜榜的原因。就在同一天,腾讯起诉vivo不正当竞争一时评特斯拉招聘为何火?多给一分真诚,少一分套路钱江晚报小时新闻评论员项向荣最近,一则来自特斯拉的招聘新闻火上微博热搜榜。特斯拉此次招聘的是普工,岗位要求高中或者中专以上学历就行,工资待遇在7500元12000元左右。消息一经发全球已发现80例,未来或许会发现更多截止当地时间20日,世卫组织召开技术咨询小组会议,讨论有关猴痘的信息和应对策略。目前全球约有80例猴痘确诊病例,还有50例待确认的病例。随着监测范围的扩大,未来可能会发现更多病例。中国股市元宇宙概念来袭,6家企业位居首位!(附名单)元宇宙的未来发展趋势元宇宙概念是近些年来互联网关注度最高的行业。简单来说元宇宙就是利用互联网科技手段进行链接与创造一个虚拟世界和现实世界映射交互的数字生活空间。元宇宙本身不是一个技想要入华为这样的公司工作,难度有多大?2018java华为面试题送上搞到一份题,分享一下,如果你和我一样看不懂,就立下flag,一起学习Java,第一题题目描述输入任意个字符串,将其中的小写字母变为大写,大写字母变为小写,其他字符不用处理输入描述任免费好用的全平台编辑器,手把手教你做一个Markdown这门简洁的标记语言,让我们写文章有了更方便的途径。macOS上面好用又好看的Markdown编辑器百花齐放,但在Windows上,好用的Markdown编辑器真是少
性能最强的3款旗舰手机,如今降至冰点价,入手的好时机终于到了有一个现状不知道大家注意到没有,很多2年前的旗舰手机,如今使用起来依然非常流畅,不仅可以应付日常使用,玩游戏也没有比这两年新发布的旗舰手机差多少,其实这就说明了一个问题,智能手机已白话大数据一什么是大数据?1专家学者眼里的大数据第一种说法需具备5V特征Volume(大量)Velocity(高速)Variety(多样)Value(低价值密度)Veracity(真实性)。FF91首辆准量产车亮相!FF全球CEO毕福康有望在2025年实现盈利2月24日,法拉第未来(FaradayFuture)在汉福德工厂召开发布会,宣布首台FF91准量产车在汉福德工厂装配完成,将于2022年第三季度开始量产。中国和美国市场售价预计分别11ampampgt2嘛?双芯加持的OPPO新旗舰FindX5Pro能否引发影像质变?优缺点都说才过瘾,这里是N大说,这篇文章的文风比之前更为犀利,有差距悬殊的对比有高出预期的惊喜也有带着遗憾的期待,看客们要做好心理准备哟(文末有彩蛋)去年年末看到MariSilic什么是东数西算?东数为什么要西算?近日,国家发展改革委中央网信办工业和信息化部国家能源局联合印发通知,同意在8地启动建设国家算力枢纽节点,并规划了10个国家数据中心集群。至此,全国一体化大数据中心体系完成总体布局设成都多地实行10人一组核酸检测,科学原理为何?10人混检有利有弊,目前许多地方敢用10人混检,就是看重那个利,且有自信认为弊可以被100克服!利的方面,那就是成本降低,可以用正常一人一检的十分之一费用就把检测做了。同时,效率还OPPO平板真机图首次出现磁力键盘盖配件同步曝光OPPO正准备在两天内公布其FindX5系列旗舰手机,并且很有可能同场发布平板电脑,我们已经在官方预告中看到其设计。现在,微博上发布了几张真机图片,我们可以提前看看这个设备了。发布小米11Pro再降价,堆料满满全面Pro,不愧是安卓机皇已经使用小米11Pro有一个多月的时间了,当初选择小米11Pro的原因也很简单,想要购买一款高性价比的高端旗舰,而小米11Pro这个介于小米11和小米11Ultra之间的存在就很合热点个人收款码有调整?微信支付宝最新回应来源支付宝微信派新华社中国支付清算协会网站转自中国普法特别提示凡本号注明来源或转自的作品均转载自媒体,版权归原作者及原出处所有。所分享内容为作者个人观点,仅供读者学习参考,不代表本支付宝突然采取行动,作为对3月1日新规定的回应,广大用户的福利现在,三月即将来临,个人收款码业务正在成为历史的一章。对于一些小商贩来说,无疑会带来一个很大的影响。然而,最近,支付宝对3月1日出台的二维码收集新规定做出了重大反应,为商家带来了不个人收款码将停用?多方回应备受关注的条码支付新规细则正式出炉,3月1日之后,个人收款码用户可以自主选择继续使用还是申请升级为个人经营收款码。中国支付清算协会现行个人收款码不关闭不停用功能不变2月22日,中国