Douglas一Peukcer算法由D.Douglas和T.Peueker于1973年提出,简称D一P算法,是目前公认的线状要素化简经典算法。现有的线化简算法中,有相当一部分都是在该算法基础上进行改进产生的。它的优点是具有平移和旋转不变性,给定曲线与阂值后,抽样结果一定。

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

GpsPositionDto

public class GpsPositionDto
{ /// <summary>
/// 转换后的纬度
/// </summary>
public decimal GpsWebLng { get; set; }
/// <summary>
/// 转换后的经度
/// </summary>
public decimal GpsWebLat { get; set; } /// <summary>
/// 时间
/// </summary>
public DateTime Gpstime { get; set; }
//其他参数自己加
}

  

/// <summary>
/// 道格拉斯-普特
/// </summary>
public class DouglasPeucker
{
/// <summary>
/// 距离
/// </summary>
/// <param name="point1"></param>
/// <param name="point2"></param>
/// <returns></returns>
public static double CalculationDistance(GpsPositionDto point1, GpsPositionDto point2)
{
var lat1 = (double)point1.GpsWebLat;
var lat2 = (double)point2.GpsWebLat;
var lng1 = (double)point1.GpsWebLng;
var lng2 = (double)point2.GpsWebLng;
var radLat1 = lat1 * Math.PI / 180.0;
var radLat2 = lat2 * Math.PI / 180.0;
var a = radLat1 - radLat2;
var b = (lng1 * Math.PI / 180.0) - (lng2 * Math.PI / 180.0);
var s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2)
+ Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));
return s * 6370996.81;
}
/// <summary>
/// 直线距离
/// </summary>
/// <param name="start"></param>
/// <param name="end"></param>
/// <param name="center"></param>
/// <returns></returns>
public static double DistToSegment(GpsPositionDto start, GpsPositionDto end, GpsPositionDto center)
{
var a = Math.Abs(CalculationDistance(start, end));
var b = Math.Abs(CalculationDistance(start, center));
var c = Math.Abs(CalculationDistance(end, center));
var p = (a + b + c) / 2.0;
var s = Math.Sqrt(Math.Abs(p * (p - a) * (p - b) * (p - c)));
return s * 2.0 / a;
}
/// <summary>
/// 递归方式压缩轨迹
/// </summary>
/// <param name="coordinate"></param>
/// <param name="result"></param>
/// <param name="start"></param>
/// <param name="end"></param>
/// <param name="dMax"></param>
/// <returns></returns>
public static IList<GpsPositionDto> CompressLine(IList<GpsPositionDto> coordinate, IList<GpsPositionDto> result, int start, int end, double dMax)
{
if (start < end)
{
var maxDist = 0D;
var currentIndex = 0;
var startPoint = coordinate[start];
var endPoint = coordinate[end];
for (var i = start + 1; i < end; i++)
{
var currentDist = DistToSegment(startPoint, endPoint, coordinate[i]);
if (currentDist > maxDist)
{
maxDist = currentDist;
currentIndex = i;
}
}
if (maxDist >= dMax)
{
//将当前点加入到过滤数组中
result.Add(coordinate[currentIndex]);
//将原来的线段以当前点为中心拆成两段,分别进行递归处理
CompressLine(coordinate, result, start, currentIndex, dMax);
CompressLine(coordinate, result, currentIndex, end, dMax);
}
}
return result;
} /// <summary>
/// 抽希
/// </summary>
/// <param name="coordinate">原始轨迹Array</param>
/// <param name="dMax">允许最大距离误差</param>
/// <returns>抽稀后的轨迹</returns>
public static IList<GpsPositionDto> Dilution(IList<GpsPositionDto> coordinate, double dMax = 10)
{
if (!(coordinate.Count > 2))
{
return null;
}
var result = CompressLine(coordinate, new List<GpsPositionDto>(), 0, coordinate.Count - 1, dMax);
result.Add(coordinate[0]);
result.Add(coordinate[coordinate.Count - 1]);
//排序
var resultLatLng = result.OrderBy(s => s.Gpstime).ToList();
return resultLatLng;
}
}

  

