项目中用到,记录下来。
import java.util.ArrayList;
import java.util.List;
import com.vividsolutions.jts.geom.*;
/**
* 道格拉斯普克抽希
*/
public class Douglas {
private static GeometryFactory factory = new GeometryFactory();
/**
* 对矢量曲线进行压缩
*/
public static LineString compress(LineString line, double precision) {
if(line.getNumPoints() < 3)
return line;
List<Coordinate> points = compress(line, 0, line.getNumPoints()-1, precision);
Coordinate[] coordinates = new Coordinate[points.size()];
points.toArray(coordinates);
return factory.createLineString(coordinates);
}
/**
*
* */
public static List<Coordinate> compress(Coordinate[] coordinates,int fromIndex,int toIndex,double precision){
List<Coordinate> sparse_pts = new ArrayList<>();
Coordinate from = coordinates[fromIndex];
Coordinate to = coordinates[toIndex];
if ((fromIndex + 1) == toIndex) {
sparse_pts.add(from);
sparse_pts.add(to);
return sparse_pts;
}
/**
* 由起始点和终止点构成的直线方程一般式的系数
*/
double A = (from.y - to.y)
/ Math.sqrt(Math.pow((from.y - to.y), 2)
+ Math.pow((from.x - to.x), 2));
/**
* 由起始点和终止点构成的直线方程一般式的系数
*/
double B = (to.x - from.x)
/ Math.sqrt(Math.pow((from.y - to.y), 2)
+ Math.pow((from.x - to.x), 2));
/**
* 由起始点和终止点构成的直线方程一般式的系数
*/
double C = (from.x * to.y - to.x * from.y)
/ Math.sqrt(Math.pow((from.y - to.y), 2)
+ Math.pow((from.x - to.x), 2));
int middleIndex = 0;
double dmax = 0;
for (int i = fromIndex + 1; i < toIndex; i++) {
double dis = Math.abs(A * (coordinates[i].x) + B * (coordinates[i].y) + C)
/ Math.sqrt(Math.pow(A, 2)
+ Math.pow(B, 2));
if(dis < dmax)
continue;
dmax = dis;
middleIndex = i;
}
sparse_pts.add(from);
if (dmax > precision) {
List<Coordinate> fronts = compress(coordinates, fromIndex, middleIndex, precision);
fronts.remove(0);
fronts.remove(fronts.size()-1);
sparse_pts.addAll(fronts);
List<Coordinate> backs = compress(coordinates, middleIndex, toIndex, precision);
backs.remove(backs.size()-1);
sparse_pts.addAll(backs);
}
sparse_pts.add(to);
return sparse_pts;
}
private static List<Coordinate> compress(LineString line, int fromIndex, int toIndex, double precision){
List<Coordinate> sparse_pts = new ArrayList<>();
Coordinate from = line.getCoordinateN(fromIndex);
Coordinate to = line.getCoordinateN(toIndex);
if ((fromIndex + 1) == toIndex) {
sparse_pts.add(from);
sparse_pts.add(to);
return sparse_pts;
}
/**
* 由起始点和终止点构成的直线方程一般式的系数
*/
double A = (from.y - to.y)
/ Math.sqrt(Math.pow((from.y - to.y), 2)
+ Math.pow((from.x - to.x), 2));
/**
* 由起始点和终止点构成的直线方程一般式的系数
*/
double B = (to.x - from.x)
/ Math.sqrt(Math.pow((from.y - to.y), 2)
+ Math.pow((from.x - to.x), 2));
/**
* 由起始点和终止点构成的直线方程一般式的系数
*/
double C = (from.x * to.y - to.x * from.y)
/ Math.sqrt(Math.pow((from.y - to.y), 2)
+ Math.pow((from.x - to.x), 2));
int middleIndex = 0;
double dmax = 0;
for (int i = fromIndex + 1; i < toIndex; i++) {
double dis = Math.abs(A * (line.getCoordinateN(i).x) + B * (line.getCoordinateN(i).y) + C)
/ Math.sqrt(Math.pow(A, 2)
+ Math.pow(B, 2));
if(dis < dmax)
continue;
dmax = dis;
middleIndex = i;
}
sparse_pts.add(from);
if (dmax > precision) {
List<Coordinate> fronts = compress(line, fromIndex, middleIndex, precision);
fronts.remove(0);
fronts.remove(fronts.size()-1);
sparse_pts.addAll(fronts);
List<Coordinate> backs = compress(line, middleIndex, toIndex, precision);
backs.remove(backs.size()-1);
sparse_pts.addAll(backs);
}
sparse_pts.add(to);
return sparse_pts;
}
}
关注微信号 codingworld 码农大世界 获取更多信息和作者互动问答。
分享到:
相关推荐
道格拉斯-普克抽稀算法,java 实现
代码对于船舶AIS数据进行道格拉斯-普克(DP)算法压缩,并能生成算法压缩后的数据量以及可视化呈现压缩结果。
道格拉斯-普克压缩算法,压缩参数数据源都放在了“第三讲”文件夹中
道格拉斯-普克压缩算法,附全国数据,可调节压缩率。
道格拉斯-普克抽稀算法python实现。用于空间数据抽稀。
道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法、迭代适应点算法、分裂与合并算法)是将曲线近似表示为一系列点,并减少点的数量的一种算法。它的优点是具有平移和旋转不变性,给定...
课程作业,道格拉斯普克算法,写了很久了,不过肯定可以用。
道格拉斯普克算法,是GIS的小实习,希望对大家有帮助
用道格拉斯普克算法对线进行化简,处理结果比较好
根据道格拉斯压缩算法的原理,使用c#语言编写窗体程序,实现坐标点的线性化
打开txt文件,读取其中的坐标数据,并利用DP算法进行简化。其中,txt文件是由shp文件转化而来,有不同的线对象,每个线对象有各自的很多坐标点,简化时是根据每个线对象进行简化,输出的数据与原数据格式相同,可...
论述了经典的道格拉斯—普克压缩算法,分析将其应用于多边形边界数据压缩所 造成的图形失真现象,提出了一种增强型道格拉斯—普克压缩算法,并用实际的MapInfo 矢量数据来检核该 算法的可靠性。
该算法从边界上的点列表中选择几个点,并计算超出容差值的点。 它还提供了点的索引 语法 [list_pts,pnts]= douglas_peucker(point_list,tolerance); 该函数使用了从 matleb central 下载的一些其他函数(例如 push ...
道格拉斯普克抽稀算法,道格拉斯普克法算法,Python源码
道格拉斯普克(Douglas-Peuker)算法抽取几何外形,语言是matlab之间使用即可
dpsimplify 使用递归道格拉斯-普克线简化算法根据指定的容差减少折线中的顶点数。 该算法也称为迭代端点拟合算法。 dpsimplify 可以处理二维和更高维度的折线和多边形。 提交的文件现在包含另一个 m 文件 ...
道格拉斯算法C#~求垂距; 寻找最大值点; } if(如果最大距离仍小于阈值) { 舍弃其中的所有点;返回;
道格拉斯-普克(Douglas-Peuker)算法 垂距限值法 最后 正文 何为抽稀 在处理矢量化数据时,记录中往往会有很多重复数据,对进一步数据处理带来诸多不便。多余的数据一方面浪费了较多的存储空间,另一方面造成所要...
道格拉斯-普克,折线压缩算法的c# 可视化 实现方式,可以很直观地看到压缩效果。案例地址 https://blog.csdn.net/shijie_nihao/article/details/98905329