【量算分析工具-概述】GeoServer改造Springboot番外系列三-CSDN博客
【量算分析工具-水平距离】GeoServer改造Springboot番外系列四-CSDN博客
【量算分析工具-水平面积】GeoServer改造Springboot番外系列五-CSDN博客
【量算分析工具-方位角】GeoServer改造Springboot番外系列六-CSDN博客
【量算分析工具-坡度】GeoServer改造Springboot番外系列七-CSDN博客
【量算分析工具-获取高程】GeoServer改造Springboot番外系列八-CSDN博客
【量算分析工具-贴地距离】GeoServer改造Springboot番外系列九-CSDN博客
【量算分析工具-贴地面积】GeoServer改造Springboot番外系列十-CSDN博客
贴地距离
1、思路
将两点之间线段抽象成为若干个具有高程的经纬度点,计算每两个点之间的距离,然后累加所有距离之和,即为贴地距离。
如图,AB连线经过C、D、E、F、G五个点,他们的高程用H表示,他们两点之间的距离用L表示,那么算出A到B之间的贴地距离的公式:
Distance = AC+CD+DE+EF+FG+GB
= + +
+ + +
2、步骤
1、根据两点坐标获取瓦片范围;
2、合并瓦片成为一个新的大瓦片;
3、读取大瓦片的高程数据;
4、两点经纬度转换成像素坐标;
5、根据Bresenham直线算法,获取两点像素之间所有像素点坐标;
6、最后根据上面示意图的公式计算出地表距离。
3、代码
package com.gs.springboot.gmserver.util;
import org.locationtech.jts.geom.Coordinate;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
/**
* 距离计算工具类
*/
public class DistanceUtil {
/**
* 椭球平均半径,单位m,椭球半径是6,378,137m
*/
private static final double EARTH_RADIUS = 6371008.77138;
/**
* 获取高程数据的地表距离
*
* @param zoom 层级
* @param coordinateList 连线的经纬度集合
* @param rootPathList 高程terrain-rgb数据文件夹集合
* @return double
*/
public static double getSurfaceDistance(int zoom, List<double[]> coordinateList, List<String> rootPathList, String type) {
if (coordinateList.size() < 2) {
throw new IllegalArgumentException("The line list must contain exactly two coordinates