前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >webgis中捕捉功能的实现

webgis中捕捉功能的实现

作者头像
lzugis
发布2021-12-06 10:32:28
7490
发布2021-12-06 10:32:28
举报
文章被收录于专栏:跟牛老师一起学WEBGIS

概述

本文以openlayers为例,结合turf.js讲一下webgis中绘制和编辑时如何实现捕捉功能。

效果

为了验证捕捉的结果是否正确,就将绘制的几个面做了一个合并的测试,效果如下:

绘制
绘制
合并
合并

实现思路

  • 输入
    • 要捕捉的图层,此处为vectorSource
    • 捕捉的范围,单位是像素
    • 鼠标移动时的坐标
  • 输出
    • 满足条件的点

捕捉工具的舒适化参数如下:

image.png
image.png

实现的大致流程如下:

image.png
image.png

实现代码

代码语言:javascript
复制
 /**
  * 获取捕捉点
  * @param {Array} coords - 传入坐标
  * @return {Array}
  */
 getSnapPoint (coords) {
   if (!this._active) return []
   let result = []
   let features = this._vectorSource.getFeatures()
   const res = this._map.getView().getResolution()
   const dis = this.getPixelTolerance() * res
   const point = turfPoint.point(toLonLat(coords))
   for (let i = 0; i < features.length; i++) {
     const feature = features[i]
     const json = feature2Geojson(feature)
     const line = polygonToLine(json)
     const dist = pointToLineDistance(point, line)
     if (dist * 1000 < dis) {
       const pointLine = nearestPointOnLine(line, point, { units: 'kilometers' })
       result = pointLine.geometry.coordinates
       break
     }
   }
   this._overlay.setPosition(result.length === 0 ? null : result)
   return result
 }
// 处理map的事件,click,pointermove,dblclick
function clickEvent(e) {
  if(!isDraw) return
  const snapPoint = snap.getSnapPoint(e.coordinate)
  const coordinate = snapPoint.length > 0 ? ol.proj.fromLonLat(snapPoint) : e.coordinate ;
  ......
}
function pointerMoveEvent(e) {
  if(!isDraw) return
  const snapPoint = snap.getSnapPoint(e.coordinate)
  const coordinate = snapPoint.length > 0 ? ol.proj.fromLonLat(snapPoint) : e.coordinate ;
  ......
}
function dblclickEvent(e) {
  if(!isDraw) return
  let coords = coordinates.concat([]);
  const snapPoint = snap.getSnapPoint(e.coordinate)
  const coordinate = snapPoint.length > 0 ? ol.proj.fromLonLat(snapPoint) : e.coordinate ;
  ......
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 效果
  • 实现思路
  • 实现代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档