场景
Java中使用java.awt.geom.Point2D进行坐标相关的计算(距离、平方等):
Java中使用java.awt.geom.Point2D进行坐标相关的计算(距离、平方等)_point2d.double_霸道流氓气质的博客-CSDN博客
Java中使用JTS对空间几何计算(读取WKT、距离、点在面内、长度、面积、相交等):
Java中使用JTS对空间几何计算(读取WKT、距离、点在面内、长度、面积、相交等)_java 点在面内_霸道流氓气质的博客-CSDN博客
上面讲的进行精度要求底的数据进行空间计算时,可以使用Double进行赋值。
如果坐标数据精度比较高,比如到小数点后8位等,则需要使用BigDecimal进行赋值和计算。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
实现
使用BigDecimal进行指定精度计算距离,比如指定到小数点后5位。
/**
* 使用BigDecimal 指定精确度计算距离
* @param p1x 第一个点的x
* @param p2x 第二个点的x
* @param p1y 第一个点的y
* @param p2y 第二个点的y
* @return
*/
public BigDecimal getDistanceByBigDecimal(double p1x, double p2x, double p1y, double p2y){
BigDecimal p1xB = new BigDecimal(p1x);
BigDecimal p2xB = new BigDecimal(p2x);
BigDecimal p1yB = new BigDecimal(p1y);
BigDecimal p2yB = new BigDecimal(p2y);
BigDecimal bigDecimal = (p1xB.subtract(p2xB)).multiply(p1xB.subtract(p2xB)).add((p1yB.subtract(p2yB)).multiply(p1yB.subtract(p2yB)));
BigDecimal distance = sqrt(bigDecimal,5);
return distance;
}
其中又用到开平方的方法
/**
* BigDecimal 开平方
* @param value 要开平方的值
* @param scale 精确度
* @return
*/
public BigDecimal sqrt(BigDecimal value, int scale){
if(value.compareTo(new BigDecimal(0)) == 0){
return new BigDecimal(0);
}else {
BigDecimal num2 = BigDecimal.valueOf(2);
int precision = 100;
MathContext mc = new MathContext(precision, RoundingMode.HALF_UP);
BigDecimal deviation = value;
int cnt = 0;
while (cnt < precision) {
deviation = (deviation.add(value.divide(deviation, mc))).divide(num2, mc);
cnt++;
}
deviation = deviation.setScale(scale, BigDecimal.ROUND_HALF_UP);
return deviation;
}
}