openlayer实现上万个点的分屏实时组装

一、设计思路

初始加载上万条点位数据-----获取当前屏幕的四至-------组装屏幕内可视的点位

二、图层配置代码

point1: {
  layerCode: 'point1',
  isRLayerPanel: true,
  sourceType: 'Vector',
  title: '图标点',
  url: '/static/geojson/station1.json',
  dataPath: 'data/stationList/list',
  dataLongitudeField: 'longitude',
  dataLatitudeField: 'latitude',
  dataIdField: 'stationId',
  geoType: 'point',
  labelField: 'aqi',
  groupLayers:[],
  outRes:[],
  isGroupLayer: true,
  isProcess:false,
  maxZoom: Infinity,
  minZoom: 7,
  wrapX: false,
  opacity: 1,
  location: {longitude: 116.11704458402367, latitude: 34.25804927841997, level: 9.808516864898834},
  visible: true
}

三、关键代码实现

export function refreshCv(res, map, layersInfo, layerCode){
  if (layersInfo[layerCode].geoType === 'point') {
    let count = 0
    let cMExent = map.getView().calculateExtent(map.getSize())
    for(let i=0;i<res.length;i++){
      if(res[i].longitude<cMExent[0]||res[i].longitude>cMExent[2]||res[i].latitude<cMExent[1]||res[i].latitude>cMExent[3]){
        continue
      }
      let lc=layerCode + generateUUID()
      if(count >= layersInfo[layerCode].groupLayers.length) {
        let ly=new VectorLayer({
          source: new VectorSource({
            wrapX: layersInfo[layerCode].wrapX
          }),
          opacity: layersInfo[layerCode].opacity || 1,
          maxZoom: layersInfo[layerCode].maxZoom || Infinity,
          minZoom: layersInfo[layerCode].minZoom || -Infinity,
          title: layersInfo[layerCode].title,
          code: lc,
          group:layerCode,
          visible: layersInfo[layerCode].visible || false
        })
        map.addLayer(ly)
        if (layersInfo[layerCode].isModify) {
          layersInfo[layerCode]["modifyInteraction"] = new Modify({source: getLayerByCode(map,layerCode).getSource()});
          map.addInteraction(layersInfo[layerCode]["modifyInteraction"])
        }
        layersInfo[layerCode].groupLayers.push(getLayerByCode(map,lc))
      }
      lc=layersInfo[layerCode].groupLayers[count].values_.code
      let lrs={}
      lrs[lc]=LayersRenderSet[layerCode]
      let lys={}
      lys[lc]=layersInfo[layerCode]
      layersInfo[layerCode].groupLayers[count].getSource().clear()
      commonCreatePoint(map, lys, lc, lrs, [res[i]], layersInfo[layerCode].dataLongitudeField, layersInfo[layerCode].dataLatitudeField,layersInfo[layerCode].dataIdField)
      count++
    }
  }//技术合作交流qq:2401315930
  console.log('drawrend',new Date().toString())
  layersInfo[layerCode].isProcess = false
  layersInfo[layerCode].outRes = res
}

四、地图鼠标移动新区域绑定刷代码

icolMap.on('moveend', function (evt) {
  //缩放等级控制解析器

let laysers = Object.keys(layersInfo); for (let i = 0; i < laysers.length; i++) { let cZoom = icolMap.getView().getZoom() if (layersInfo[laysers[i]].sourceType === "Overlay" && layersInfo[laysers[i]].visible == true ) { if(layersInfo[laysers[i]].minZoom < cZoom && cZoom <= layersInfo[laysers[i]].maxZoom){ _this.setLayerVisibleOverly(laysers[i],true) }else { _this.setLayerVisibleOverly(laysers[i],false) } } if(layersInfo[laysers[i]].isGroupLayer||false == true) { if(layersInfo[laysers[i]].minZoom < cZoom && cZoom <= layersInfo[laysers[i]].maxZoom && layersInfo[laysers[i]].outRes.length>0) { refreshCv(layersInfo.point1.outRes,icolMap,layersInfo,laysers[i]) } } } // var pixel = icolMap.getPixelFromCoordinate([115.783878,34.308761]) })

五、实现效果

六、拖动效果 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenLayers 是一个开源的 JavaScript 库,用于在 Web 地图上展示地理数据。它提供了丰富的功能和工具,可以轻松地在浏览器中创建交互式地图应用。 要实现展示信息,首先需要创建一个地图实例,并添加一个图层。然后,通过给图层添加要显示的矢量要素,来表示的位置。接下来,可以为地图添加一个交互功能,例如击事件监听器,以便在用户击地图上的时触发一些操作。 具体实现步骤如下: 1. 创建一个地图实例,并设置地图容器的 DOM 元素,指定地图的初始中心和缩放级别。 ```javascript var map = new ol.Map({ target: 'map-container', view: new ol.View({ center: ol.proj.fromLonLat([lon, lat]), // 初始中心的经纬度坐标 zoom: 10 // 初始缩放级别 }) }); ``` 2. 创建一个矢量图层,并将其添加到地图中。 ```javascript var vectorLayer = new ol.layer.Vector({ source: new ol.source.Vector() }); map.addLayer(vectorLayer); ``` 3. 创建一个击事件监听器,当用户击地图上的时触发。在该事件监听器中,首先需要判断击的是否是一个有效的矢量要素,如果是,则获取该要素的属性信息,并展示在页面上。 ```javascript map.on('singleclick', function(event) { map.forEachFeatureAtPixel(event.pixel, function(feature, layer) { var properties = feature.getProperties(); // 获取要素的属性信息 // 在这里展示属性信息,可以通过弹窗、Toast 等方式展示 }); }); ``` 通过以上步骤,我们可以实现展示信息的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴诚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值