常用的地图点压缩

1、算法应用

道格拉斯-普克抽稀算法,是用来对大量冗余的图形数据点进行压缩以提取必要的数据点。

2、算法步骤

对每一条曲线的首末点虚连一条直线,求所有点与直线的距离,
并找出最大距离值dmax ,
用dmax与限差D相比:
若dmax < D ,这条曲线上的中间点所有舍去;
若dmax ≥D ,保留dmax 相应的坐标点,并以该点为界,把曲线分为两部分,对这两部分反复使用该方法。
控制限差值的大小可以控制抽稀的粒度。

3、算法精度

压缩精度取决于事先给定的阈值的大小,阈值越大,简化越多!

简化版


from math import sqrt, powdef point_to_line_Distance(point_a, point_b, point_c):"""计算点a到点b c所在直线的距离:param point_a::param point_b::param point_c::return:"""# 首先计算b c 所在直线的斜率和截距if point_b[0] == point_c[0]:return 9999999slope = (point_b[1] - point_c[1]) / (point_b[0] - point_c[0])intercept = point_b[1] - slope * point_b[0]# 计算点a到b c所在直线的距离distance = abs(slope * point_a[0] - point_a[1] + intercept) / sqrt(1 + pow(slope, 2))return distancedef douglas_peuker(point_list, threshold):"""道格拉斯-普克抽稀算法:param point_list: like [[122.358638, 30.280378], [122.359314, 30.280649]]:param threshold: 0.003:return:"""def diluting(point_list, threshold, qualify_list, disqualify_list):"""抽稀:param threshold::param disqualify_list::param qualify_list::param point_list:二维点列表:return:"""if len(point_list) < 3:qualify_list.extend(point_list[::-1])else:# 找到与收尾两点连线距离最大的点max_distance_index, max_distance = 0, 0for index, point in enumerate(point_list):if index in [0, len(point_list) - 1]:continuedistance = point_to_line_Distance(point, point_list[0], point_list[-1])if distance > max_distance:max_distance_index = indexmax_distance = distance# 若最大距离小于阈值,则去掉所有中间点。 反之,则将曲线按最大距离点分割if max_distance < threshold:qualify_list.append(point_list[-1])qualify_list.append(point_list[0])else:# 将曲线按最大距离的点分割成两段sequence_a = point_list[:max_distance_index]sequence_b = point_list[max_distance_index:]for sequence in [sequence_a, sequence_b]:if len(sequence) < 3 and sequence == sequence_b:qualify_list.extend(sequence[::-1])else:disqualify_list.append(sequence)return qualify_list, disqualify_listdef get_qualify_list(point_list, threshold):qualify_list = list()disqualify_list = list()qualify_list, disqualify_list = diluting(point_list, threshold, qualify_list, disqualify_list)while len(disqualify_list) > 0:qualify_list, disqualify_list = diluting(disqualify_list.pop(), threshold, qualify_list, disqualify_list)return qualify_list# 当返回值长度小于4时,减小 threshold的值if len(point_list) < 5:return point_listresult = get_qualify_list(point_list, threshold)if len(result) < 4:while len(result) < 4:threshold = threshold * 0.9result = get_qualify_list(point_list, threshold)if len(result) > len(point_list):return point_listreturn result

优化版:


# -*- coding: utf-8 -*-
from math import sqrt, powdef point_to_line_Distance(point_a, point_b, point_c):"""计算点a到点b c所在直线的距离:param point_a::param point_b::param point_c::return:"""# 首先计算b c 所在直线的斜率和截距if point_b[0] == point_c[0]:return 9999999slope = (point_b[1] - point_c[1]) / (point_b[0] - point_c[0])intercept = point_b[1] - slope * point_b[0]# 计算点a到b c所在直线的距离distance = abs(slope * point_a[0] - point_a[1] + intercept) / sqrt(1 + pow(slope, 2))return distancedef douglas_peuker(point_list, threshold, lowerLimit=4, ceiling=None):"""道格拉斯-普克抽稀算法:param point_list: like [[122.358638, 30.280378], [122.359314, 30.280649]]:param threshold: 0.003:param lowerLimit: 输出点个数必须大于lowerLimit, 如果没有, 不做设置 like: 4:param ceiling: 输出点个数必须小于ceiling, 如果没有,不做设置  like: 2500:return:"""def diluting(point_list, threshold, qualify_list, disqualify_list):"""抽稀:param threshold::param disqualify_list::param qualify_list::param point_list:二维点列表:return:"""if len(point_list) < 3:qualify_list.extend(point_list[::-1])else:# 找到与首尾两点连线距离最大的点max_distance_index, max_distance = 0, 0for index, point in enumerate(point_list):if index in [0, len(point_list) - 1]:continuedistance = point_to_line_Distance(point, point_list[0], point_list[-1])if distance > max_distance:max_distance_index = indexmax_distance = distance# 若最大距离小于阈值,则去掉所有中间点。 反之,则将曲线按最大距离点分割if max_distance < threshold:qualify_list.append(point_list[-1])qualify_list.append(point_list[0])else:# 将曲线按最大距离的点分割成两段sequence_a = point_list[:max_distance_index]sequence_b = point_list[max_distance_index:]for sequence in [sequence_a, sequence_b]:if len(sequence) < 3 and sequence == sequence_b:qualify_list.extend(sequence[::-1])else:disqualify_list.append(sequence)return qualify_list, disqualify_listdef get_qualify_list(point_list, threshold):qualify_list = list()disqualify_list = list()qualify_list, disqualify_list = diluting(point_list, threshold, qualify_list, disqualify_list)while len(disqualify_list) > 0:qualify_list, disqualify_list = diluting(disqualify_list.pop(), threshold, qualify_list, disqualify_list)return qualify_list# 当输入点数小于5,直接输出if len(point_list) < 5:return point_listresult = get_qualify_list(point_list, threshold)# 当返回值长度小于lowerLimit时,减小 threshold的值if len(result) < lowerLimit:while len(result) < lowerLimit:threshold = threshold * 0.9result = get_qualify_list(point_list, threshold)# 当返回值长度大于ceiling时,增大 threshold的值if ceiling and len(result) > ceiling:while len(result) > ceiling:threshold = threshold * 1.1result = get_qualify_list(point_list, threshold)if len(result) > len(point_list):return point_listreturn result

