1、经纬度转换工具类


import com.wh.whcloud.core.base.util.StringUtil;
import lombok.extern.slf4j.Slf4j;/*** 经纬度工具类*/
@Slf4j
public class LonlatUtils {/*    public static void main(String[] args) {System.out.println(DmTurnD("120°39.516'"));System.out.println(DmTurnD("30°46.237'"));}*//*** 表示角度的度、分、秒分别使用°、′、″符号进行表示。* 1°=60′,1′=60″ ,1°=3600″。* 由上述可知度分秒转换度的计算公式为:(dd°mm′ss″) dd+mm/60+ss/3600* 经纬度转换 ,度分秒转度* @param jwd* @return*/public static String DmsTurnD(String jwd){try{if(StringUtil.isNotEmpty(jwd)&&(jwd.contains("°"))){//如果不为空并且存在度单位//计算前进行数据处理jwd = jwd.replace("E", "").replace("N", "").replace(":", "").replace(":", "");double d=0,m=0,s=0;d = Double.parseDouble(jwd.split("°")[0]);//不同单位的分,可扩展if(jwd.contains("′")){//正常的′m = Double.parseDouble(jwd.split("°")[1].split("′")[0]);}else if(jwd.contains("'")){//特殊的'm = Double.parseDouble(jwd.split("°")[1].split("'")[0]);}//不同单位的秒,可扩展if(jwd.contains("″")){//正常的″//有时候没有分 如:112°10.25″s = jwd.contains("′")?Double.parseDouble(jwd.split("′")[1].split("″")[0]):Double.parseDouble(jwd.split("°")[1].split("″")[0]);}else if(jwd.contains("''")){//特殊的''//有时候没有分 如:112°10.25''s = jwd.contains("'")?Double.parseDouble(jwd.split("'")[1].split("''")[0]):Double.parseDouble(jwd.split("°")[1].split("''")[0]);}jwd = String.valueOf(d+m/60+s/60/60);//计算并转换为string//使用BigDecimal进行加减乘除/*BigDecimal bd = new BigDecimal("60");BigDecimal d = new BigDecimal(jwd.contains("°")?jwd.split("°")[0]:"0");BigDecimal m = new BigDecimal(jwd.contains("′")?jwd.split("°")[1].split("′")[0]:"0");BigDecimal s = new BigDecimal(jwd.contains("″")?jwd.split("′")[1].split("″")[0]:"0");//divide相除可能会报错(无限循环小数),要设置保留小数点jwd = String.valueOf(d.add(m.divide(bd,6,BigDecimal.ROUND_HALF_UP).add(s.divide(bd.multiply(bd),6,BigDecimal.ROUND_HALF_UP))));*/}}catch (Exception e){log.info("度分秒转换错误");return jwd;}return jwd;}/*** 度分 转度* 十进制经纬度转换 ddd°mm.mmmm' 转 ddd.ddddd°* 如:112°30.4128' = 112.50688* @param jwd* @return*/public static String DmTurnD(String jwd){try {if(StringUtil.isNotEmpty(jwd)&&(jwd.contains("°")&&jwd.contains("'"))){//如果不为空并且存在度、分单位double d=0,m=0;d = Double.parseDouble(jwd.split("°")[0]);m = Double.parseDouble(jwd.split("°")[1].split("'")[0])/60;jwd = String.valueOf(d+m);}else if(StringUtil.isNotEmpty(jwd)&&(jwd.contains("°"))){//如果不为空并且存在度单位double d=0,m=0;d = Double.parseDouble(jwd.split("°")[0]);m = Double.parseDouble(jwd.split("°")[1])/60;jwd = String.valueOf(d+m);}}catch (Exception e){log.info("度分转换错误");return jwd;}return jwd;}}

2、DistanceUtil工具类

public class DistanceUtil {public static final double earthRadius = 6371.393D;public static final double nmi = 5.4E-4D;public DistanceUtil() {}public static double meterToNmi(double len) {return len * 5.4E-4D;}public static double meterToDegree(double len) {return km2Degree(len / 1000.0D);}private static double rad(double d) {return d * 3.141592653589793D / 180.0D;}public static double getDistance(double lat1, double lng1, double lat2, double lng2) {double radLat1 = rad(lat1);double radLat2 = rad(lat2);double a = radLat1 - radLat2;double b = rad(lng1) - rad(lng2);double s = 2.0D * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2.0D), 2.0D) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2.0D), 2.0D)));s *= 6371.393D;s = (double)Math.round(s * 10000.0D) / 10000.0D;s *= 1000.0D;return s;}public static Double km2Degree(Double l) {Double degree = 0.008992661340005603D * l;return degree;}public static Double degree2Km(Double degree) {Double l = 111.20178578851908D * degree;return l;}
}

