vue+openlayer加载geojson通过地图的singleclick事件实现要素的选中高亮以及再次点击取消选中

思考:
选中: 通过singleclick事件可以获取坐标点,openlayer中Feature有个getGeometry().getClosestPoint§方法,就是feature根据这个p坐标可以获取到里这个点最近的坐标点,然后咱们通过这个点和点击的点的距离进行比较,并且咱们也可以进一步的进行限定(判定点击的坐标在feature的边界内),这样做还是有问题,就是你还有可能选中不相关的点或者线,咱们可以做一个工具,也是使用openlayer加载geojson,然后通过选中你想要进行标定的要素,将这些块的类型导出到csv文件里面,这样当你上传压缩包发布服务的时候就可以将这个放进去,在后台将这个文件解析,放到视图的字段里面,这样当你加载视图时就可以通过这个字段进行过滤,想要了解的话具体看这个

**取消选中:**继续根据这个点击坐标找到feature,判断这个feature的样式是不是已经是选中的样式,如果是设置回初始的样式

根据所有的feature和点击的坐标找到选中的feature:

//单击根据坐标找出最近的一个feature
selectedFeature: function(e,allFeatures){
   
    var p = e.coordinate
    var p1 = new Point(transform(p, 'EPSG:3857', 'EPSG:4326')).getCoordinates();
    //遍历所有feature找到距离点击坐标最近的feature
    for(let j=0;j<allFeatures.length-1;j++){
   
          var b1 = new Point(transform(allFeatures[j].getGeometry().getClosestPoint(p), 'EPSG:3857', 'EPSG:4326')).getCoordinates();
          var b2 = new Point(transform(allFeatures[j+1].getGeometry().getClosestPoint(p), 'EPSG:3857', 'EPSG:4326')).getCoordinates();
          var x1 = this.getDistance(p1[0],p1[1],b1[0],b1[1]);
          var x2 = this.getDistance(p1[0],p1[1],b2[0],b2[1]);
          let fea = allFeatures[j+1]
          if(x1<x2){
   
              allFeatures[j+1] = allFeatures[j]
              allFeatures[j] = fea
          }
      }

      return allFeatures[allFeatures.length-1]
},
//计算两点之间距离
getDistance: (lat1, lng1, lat2, lng2)=>{
   

	lat1 = lat1 || 0;
	
	lng1 = lng1 || 0;
	
	lat2 = lat2 || 0;
	
	lng2 = lng2 || 0;
	
	var rad1 = lat1 * Math.PI / 180.0;
	
	var rad2 = lat2 * Math.PI / 180.0;
	
	var a = rad1 - rad2;
	
	var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
	
	var r = 6378137;
	
	return r * 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(rad1) * Math.cos(rad2) * Math.pow(Math.sin(b / 2), 2)))

},

调用上面的方法实现选中和取消选中:

this.clickEvent = this.map.on('singleclick',mapClick);
            async function mapClick(e){
   
                let p = e.coordinate
                let a = util.selectedFeature(e,that.all
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值