.net中使用 道格拉斯-普特 抽希轨迹点的更多相关文章

  1. GIS矢量数据化简:一种改进的道格拉斯-普克算法以及C++实现

    GIS领域的同志都知道,传统的道格拉斯-普克算法都是递归实现.然而有时候递归的层次太深的话会出现栈溢出的情况.在此,介绍一种非递归的算法. 要将递归算法改为非递归算法,一般情况下分为两种场景.第一种是 ...

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

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

  3. 道格拉斯-普克算法(JavaScript实现)

    需求: 有时候当移动速度很慢,GPS定位的轨迹点就非常的多,这时候为了缩减数据量,需要将不突出的点去掉. 思路: (1) 在曲线首尾两点间虚连一条直线,求出其余各点到该直线的距离. (2)选其最大者与 ...

  4. WebGIS中使用ZRender实现前端动态播放轨迹特效的方案

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要在地图上以时间轴方式播放人员.车辆在地图上的历史行进 ...

  5. 217。数据中是否有重复元素(哈希表/set简法)

    给定一个整数数组,判断是否存在重复元素. 如果任意一值在数组中出现至少两次,函数返回 true .如果数组中每个元素都不相同,则返回 false . 示例 1: 输入: [1,2,3,1] 输出: t ...

  6. 道格拉斯—普克(Douglas一Peukcer)节点抽稀算法

    Douglas一Peukcer算法由D.Douglas和T.Peueker于1973年提出,简称D一P算法,是眼下公认的线状要素化简经典算法.现有的线化简算法中,有相当一部分都是在该算法基础上进行改进 ...

  7. 利用道格拉斯·普客法(DP法)压缩矢量多边形(C++)

    1.算法描述 经典的Douglas-Peucker算法(简称DP法)描述如下: (1)在曲线首尾两点A,B之间连接一条直线AB,该直线为曲线的弦: (2)得到曲线上离该直线段距离最大的点C,计算其与A ...

  8. 实习小记-python中可哈希对象是个啥?what is hashable object in python?

    废话不多说直接祭上python3.3x的文档:(原文链接) object.__hash__(self) Called by built-in function hash() and for opera ...

  9. Android中使用JNI获得APK签名的哈希值

    原地址:http://blog.csdn.net/i5suoi/article/details/19036975 最近在研究android应用中的安全问题,貌似只有将核心代码写到JNI底层才是最安全的 ...

随机推荐

  1. 20 常用模块 hashlib hmac:加密 xml xlrd xlwt:excel读|写 configparser subprocess

    hashlib模块:加密 加密: 1.有解密的加密方式 2.无解密的加密方式:碰撞检查 hashlib -- 1)不同数据加密后的结果一定不一致 -- 2)相同数据的加密结果一定是一致的 import ...

  2. 关于git 远程仓库密码一直输错的问题

    解决方法, git 换地方使用后需要重新配置秘钥,一个钥匙开一个地方的门: 如果还不行, 在控制面板-用户账户-凭据管理-加添凭证,输入正确的账号密码:因为Windows的凭据管理器里面可能保存了你刚 ...

  3. 解决Linux(Loaded plugins: fastestmirror Please use /usr/bin/yum --help)

    大概意思是fastestmirror不能使用,fastestmirror是yum的一个加速插件 处理办法就是禁用这个插件 方法两种 第一种 vi /etc/yum/pluginconf.d/faste ...

  4. CSS3标准盒模型还是IE怪异模型box-sizing属性的应用设置

    在一个文档中,每个元素都被表示为一个矩形的盒子.盒子模型具有4个属性['外边距(margin)','边框(border)','内边距(padding)','内容(content)']. 我们要设置某个 ...

  5. matplotlib figure图像-【老鱼学matplotlib】

    如果我们想要显示多个图像,有点类似多窗口显示图像这个概念,则就会用到plt.figure() 直接上例子: import numpy as np import pandas as pd import ...

  6. Linux系统下安装JDK

    注意:linux系统下使用mount命令挂载Windows系统下的共享文件,详情见我的另一篇“Linux系统挂载Windows系统下的共享文件” 一.安装jdk 1.进入usr目录cd /usr 2. ...

  7. python输入

    (程序是如何输入输出的) 先了解一个概念,什么是函数? 简单来说,函数就是封装了一些功能,到时候只需要写一个函数名字,就可以使用这些功能 input函数,它是输入函数,它可以将用户输入的内容当做“字符 ...

  8. rabbitmq重启时报错,并导致erlang崩溃和Rabbit的常用命令

    -------------------------------------------------------------------------------------------------- R ...

  9. sbadmin表单事件

    Form表单 自定义表单 <from action="" method="'><!---      这里可以用表单组件快速生成表单元素哦        ...

  10. Beta(5/7)

    鐵鍋燉腯鱻 项目:小鱼记账 团队成员 项目燃尽图 冲刺情况描述 站立式会议照片 各成员情况 团队成员 学号 姓名 git地址 博客地址 031602240 许郁杨 (组长) https://githu ...