【Python】道格拉斯-普克抽稀算法相关推荐

  1. 道格拉斯-普克 抽稀算法

    道格拉斯-普克抽稀算法,是用来对大量冗余的图形数据点进行压缩以提取必要的数据点.该算法实现抽稀的过程是:先将一条曲线首尾点虚连一条直线,求其余各点到该直线的距离,取其最大者与规定的临界值相比较,若小于 ...

  2. 道格拉斯-普克抽稀算法

    道格拉斯-普克抽稀算法,是用来对大量冗余的图形数据点进行压缩以提取必要的数据点.该算法实现抽稀的过程是:先将一条曲线首尾点虚连一条直线,求其余各点到该直线的距离,取其最大者与规定的临界值相比较,若小于 ...

  3. Android Arcgis 优化--------道格拉斯-普克抽稀算法

    最近偶然接触到抽稀相关的算法.发现道格拉斯抽稀算法很适合目前项目某一个功能优化.所以我抽空看了一下,也写了针对经纬度路径点抽稀的工具类.下面我们先看看该算法的介绍. 介绍 道格拉斯-普克算法(Doug ...

  4. 道格拉斯普克(Douglas-Peuker)算法python实现

    目录 前言 一.算法实现 二.输出结果 前言 本程序主要应用于边界线上点的稀释,本文提供随机数和交互式输入两种方式实现数据载入. 一.算法实现 # -*- coding = utf-8 -*- # @ ...

  5. 道格拉斯-普克 Douglas-Peuker(DP算法) python java实现

    1.道格拉斯-普克抽稀算法说明 道格拉斯-普克抽稀算法是用来对大量冗余的图形数据点进行压缩以提取必要的数据点. 该算法实现抽稀的过程是: 1)对曲线的首末点虚连一条直线,求曲线上所有点与直线的距离,并 ...

  6. OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数...

    凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...

  7. 道格拉斯算法 matlab,OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数...

    凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...

  8. 道格拉斯-普克 Douglas-Peuker(DP算法)

    道格拉斯-普克抽稀算法,是用来对大量冗余的图形数据点进行压缩以提取必要的数据点. 该算法实现抽稀的过程是: 1)对曲线的首末点虚连一条直线,求曲线上所有点与直线的距离,并找出最大距离值dmax,用dm ...

  9. c++多边形扫描线填充算法_基于MATLAB的道格拉斯普克算法递归实现

    道格拉斯普克算法 (道格拉斯-普克)Douglas-Peukcer算法由D.Douglas和T.Peueker于1973年提出,是线状要素抽稀的经典算法.用它处理大量冗余的几何数据点,既可以达到数据量 ...

最新文章

  1. 安装SQL Server 2012示例数据库
  2. sharepoint 2013 使用outlook 打开sharepoint 任务失败
  3. jdk8中java.util.concurrent包分析
  4. 【数据结构与算法】之深入解析“最优运动员比拼回合”的求解思路与算法示例
  5. 国家计算机科学进展,主动网络安全的研究与进展
  6. python匿名函数使用
  7. 你们一年大概可以存多少钱?
  8. Android Scroller的使用及自我理解
  9. C语言大数阶乘的求法
  10. c++歌手类代码_安卓资源ID修改-游戏发行-切包过程中的R类和Public.xml
  11. 2016.01.18 Xcode中的正则表达式
  12. 微信小程序生成二维码接口调用
  13. 关闭windows defender安全中心的方法
  14. python sklearn包中的主成分分析_九、Sklearn主成分分析
  15. 最好用的 6 款 Vue 实时消息提示通知(Message/Notification)组件推荐与测评
  16. 安装驱动显卡重启计算机,Win7电脑安装显卡驱动后一直重启的解决方法
  17. 在linux中使用tcpdump命令 – 监听网络流量
  18. (音乐可视化项目)Light-Dancer为音乐而生
  19. RPO和RTO的区别
  20. 2021-05-16Leetcode 55.跳跃游戏

热门文章

  1. Adopting a dog from a humane society
  2. BBI指标讲解及应用
  3. c语言程序dx,求解含有三角函数的定积分c语言程序∫(1+cosπx)dx
  4. Burpsuite 抓取微信小程序数据包
  5. 批量处理图形大小如何更改图片大小尺寸修改图片视频教程ps学习ps教程ps基础新教程#ps教程修图
  6. 使用C++写的中国象棋(单机版)
  7. Java开发需要学习哪些知识?初学者怎么学好Java开发?
  8. IOError: [Errno 2] No such file or directory的解决方法
  9. 【软件工程师学硬件】之 继电器
  10. arm c语言开发环境搭建,利用proteus学习ARM(LPC2103)之二:熟悉IAR C语言开发环境...