3、经纬度角度计算工具类

import com.util.DistanceUtil;public class AngleUtil {/*** 根据俯仰角计算水平距离 俯仰角小于45度时适用** @param h     单位米* @param angle 单位度* @return*/public static double HorizontalAngleCal(double h, double angle) {return h * Math.tan(angle);}/*** 获取云台和目标的直线距离(斜边长)* @param lon1* @param lat1* @param lon2* @param lat2* @param h* @return*/public static double getDistance(double lon1,double lat1,double lon2,double lat2,double h){double l = DistanceUtil.getDistance(lat1,lon1,lat2,lon2);return Math.sqrt(Math.pow(h,2)+ Math.pow(l,2));}/*** 获取俯仰角度* @param lon1* @param lat1* @param lon2* @param lat2* @param h* @return*/public static double getTilAngle(double lon1,double lat1,double lon2,double lat2,double h){double l = DistanceUtil.getDistance(lat1,lon1,lat2,lon2);return Math.toDegrees(Math.atan (l/h));}/*** 求两点连线与正北方向的角度(水平角度)* @param A* @param B* @return*/public static double getPanAngle(LatLon A, LatLon B) {double dx = (B.m_RadLo - A.m_RadLo) * A.Ed;double dy = (B.m_RadLa - A.m_RadLa) * A.Ec;double angle = 0.0;angle = Math.atan(Math.abs(dx / dy)) * 180 / Math.PI;double dLo = B.m_Longitude - A.m_Longitude;double dLa = B.m_Latitude - A.m_Latitude;if (dLo > 0 && dLa <= 0) {angle = (90 - angle) + 90;} else if (dLo <= 0 && dLa < 0) {angle = angle + 180;} else if (dLo < 0 && dLa >= 0) {angle = (90 - angle) + 270;}return angle;}/*** 获取方位角* @param lat_a 纬度1* @param lng_a 经度1* @param lat_b 纬度2* @param lng_b 经度2* @return*/public static double getBearingAngle(double lat_a, double lng_a, double lat_b, double lng_b) {try {double y = Math.sin(lng_b-lng_a) * Math.cos(lat_b);double x = Math.cos(lat_a)*Math.sin(lat_b) - Math.sin(lat_a)*Math.cos(lat_b)*Math.cos(lng_b-lng_a);double brng = Math.atan2(y, x);brng = Math.toDegrees(brng);if(brng < 0){brng = brng +360;}return brng;}catch (Exception e){e.printStackTrace();return 0d;}}
}

