前提提示:基于百度地圖做的邏輯
//處理點的輻射范圍打卡
if (userAddress != null) {
BigDecimal bdLatitude = BigDecimal.valueOf(latitude);
BigDecimal bdLongitude = BigDecimal.valueOf(longitude);
for (UserAddress address : userAddress) {
InRange inRange = new InRange();
inRange.setLat(bdLatitude);
inRange.setLng(bdLongitude);
inRange.setLat1(new BigDecimal(address.getLatitude()));
inRange.setLng1(new BigDecimal(address.getLongitude()));
inRange.setRaduis(Integer.parseInt(address.getDistance()));
boolean inRange1 = NettyUtils.isInRange(inRange);
if (inRange1) {
//放行 在區(qū)域內(nèi)
setStatus(1);
return;
}
}
}
其中:BigDecimal是我第一次見画机,chat了一下獲得到的知識如下:
BigDecimal 是 Java 中的一個類拉鹃,用于精確表示和計算任意精度的浮點數(shù)税肪。它可以用于處理需要高精度計算的情況,例如金融計算或者需要避免浮點數(shù)精度丟失的情況沼撕。
與普通的浮點數(shù)類型(如 double 或 float)不同侧啼,BigDecimal 使用任意精度的算術運算,可以精確表示十進制小數(shù)泪蔫,并且不會丟失精度棒旗。
在 Java 中,BigDecimal 類提供了各種方法和操作符來執(zhí)行基本的算術運算撩荣、比較和舍入操作铣揉。它還允許設置精度和舍入模式,以滿足特定的計算需求餐曹。
總之逛拱,BigDecimal 類是 Java 中用于精確表示和計算任意精度的數(shù)值的一個重要工具類。
InRange里的詳情如下:
import java.math.BigDecimal;
public class InRange {
public InRange() {
}
public InRange(int raduis, BigDecimal lat, BigDecimal lng, BigDecimal lat1, BigDecimal lng1) {
this.raduis = raduis;
this.lat = lat;
this.lng = lng;
this.lat1 = lat1;
this.lng1 = lng1;
}
private int raduis;
//點 緯度
private BigDecimal lat;
//點 經(jīng)度
private BigDecimal lng;
//圓 緯度
private BigDecimal lat1;
//圓 經(jīng)度
private BigDecimal lng1;
public int getRaduis() {
return raduis;
}
public void setRaduis(int raduis) {
this.raduis = raduis;
}
public BigDecimal getLat() {
return lat;
}
public void setLat(BigDecimal lat) {
this.lat = lat;
}
public BigDecimal getLng() {
return lng;
}
public void setLng(BigDecimal lng) {
this.lng = lng;
}
public BigDecimal getLat1() {
return lat1;
}
public void setLat1(BigDecimal lat1) {
this.lat1 = lat1;
}
public BigDecimal getLng1() {
return lng1;
}
public void setLng1(BigDecimal lng1) {
this.lng1 = lng1;
}
}
下面這段代碼看起來是一個用于判斷某個點是否在指定范圍內(nèi)的方法台猴。它使用了經(jīng)緯度坐標計算兩點之間的距離朽合,并與給定的半徑進行比較來判斷是否在范圍內(nèi)。
在這段代碼中饱狂,首先定義了地球半徑 R 為 6378137.0 米曹步。然后根據(jù)傳入的參數(shù)計算了兩點之間的經(jīng)緯度差值,并使用球面三角形的公式計算了兩點之間的距離 d休讳。最后將距離四舍五入為整數(shù)讲婚,然后與給定的半徑進行比較,如果距離小于等于半徑則返回 true俊柔,否則返回 false筹麸。
需要注意的是,這段代碼使用了數(shù)學公式和常量來進行地理位置計算雏婶,而且代碼中的角度轉(zhuǎn)弧度的計算也是正確的竹捉。這段代碼可以用于判斷一個經(jīng)緯度坐標是否在另一個經(jīng)緯度坐標指定的范圍內(nèi)。
public class NettyUtils {
public static boolean isInRange(InRange inRange) {
double R = 6378137.0;
double dLat = (inRange.getLat1().doubleValue() - inRange.getLat().doubleValue()) * Math.PI / 180;
double dLng = (inRange.getLng1().doubleValue() - inRange.getLng().doubleValue()) * Math.PI / 180;
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(inRange.getLat().doubleValue() * Math.PI / 180) * Math.cos(inRange.getLat1().doubleValue() * Math.PI / 180) * Math.sin(dLng / 2) * Math.sin(dLng / 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
double d = R * c;
double dis = Math.round(d);
if (dis <= inRange.getRaduis()) { //點在圓內(nèi)
return true;
} else {
return false;
}
}
}