Android 判斷某個點是否在指定范圍內(nèi)的方法

前提提示:基于百度地圖做的邏輯


                //處理點的輻射范圍打卡
                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;
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尚骄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子侵续,更是在濱河造成了極大的恐慌倔丈,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件状蜗,死亡現(xiàn)場離奇詭異需五,居然都是意外死亡,警方通過查閱死者的電腦和手機轧坎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門宏邮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事蜜氨⌒瞪福” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵飒炎,是天一觀的道長埋哟。 經(jīng)常有香客問我,道長郎汪,這世上最難降的妖魔是什么赤赊? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮煞赢,結(jié)果婚禮上抛计,老公的妹妹穿的比我還像新娘。我一直安慰自己照筑,他們只是感情好吹截,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著朦肘,像睡著了一般饭弓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上媒抠,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天弟断,我揣著相機與錄音,去河邊找鬼趴生。 笑死阀趴,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的苍匆。 我是一名探鬼主播刘急,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浸踩!你這毒婦竟也來了叔汁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤检碗,失蹤者是張志新(化名)和其女友劉穎据块,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體折剃,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡另假,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了怕犁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片边篮。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡己莺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出戈轿,到底是詐尸還是另有隱情凌受,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布凶杖,位于F島的核電站胁艰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏智蝠。R本人自食惡果不足惜腾么,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杈湾。 院中可真熱鬧解虱,春花似錦、人聲如沸漆撞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浮驳。三九已至悍汛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間至会,已是汗流浹背离咐。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奉件,地道東北人宵蛀。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像县貌,于是被迫代替她去往敵國和親术陶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354