4、判断经纬度坐标点是否在区域内工具类

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class PolygonUtil {/*** 求一个坐标点距离区域最近距离** @param lon* @param lat* @param plotPointModelList* @return*//*public static double getDistanceFromPointToPolygon(BigDecimal lon, BigDecimal lat,List<PlotPointModel> plotPointModelList) {if (plotPointModelList.size() > 2) {//求出距离最短的两个点PlotPointModel minPoint1 = plotPointModelList.get(0);PlotPointModel minPoint2 = plotPointModelList.get(1);double d1 = DistanceUtil.getDistance(lat.doubleValue(), lon.doubleValue(),minPoint1.getLat().doubleValue(), minPoint1.getLon().doubleValue());double d2 = DistanceUtil.getDistance(lat.doubleValue(), lon.doubleValue(),minPoint2.getLat().doubleValue(), minPoint2.getLon().doubleValue());if (d1 > d2) {PlotPointModel temp = minPoint1;minPoint1 = minPoint2;minPoint2 = temp;}for (int i = 2; i < plotPointModelList.size(); i++) {PlotPointModel plotPoint = plotPointModelList.get(i);double d = DistanceUtil.getDistance(lat.doubleValue(), lon.doubleValue(),plotPoint.getLat().doubleValue(), plotPoint.getLon().doubleValue());if (d < d1) {d2 = d1;d1 = d;minPoint2 = minPoint1;minPoint1 = plotPoint;} else if (d < d2) {d2 = d;minPoint2 = plotPoint;}}//根据最短两点,求最短距离double c = DistanceUtil.getDistance(minPoint1.getLat().doubleValue(), minPoint1.getLon().doubleValue(),minPoint2.getLat().doubleValue(), minPoint2.getLon().doubleValue());if (Math.pow(d2, 2) >= Math.pow(d1, 2) + Math.pow(c, 2)) {//钝角三角形return d1;}//锐角三角形,计算垂足,海伦公式//计算周长double p = (d1 + d2 + c) / 2;//计算面积double a = p * (p - d1) * (p - d2) * (p - c);double s = Math.sqrt(a);//返回高return s / c;}return -1;}*//*** <p>* 计算点到折线的最短距离* 计算点到每条线段的最短距离,排序之后,拿最短的一条* </p>** @param lon* @param lat* @param plotPointModelList* @return {@link double}* @author hahalouti* @date 2021/10/26*/public static double getDistanceFromPointToPolygon(BigDecimal lon, BigDecimal lat,List<PlotPointModel> plotPointModelList) {List<Double> distance = new ArrayList<>();for (int i = 0; i < plotPointModelList.size() - 1; i++) {PlotPointModel plotPoint = plotPointModelList.get(i);PlotPointModel plotPoint2 = plotPointModelList.get(i + 1);double d1 = DistanceUtil.getDistance(lat.doubleValue(), lon.doubleValue(),plotPoint.getLat().doubleValue(), plotPoint.getLon().doubleValue());double d2 = DistanceUtil.getDistance(lat.doubleValue(), lon.doubleValue(),plotPoint2.getLat().doubleValue(), plotPoint2.getLon().doubleValue());double c = DistanceUtil.getDistance(plotPoint.getLat().doubleValue(), plotPoint.getLon().doubleValue(),plotPoint2.getLat().doubleValue(), plotPoint2.getLon().doubleValue());// 判断是否是钝角三角形if (Math.pow(d1, 2) >= Math.pow(d2, 2) + Math.pow(c, 2)) {//钝角三角形distance.add(d2);} else if (Math.pow(d2, 2) >= Math.pow(d1, 2) + Math.pow(c, 2)) {//钝角三角形distance.add(d1);} else {double p = (d1 + d2 + c) / 2;//计算面积double a = p * (p - d1) * (p - d2) * (p - c);double s = Math.sqrt(a);//返回高distance.add(s / c);}}Collections.sort(distance);return distance.get(0);}/*** 判断坐标点是否在一个区域内** @param lon* @param lat* @param plotPointModelList* @return*/public static boolean checkInPolygon(BigDecimal lon, BigDecimal lat,List<PlotPointModel> plotPointModelList) {double pointLon = lon.doubleValue();double pointLat = lat.doubleValue();int size = plotPointModelList.size();if (size < 3) {return false;} else {PlotPointModel first = plotPointModelList.get(0);PlotPointModel end = plotPointModelList.get(size - 1);if (first.getLon().doubleValue() == end.getLon().doubleValue()&& first.getLat().doubleValue() == end.getLat().doubleValue()) {plotPointModelList.remove(size - 1);}int pointCount = plotPointModelList.size();int intersectPointCount = 0;float intersectPointWeights = 0.0F;double precision = 2.0E-10D;for (int i = 1; i <= pointCount; ++i) {PlotPointModel next = plotPointModelList.get(i % pointCount);double firstLon = first.getLon().doubleValue();double firstLat = first.getLat().doubleValue();double nextLon = next.getLon().doubleValue();double nextLat = next.getLat().doubleValue();if (pointLat >= Math.min(firstLat, nextLat) && pointLat <= Math.max(firstLat, nextLat)) {if (pointLat > Math.min(firstLat, nextLat) && pointLat < Math.max(firstLat, nextLat)) {if (firstLon == nextLon) {if (pointLon == firstLon) {return true;}if (pointLon < firstLon) {++intersectPointCount;}} else if (pointLon <= Math.min(firstLon, nextLon)) {++intersectPointCount;} else if (pointLon > Math.min(firstLon, nextLon) && pointLon < Math.max(firstLon, nextLon)) {double slopeDiff = 0.0D;if (firstLat > nextLat) {slopeDiff = (pointLat - nextLat) / (pointLon - nextLon) - (firstLat - nextLat) / (firstLon - nextLon);} else {slopeDiff = (pointLat - firstLat) / (pointLon - firstLon) - (nextLat - firstLat) / (nextLon - firstLon);}if (slopeDiff > 0.0D) {if (slopeDiff < precision) {return true;}++intersectPointCount;}}} else {if (firstLat == nextLat && pointLon <= Math.max(firstLon, nextLon) && pointLon >= Math.min(firstLon, nextLon)) {return true;}if (pointLat == firstLat && pointLon < firstLon|| pointLat == nextLat && pointLon < nextLon) {if (nextLat < firstLat) {intersectPointWeights = (float) ((double) intersectPointWeights + -0.5D);} else if (nextLat > firstLat) {intersectPointWeights = (float) ((double) intersectPointWeights + 0.5D);}}}first = next;} else {first = next;}}if (((float) intersectPointCount + Math.abs(intersectPointWeights)) % 2.0F == 0.0F) {return false;} else {return true;}}}
//
//
//  public static void main(String[] args) {
//    BigDecimal lon = new BigDecimal(122.63987);
//    BigDecimal lat = new BigDecimal(39.25399);
//    List<PlotPointModel> plotPointModelList = new ArrayList<>();
//    PlotPointModel  plotPointModel = new PlotPointModel();
//    plotPointModel.setLon(new BigDecimal(122.6244164));
//    plotPointModel.setLat(new BigDecimal(39.2591590));
//    plotPointModelList.add(plotPointModel);
//
//    PlotPointModel  plotPointModel2 = new PlotPointModel();
//    plotPointModel2.setLon(new BigDecimal(122.6244164));
//    plotPointModel2.setLat(new BigDecimal(39.2463846));
//    plotPointModelList.add(plotPointModel2);
//
//    PlotPointModel  plotPointModel3 = new PlotPointModel();
//    plotPointModel3.setLon(new BigDecimal(122.6494789));
//    plotPointModel3.setLat(new BigDecimal(39.2466508));
//    plotPointModelList.add(plotPointModel3);
//
//    PlotPointModel  plotPointModel4 = new PlotPointModel();
//    plotPointModel4.setLon(new BigDecimal(122.6499939));
//    plotPointModel4.setLat(new BigDecimal(39.2588929));
//    plotPointModelList.add(plotPointModel4);
//
//    System.out.println(checkInPolygon(lon,lat,plotPointModelList));
//  }
}

JAVA经纬度互转、计算工具类相关推荐

  1. java计算工作日_Java工作日计算工具类

    工作日计算工具类 主要功能:传入两个日期,返回这两个日期之间有多少个工作日. 思路: 预先设置好一定年份范围内的节假日.补休到map里.(这里暂时只设置了2017 - 2018年的) 将这个年份范围内 ...

  2. RelativeDateFormat时间计算工具类

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;/*** 时间计算工 ...

  3. java jexl 工具类_jexl表达式解析、计算工具类.md

    jexl表达式解析.计算工具类.md 根据表达式可以动态反向解析出变量:适合动态表达式,参数未知场景 如 (A0.2+B0.8)/C 解析出 A\B\C,把ABC参数值代入计算 初始化引擎 priva ...

  4. java获取经纬度和地址等工具类

    此工具类是, 模拟请求去调用百度地图api,来根据输入的地址获取相关信息.或者根据经纬度确定地址等. 注意看下面代码的注解,注解写的很清楚. 注意:需要自行申请百度key,在代码相应位置替换,参考官方 ...

  5. Java 时间间隔计算工具类

    Java 时间间隔计算工具类 一.工具类-DateIntervalUtil package com.example.demotest.util;import java.text.DecimalForm ...

  6. 计算车号Java,java停车收费计算工具类

    停车收费计算工具类.收费标准:8时至22时,停车1小时内3元,超过1小时每延长1小时加收3元:11时至12时.16时30分至17时30分,停车30分钟内收1元,超过30分收3元:晚22时至次日8时,收 ...

  7. java 数学计算库_数学计算工具类

    [java]代码库/** * Description: [数字计算工具类] * @version 1.0 */ public class MathUtils { /** 一百的常量 */ privat ...

  8. 方差计算工具类--Java版

    方差的计算,如果不太计较精度的话,可以使用 Apache 的 commons-math3(http://commons.apache.org/proper/commons-math/)提供的 Vari ...

  9. java web 项目 常用 小工具类 ~~~~

    java web 项目 常用 小工具类 ~~~~ 一 .DateUtil  日期工具类 package com.devframe.common.util;import java.text.Simple ...

  10. 常用的数学计算工具类

    package com.xutil.math;import java.math.BigDecimal;/*** @title 数学计算工具类* @author Xingbz* @createDate ...

最新文章

  1. 中科院詹剑锋:美国出口管控对中国开源软件及产业的影响。
  2. 把报表的数据导出Excel
  3. Unity的Lerp函数实现缓动
  4. 2022年最值得学习的 5 种编程语言,你有在学习吗?
  5. java 用文件对话框打开文件
  6. 哥写的不是代码,是寂寞
  7. 遍历结构体内部元素和值(Name and Value)
  8. Qt开源作品43-超级图形字体
  9. [SQL面试经验] 经典sql面试题及答案第1期
  10. HTML5是不是解决跨平台问题的终极密钥
  11. 英语基础语法(五)-形容词、副词
  12. 多线程socket服务器(c语言)
  13. Python的列表推导式和嵌套列表推导式
  14. 智力题:最短时间过桥问题
  15. python使用级数pi的近似值_π近似莱布尼兹级数
  16. 2021年武汉市中等职业学校学生技能大赛“网络空间安全”赛项技术规程
  17. 致远协同软件个性化功能之标签页版本隐藏
  18. 词袋模型BoW和词集模型SoW比较
  19. 解决方案 | 回归医院运营管理本质,从建立指标体系出发
  20. 信仰不分国籍,合作成就未来——EOSWTZ助力全球EOS节点共建中文社群

热门文章

  1. Python和Ruby两大语言全方位对比
  2. Coall-jtag烧写器功能与特色
  3. envi自定义坐标系
  4. 机器学习与物理科学(四)(Machine learning and the physical sciences)
  5. STC 32位8051单片机开发实例教程 一 开发环境搭建
  6. 单片机 STC8H1K08-36I TSSOP20 - 低压检测
  7. 输出100以内所有的素数
  8. java 四级联动_使用js实现四级联动
  9. 实验室管理系统LIMS的作用和意义
  10. VMware卸载干净