GIS算法基础(十)矢量压缩算法-光栏法

前言:

远程仓库地址:https://github.com/XiaoZhong233/GIS_ALG

光栏法是一种矢量数据的压缩算法。光栏法的基本思路是对每一条曲线上的所有点, 逐点定义一个扇形区域。若曲线的下一节点在扇形外, 则保留当前节点; 若曲线的下一节点在扇形内, 则舍去当前节点。


 

说明:

光栏法与道格拉斯算法都是矢量压缩算法,但是光栏法能很好的保存线的形状,而道格拉斯普克算法是概化算法,他的作用主要是把凹凸不平的折线变得平直,因此算“概化”算法

 

算法步骤:

 

1、输入光栏的口径d

这个口径也就是每次扫描的扇形区域,若曲线的下一节点在扇形外, 则保留当前节点; 若曲线的下一节点在扇形内, 则舍去当前节点。

2、读取坐标

1、2两点坐标,记入p1,p2

3、建立光栏

连接p1和p2点,过 p2点作一条垂直于p1p2 的直线,在该垂线上取 两点a1和a2,使a1p2= a2p2=d/2,此时a1和 a2为“光栏”边界点, p1与a1、p1与a2的连线 为以p1为顶点的扇形的 两条边,这就定义了一 个扇形(这个扇形的口朝 向曲线的前进方向,边 长是任意的)。通过p1并在扇形内的所有直线都具有这种性质, 即p1p2上各点到这些直线的垂距都不大于d/2。

若p3点在扇形内,则舍去p2点。然后连接p1和p3,过p3作 p1p1的垂线,该垂线与前面定义的扇形边交于c1和c2。在垂线 上找到b1和b2点,使p3b1=p3b2=d/2,若b1或b2点落在原扇 形外面,则用c1或c2取代。此时用p1b1和p1c2定义一个新的扇 形,这当然是口径(b1c2)缩小了的“光栏”。

4、检查下一节点

若该点在新扇形内,则重复第(2)步;直 到发现有一个节点在最新定义的扇形外为止。

当发现在扇形外的节点,如p4,此时保留p3点,以p3作为 新起点,重复1°~3°。如此继续下去,直到整个点列检测完 为止。所有被保留的节点(含首、末点),顺序地构成了简化后 的新点列。

 

实现代码:

  1     /**
  2      * 光栏法压缩折线
  3      * @param caliber 口径
  4      * @return
  5      */
  6     public Polyline simplify_LightBar(double caliber) {
  7         if(caliber<=0)
  8             return null;
  9         if(this.points.size()<2) {
 10             return this;
 11         }
 12         //求光栏下边界
 13         List<Point> points = this.getPoints();
 14         Point p1 = points.get(0);
 15       
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值