百度地图渲染wkt格式网格数据

文章介绍了如何在内网部署的百度地图上渲染WKT格式的网格数据,包括Multipolygon和Polygon两种类型,提到了使用js解析和terraformer-wkt-parser库的方法。此外,还强调了地图坐标系的重要性,特别是bd09和wgs84之间的转换。
摘要由CSDN通过智能技术生成

百度地图渲染wkt格式的网格数据

1.渲染百度地图

先引入百度地图的源文件,我们公司要求使用内网部署的百度地图,所以没有下载百度地图的相关依赖,不过api都和官网一致,直接参照官网的方法使用即可。

相关配置的引入:

<script src="http://内网地址/baidumap/bmapgl/api/booter.js"></script>
<script src="http://内网地址/dugis-baidu/gateway/jsapi/api.js"></script>
<script src="http://内网地址/dugis-baidu/gateway/index/config.js"></script>

渲染的时候直接在提前定义好的容器中进行渲染就可以

<div id="allmap" style="overflow: hidden; zoom: 1; position: relative">
   <div
     id="map"
     style="height: 100%; -webkit-transition: all 0.5s ease-in-out; transition: all 0.5s ease-in-out"
   ></div>
 </div>
_bdmap = new BMap.Map('map')  //初始化并本地存储地图实例
var city = that.EPARCH_CN  	  //获取当前地市
if (city != '') {
  _bdmap.centerAndZoom(city, 11)  //以地市为中心,对地图初始的中心及缩放进行设置
} else {
  var poi = new BMap.Point(116.307852, 40.057031)
  _bdmap.centerAndZoom(poi, 16)
}
_bdmap.enableScrollWheelZoom(true)  //设置地图可以滚轮缩放

2.处理网格数据

本次需求所需要渲染的是wkt格式的网格数据,主要涉及到两种格式的数据一种是MULTIPOLYGON类型,一种是POLYGON类型,关于wkt数据解释可以参照这篇文章:空间数据WKT与WKB格式介绍

通过接口获取网格的相关数据:

MULTIPOLYGON(((113.297190672205 40.1458806791381,113.311479996012 40.1459097428838,113.316227228923 40.1546210317700,113.321506280472 40.1756981983826,113.307286457393 40.1834647931305,113.289412636889 40.1887173055036,113.26990116888 40.1932128909093,113.2302311683 40.1341417786344,113.24568979115 40.1171106450653,113.277535961627 40.1164616094776,113.283997819806 40.1149283043700,113.28416620992 40.1126402117416,113.291718810027 40.1111827682567,113.308299697194 40.1305859575177,113.309862599563 40.1340745240044,113.311430112319 40.1373033141446,113.297631682839 40.1386841774183,113.297190672205 40.1458806791381)))

关于这种数据的处理方式,我现在用的一般是两种方式
1.通过js方法进行解析

		var testPolygon = []
        for (var i = 0; i < polygons.length; i++) { //这边polygons是通过接口获取的多个区域的数组, 遍历后对每个区域的数据进行解析
          var polygon1 = polygons[i].coordinate
          var polygon1Pts = ''
          var polygon1PtsArr = []
          if (polygon1.indexOf('MULTIPOLYGON') != -1) {
            polygon1Pts = polygon1.split('(((')[1].split(')))')[0]
            polygon1PtsArr = polygon1Pts.split(')),((')
            polygon1PtsArr.forEach((item, index) => {
              polygon1PtsArr[index] = item.split(',')
              polygon1PtsArr[index].forEach((itm, idx) => {
                polygon1PtsArr[index][idx] = itm.split(' ')
              })
              let itemP = {
                ...polygons[i],
                point: polygon1PtsArr[index],
              }
              testPolygon.push(itemP)
            })
          }else {
            polygon1Pts = polygon1.split('((')[1].split('))')[0]
            polygon1PtsArr = polygon1Pts.split('),(')
            polygon1PtsArr.forEach((item, index) => {
              polygon1PtsArr[index] = item.split(',')
              polygon1PtsArr[index].forEach((itm, idx) => {
                polygon1PtsArr[index][idx] = itm.split(' ')
              })
              let itemP = {
                ...polygons[i],
                point: polygon1PtsArr[index],
              }
              testPolygon.push(itemP)
            })
          }
        }

2.vue等框架使用terraformer-wkt-parser依赖进行解析(推荐)

npm i -S terraformer-wkt-parser
import WKT from 'terraformer-wkt-parser'
var geojson = WKT.parse(wktData);

3.区域渲染

获取到的wkt数据经过上面的方法处理后就会变成一目了然的由经纬度的点组成的数组或是terraformer-wkt-parser所解析出来的GeoJson数据。
数据结构经过调整后,使用拿到的数据进行渲染就可以了

//overlays为经过处理后的区域数据,需要先遍历所有的区域,
//再遍历其中所有的点,使用new BMap.Point生成一个百度地图的点
//然后用new BMap.Polygon将所有生成的点整合成一个多边形区域
//最后使用前面定义的百度地图实例_bdmap完成渲染
overlays.forEach((item, index) => {
  let points = []
  item.point.forEach((itm) => {
    points.push(new BMap.Point(itm[0], itm[1]))
  })
  var polygon = new BMap.Polygon(points, styleOptions) //创建多边形
  _bdmap.addOverlay(polygon)
})

其他渲染方式:

使用高度支持百度地图的mapvgl中的平面图层PolygonLayer来渲染数据,具体渲染方式参照官网即可。这种方式的方便之处在与可以直接使用terraformer-wkt-parser解析出来的数据进行渲染,不需要对数据进行进一步的处理。
在这里插入图片描述

但是经过这种方式渲染出来的图层并不能进行像百度地图一样的编辑区域,所以有修改需求的小伙伴们推荐使用上面的渲染方式。

4.注意地图坐标系

我这次做需求主要遇到了两种不同的坐标系,我使用的这个百度地图是bd09坐标系的,也有wgs84坐标系的百度地图,拿到数据后要和后端核对是哪个坐标系的数据,可以在这个工具上根据实际情况看看渲染出来的坐标是否准确:地图坐标系转换
如果需要进行两种坐标的转换,参照这个wgs84转gcj02转百度地图bd09

分享结束,有写的不好或者错误的地方请大家多多指正,感谢耐心阅读!

引用文章:
https://www.jianshu.com/p/6b9c4b596dba
https://baijiahao.baidu.com/s?id=1713780383353656668&wfr=spider&for=pc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值