地理空间-Java实现航迹稀释

Java实现航迹点稀释算法(Douglas - Peucker算法)的示例代码,该算法可在保证航迹整体形状变化不大的情况下减少航迹点数量:


import java.util.ArrayList;

import java.util.List;

class Point {

double x;

double y;

public Point(double x, double y) {

this.x = x;

this.y = y;

}

}

public class TrackThinning {

public static List<Point> douglasPeucker(List<Point> points, double epsilon) {

if (points.size() < 3) {

return points;

}

int index = -1;

double dmax = 0;

int end = points.size();

for (int i = 1; i < end - 1; i++) {

double d = perpendicularDistance(points.get(i), points.get(0), points.get(end - 1));

if (d > dmax) {

index = i;

dmax = d;

}

}

List<Point> result = new ArrayList<>();

if (dmax > epsilon) {

List<Point> recursiveResult1 = douglasPeucker(points.subList(0, index + 1), epsilon);

List<Point> recursiveResult2 = douglasPeucker(points.subList(index, points.size()), epsilon);

result.addAll(recursiveResult1.subList(0, recursiveResult1.size() - 1));

result.addAll(recursiveResult2);

} else {

result.add(points.get(0));

result.add(points.get(points.size() - 1));

}

return result;

}

private static double perpendicularDistance(Point point, Point start, Point end) {

double dx = end.x - start.x;

double dy = end.y - start.y;

double numerator = Math.abs((dy * point.x - dx * point.y) + (end.x * start.y - end.y * start.x));

double denominator = Math.sqrt(dy * dy + dx * dx);

return numerator / denominator;

}

public static void main(String[] args) {

List<Point> points = new ArrayList<>();

points.add(new Point(0, 0));

points.add(new Point(1, 1));

points.add(new Point(2, 2));

points.add(new Point(3, 2));

points.add(new Point(4, 3));

points.add(new Point(5, 4));

double epsilon = 0.5;

List<Point> thinnedPoints = douglasPeucker(points, epsilon);

for (Point p : thinnedPoints) {

System.out.println("(" + p.x + ", " + p.y + ")");

}

}

}

相关推荐
编程彩机4 小时前
互联网大厂Java面试:从分布式架构到大数据场景解析
java·大数据·微服务·spark·kafka·分布式事务·分布式架构
小酒窝.4 小时前
【多线程】多线程打印1~100
java·多线程
君爱学习4 小时前
基于SpringBoot的选课调查系统
java
APIshop4 小时前
Java 实战:调用 item_search_tmall 按关键词搜索天猫商品
java·开发语言·数据库
血小板要健康4 小时前
Java基础常见面试题复习合集1
java·开发语言·经验分享·笔记·面试·学习方法
淼淼7635 小时前
安装jdk1.8
java·开发语言
毕设源码-朱学姐5 小时前
【开题答辩全过程】以 高校食堂餐饮管理系统的设计与实现为例,包含答辩的问题和答案
java
过期动态5 小时前
Java开发中的@EnableWebMvc注解和WebMvcConfigurer接口
java·开发语言·spring boot·spring·tomcat·maven·idea
摇滚侠5 小时前
IDEA 定义返回值快捷键
java·ide·intellij-idea
毕设源码-郭学长5 小时前
【开题答辩全过程】以 高校考勤管理系统为例,包含答辩的问题和答案
java·eclipse