Java【算法分享 02】道格拉斯-普克 Douglas-Peucker 抽稀算法分析及15w个坐标点抽稀到3

A

x

0

B

y

0

C

A

2

B

2

d= \frac{|Ax_{0}+By_{0}+C|}{ \sqrt{A{2}+B{2}}}

d=A2+B2

​∣Ax0​+By0​+C∣​ 坐标点较多时,每个点都要计算 A、B、C 三个参数并求解 d 将消耗不少时间。【耗时】
2. 得到分割点后,递归调用起止点计算标记删除点方法,可能出现栈溢出。【问题】
3. thresholdVal 值越小保留细节将越多,分割点会呈现指数级增长,耗时会增加,需要找到合理值。【耗时+问题】
4. 返回对象包含字段不统一,抽稀算法无法接收不同类型参数。【问题】

2.优化

1️⃣ 个算法使用的封装类和 1️⃣ 个业务使用封装类用于举例【为了简洁注解未使用DOC规范】:

// 类1 坐标数据封装
@Data
public class PointData {
    // 标记是否删除(0保留 1删除)
    private int isDelete;
    // 数据点的 index 用于优化运算速度(核心优化点)
    private int indexEx;
	// 数据点的经度
    private double longitudeEx;
    // 数据点的纬度
    private double latitudeEx;
}

// 类2 业务查询返回的数据封装【主要是实现了 PointData 类】具体字段不再贴出
@Data
public class Mobile2g extends PointData implements Serializable {
}

线程池不做过多介绍:

public class ThreadAllBaseStation {
    private static int corePoolSize = Runtime.getRuntime().availableProcessors();
    private static ThreadFactory namedFactory = new ThreadFactoryBuilder().setNameFormat("XXX数据查询线程-%d").build();
    /\*\*
 \* corePoolSize用于指定核心线程数量
 \* maximumPoolSize指定最大线程数
 \* keepAliveTime和TimeUnit指定线程空闲后的最大存活时间
 \*/
    public static ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, corePoolSize + 1, 10L, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(1000), namedFactory, new ThreadPoolExecutor.AbortPolicy());
}

优化后的算法核心代码【为了简洁部分注解未使用DOC规范】:

@Slf4j
public class Douglas {
    // 点数据
    private static List<? extends PointData> points = new ArrayList<>();
    // 距离阈值(值越大效果越好但丢失细节就越多)【这个值已经算很小的了】
    private static final double DISTANCE_THRESHOLD = 0.00001;
    // 最大线程数
    private static final i
  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值