Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java经纬度操作

java经纬度操作

作者头像
低调小熊猫
发布于 2020-06-06 15:46:00
发布于 2020-06-06 15:46:00
1.8K00
代码可运行
举报
文章被收录于专栏:低调小熊猫低调小熊猫
运行总次数:0
代码可运行

通过第三方sdk定位目标经纬度,然后计算两个位置的距离等,合并经纬度为一个单一数字等(方便存数据库)和一些转换操作,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/** 地图工具类 */
public class WorldMapUtil {
    /** 经纬度转换常量 */
    private static final double EARTH_RADIUS = 6378137.0;
    /** 保留经纬度小数点后的位数 */
    private static int point_length = Context.point_length;

    /**
     * 计算AB两点距离(米)
     * @param lat_a    A点纬度
     * @param lng_a    A点经度
     * @param lat_b    B点纬度
     * @param lng_b    B点经度
     * @return    AB两点距离多少米
     */
    public static Double getDistance(double lat_a, double lng_a, double lat_b, double lng_b) {
        double radLat1 = (lat_a * Math.PI / 180.0);
        double radLat2 = (lat_b * Math.PI / 180.0);
        double a = radLat1 - radLat2;
        double b = (lng_a - lng_b) * Math.PI / 180.0;
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
                + Math.cos(radLat1) * Math.cos(radLat2)
                * Math.pow(Math.sin(b / 2), 2)));
        s = s * EARTH_RADIUS;
        s = Math.round(s * 10000) / 10000;
        return s;
    }

    /**
     * 计算角方位
     * @param lat_a    A点纬度
     * @param lng_a    A点经度
     * @param lat_b    B点纬度
     * @param lng_b    B点经度
     * @return    返回角度
     */
    public static double gps2d(double lat_a, double lng_a, double lat_b, double lng_b) {
        double d = 0;
        lat_a=lat_a*Math.PI/180;
        lng_a=lng_a*Math.PI/180;
        lat_b=lat_b*Math.PI/180;
        lng_b=lng_b*Math.PI/180;

        d=Math.sin(lat_a)*Math.sin(lat_b)+Math.cos(lat_a)*Math.cos(lat_b)*Math.cos(lng_b-lng_a);
        d=Math.sqrt(1-d*d);
        d=Math.cos(lat_b)*Math.sin(lng_b-lng_a)/d;
        d=Math.asin(d)*180/Math.PI;

//        d = (d*10000);
        return d;
    }

    /**
     * 合并经纬度为一个单一数字
     * @param lat    维度
     * @param lng    经度
     * @return    合并后的单一数据
     */
    public static Long mergerPoint(Double lat, Double lng) {
        if(isErrorLoction(lng, lat)) {
            throw new CommonException(Error.system_location_error);
        }
        String latStr = lat.toString();
        String lngStr = lng.toString();
        int lat_d = latStr.indexOf(".");
        int lng_d = lngStr.indexOf(".");
        latStr = latStr.replace(".", "");
        lngStr = lngStr.replace(".", "");
        // 处理掉过长经纬度
        latStr = (latStr.length()-lat_d)>point_length ? latStr.substring(0, lat_d+point_length) : latStr;
        lngStr = (lngStr.length()-lng_d)>point_length ? lngStr.substring(0, lng_d+point_length) : lngStr;
        // 处理过短的经纬度
        while(latStr.length()-lat_d < point_length) {
            latStr += "0";
        }
        while(lngStr.length()-lng_d < point_length) {
            lngStr += "0";
        }

        // 转换成数字数据并获取数据的二进制下的长度(准备做二进制对插)
        Long tempLat = Long.parseLong(latStr);
        Long tempLng = Long.parseLong(lngStr);
        int lengthLat = Long.toBinaryString(tempLat).length();
        int lengthLng= Long.toBinaryString(tempLng).length();

        // 获取经纬度中最长为位数
        int maxLength = lengthLat>lengthLng?lengthLat:lengthLng;

        // 进行二进制对插处理
        Long newPoint = 0L;
        for(int i=0; i<maxLength; i++) {
            newPoint += ((tempLat>>i)%2)*(new Double(Math.pow(2, i*2)).longValue());
            newPoint += ((tempLng>>i)%2)*(new Double(Math.pow(2, i*2+1)).longValue());
        }
        return newPoint;
    }

    /**
     * 将合并后的数值重新转换为经纬度
     * @param num    合并后的数值
     * @return    借用 Point.Double 来表示经纬度(x:纬度lat,y:经度lng)
     */
    public static Point.Double getPointForMerger(Long num) {
        int binaryLength = Long.toBinaryString(num).length();
        Long latNg = 0L;
        Long lngNg = 0L;
        for(int i=0; i<binaryLength; i++) {
            if(i%2 == 0) {
                latNg += ((num>>i)%2) * (new Double(Math.pow(2, i/2)).longValue());
            } else {
                lngNg += ((num>>i)%2) * (new Double(Math.pow(2, i/2)).longValue());
            }
        }

        Double pow = Math.pow(10, point_length);
        Double lat = latNg / pow;
        Double lng = lngNg / pow;
        return new Point2D.Double(lat, lng);
    }

    /**
     * 校验经纬度是否是异常值
     * (处理经纬度有获取不到的情况)
     * @param lng    经度
     * @param lat    纬度
     * @return    是否正常(true:非正常)
     */
    public static boolean isErrorLoction(Double lng, Double lat) {
        if(lng==null || lat==null) {
            return true;
        }
        if(lng.equals(Double.MAX_VALUE) || lat.equals(Double.MAX_VALUE)) {
            return true;
        }
        if(lng.equals(0.0d) || lat.equals(0.0d)) {
            return true;
        }
        // 特殊值(未获取到经纬度时的值)
        if(lng.equals(4.9E-324) || lat.equals(4.9E-324)) {
            return true;
        }
        return false;
    }


    /**
     * 计算合并后数值间的距离
     * @param num1    数值1
     * @param num2    数值2
     * @return    距离(米)
     */
    public static double getDistance(Long num1, Long num2) {
        Point.Double pd1 = getPointForMerger(num1);
        Point.Double pd2 = getPointForMerger(num2);
        return getDistance(pd1.x, pd1.y, pd2.x, pd2.y);
    }

    /**
     * 计算合并后数值间的角方位
     * @param num1    数值1
     * @param num2    数值2
     * @return    角度
     */
    public static double gps2d(Long num1, Long num2) {
        Point.Double pd1 = getPointForMerger(num1);
        Point.Double pd2 = getPointForMerger(num2);
        return gps2d(pd1.x, pd1.y, pd2.x, pd2.y);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 低调小熊猫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java 根据两个位置的经纬度,来计算两地的距离 经纬度处理
package com.fh.util; import java.util.HashMap; import java.util.Map; /** * 说明:经纬度处理 * 作者:FH Admin * from:fhadmin.cn */ public class MapDistance { private static double EARTH_RADIUS = 6378.137; private static double rad(double d) {
FHAdmin
2021/09/26
9680
地址转换为经纬度,经纬度距离计算
根据已知地址,将地址经纬度计算出来,不多说直接上代码 import org.apache.commons.lang.StringUtils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util
一觉睡到小时候
2019/07/02
2.3K0
【GIS - 地理信息系统】经纬度计算 ( 经度、纬度概念 | 地球周长计算 | 地球经线周长计算 | 经纬度相关计算 | 经纬度坐标距离计算公式 | 经纬度与实际距离换算 | 相关代码实现 )
经度 Longitude , 本初子午线 位置 为 0 度经线 , 相当于水平 x 轴 的坐标 , 经度的取值范围 -180 度 ~ +180 度 ;
韩曙亮
2023/10/11
7.3K0
【GIS - 地理信息系统】经纬度计算 ( 经度、纬度概念 | 地球周长计算 | 地球经线周长计算 | 经纬度相关计算 | 经纬度坐标距离计算公式 | 经纬度与实际距离换算 | 相关代码实现 )
Java通过经纬度计算两地之间的距离 转
public class LocationUtils { private static double EARTH_RADIUS = 6378.137; private static double rad(double d) { return d * Math.PI / 180.0; } /** * 通过经纬度获取距离(单位:米)
用户2603479
2018/08/15
9570
java计算两个经纬度之间的距离
前一阵项目中,有一个需求:是查找附近的人,其实就是查询某个距离内有多少用户。实现方式还是比较简单的,首先用户在APP上开启定位权限,将自己的经纬度都存储到数据库,然后以此经纬度为基准,以特定距离为半径,查找此半径内的所有用户。
一诺千金
2020/04/23
3.2K0
java计算两个经纬度之间的距离
经纬度距离公式_经纬度差的计算
上述适合百公里以内,几百公里的时候两者误差量级为几米,在计算1000公里级别是误差能到达几十米。 要真正精准计算,必须考虑地球椭球体。建议采用椭球体算法,比较著名的算法有Vincenty方案算法,参考:Vincenty solutions of geodesics on the ellipsoid
全栈程序员站长
2022/11/09
1.9K0
经纬度距离公式_经纬度差的计算
利用JS实现的根据经纬度计算地球上两点之间的距离
第一种是默认地球是一个光滑的球面,然后计算任意两点间的距离,这个距离叫做大圆距离(The Great Circle Distance)。
大江小浪
2018/07/24
3.4K0
Java 两个经纬度获取方位
今天有一个需求,需要计算两个经纬度的方位,记录一下 package com.wm.fire.backend.tools; /** * @program fire-backend * @description: * @author: Destiny * @create: 2020/08/07 15:32 */ public class LatLngTool { public static double GetJiaoDu(double lat1, double lng1, double
赵哥窟
2020/08/11
1.1K0
php mysql 经纬度_mysql,php和js根据经纬度计算距离
a=Lat1 – Lat2 为两点纬度之差 b=Lung1 -Lung2 为两点经度之差;
全栈程序员站长
2022/11/09
5.9K0
php mysql 经纬度_mysql,php和js根据经纬度计算距离
你在小程序中怎么计算两个经纬度的距离?
在没有官方支持时,小程序中的位置获取,可以采用腾讯地图,高德地图,百度地图都可以,但是你需要先通过小程序的wx.getLocation 获取当前的经纬度,然后再借助第三方地图提供的webservice API ,自己在后端实现一个根据经纬度获取当前位置的接口,然后供小程序调用。
酒馆丁老师
2020/09/17
3.2K0
你在小程序中怎么计算两个经纬度的距离?
两个坐标之间对距离计算
由于项目的需要,所以学习了两个经纬度之间的距离(单位:米) package org.choviwu.movie.test; public class DistanceUtil { private static double EARTH_RADIUS = 6378.137; private static double rad(double d) { return d * Math.PI / 180.0; } /** * 通过经纬度获取距离(单位
简单的程序员
2020/04/18
1.7K0
经纬度转换-----度分秒以及经纬度和米
经纬度互换 度(DDD):E 108.90593度    N 34.21630度     如何将度(DDD):: 108.90593度换算成度分秒(DMS)东经E 108度54分22.2秒?转换方法是
水击三千
2018/02/27
11.9K0
经纬度转换-----度分秒以及经纬度和米
java中各种距离换算
获取两点之间的距离 public class LocationUtils { /** * 赤道半径 */ private static double EARTH_RADIUS = 6378.137; private static double rad(double d) { return d * Math.PI / 180.0; } /** * Description : 通过经纬度获取距离(单位:米) *
崔笑颜
2020/09/29
1.4K0
已知两点的经度和纬度,计算两点间的距离(php,javascript)
php代码:转载  http://www.cnblogs.com/caichenghui/p/5977431.html
lin_zone
2018/08/15
9280
【Java AWT 图形界面编程】经度 Longitude 、纬度 Latitude 计算 ( 经度、纬度概念 | 根据经纬度计算距离 )
经度 Longitude , 本初子午线 位置 为 0 度经线 , 相当于水平 x 轴 的坐标 , 经度的取值范围 -180 度 ~ +180 度 ;
韩曙亮
2023/03/25
8380
【Java AWT 图形界面编程】经度 Longitude 、纬度 Latitude 计算 ( 经度、纬度概念 | 根据经纬度计算距离 )
根据经纬度、方向、距离求终点位置
假设方位角是α, 那从点1到点2的平移距离分别如下所示d*sinα, d*cosα。 这里正北为0度。基中点1经纬度(long1, lat1)和距离d是已知的。 求点2的经纬度(long2,lat2)
sunsky
2023/09/13
8100
根据经纬度、方向、距离求终点位置
自学HarmonyOS应用开发(54)- 校正定位偏差
经过一番调查,结论是gps信号使用的是WGS-84坐标系,而高德地图使用的是GCJ-02火星坐标系,只有经过坐标变换才能显示正确的位置。这方面的文章网上有很多,这里采用以下博客文章中的代码:
面向对象思考
2021/07/15
3650
经纬度坐标距离计算
百度地图两点之间距离【传送门】 PHP版本 <?php /** * 计算两点之间直线距离 * @param float $lon1 经度 * @param float $lat1
苦咖啡
2018/04/28
6.2K3
Java根据经纬度获取两点之间的距离
Java根据经纬度获取两点之间的距离,最近在实现类似于钉钉打卡签到的需求,因为对精度要求不是很高,所以可以通过一个球面距离的公式来求两点距离,这里将地球当成一个球体,实际上地球是一个不规则的球体,所以这个实现方法只能适用一些精度要求不高的需求,如果要高精度,可以用第三方的api去实现。
SmileNicky
2024/12/23
2600
Java根据经纬度获取两点之间的距离
js根据经纬度计算距离
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
2.6K0
推荐阅读
相关推荐
java 根据两个位置的经纬度,来计算两地的距离 经纬度处理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验