All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.hugh.util.CoordinatesUtils Maven / Gradle / Ivy

The newest version!
package com.github.hugh.util;

import com.github.hugh.model.dto.GgaDTO;
import com.github.hugh.model.dto.GpsDTO;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * 坐标工具类
 *
 * @author hugh
 * @since 1.6.3
 */
public class CoordinatesUtils {

    /**
     * 圆周率
     */
    private static final double pi = 3.14159265358979324;

    /**
     * 计算后的Π
     */
    private static final double CALC_PI = pi * 3000.0 / 180.0;

    /**
     * 截取小数点后八位
     */
    private static final DecimalFormat decimalFormat = new DecimalFormat("#.00000000");

    /**
     * 高德转百度
     * 

火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 坐标的转换算法

*

注:只保留小数点后八位

* * @param longitude 经度 * @param latitude 纬度 * @return {@link GpsDTO} * @since 1.6.3 */ public static GpsDTO gcj02ToBd09(final double longitude, final double latitude) { double z = Math.sqrt(longitude * longitude + latitude * latitude) + 0.00002 * Math.sin(latitude * CALC_PI); double theta = Math.atan2(latitude, longitude) + 0.000003 * Math.cos(longitude * CALC_PI); // 计算后的bd09 经度 double bdlon = (z * Math.cos(theta) + 0.0065); // 金酸后的bd09 纬度 double bdlat = z * Math.sin(theta) + 0.006; return new GpsDTO(Double.parseDouble(decimalFormat.format(bdlat)), Double.parseDouble(decimalFormat.format(bdlon))); } /** * 百度转高德 *

百度坐标(bd09ll) 转 火星坐标(gcj02ll)

* * @param longitude 经度 * @param latitude 纬度 * @return GpsDTO {@link GpsDTO} * @since 1.6.4 */ public static GpsDTO bd09ToGcj02(double longitude, double latitude) { double x = longitude - 0.0065; double y = latitude - 0.006; double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * CALC_PI); double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * CALC_PI); // 计算后的gcj02ll 经度 String gcjLon = decimalFormat.format(z * Math.cos(theta)); // 计算后的gcj02ll 纬度 String gcjLat = decimalFormat.format(z * Math.sin(theta)); return new GpsDTO(Double.parseDouble(gcjLon), Double.parseDouble(gcjLat)); } /** * 度分格式的gga经纬度换算成wgs84的经纬度 *

* 算法示例: *

* 东经:10629.6601-{@code >}106.29.6601-{@code >}106+29.6601÷60=106.494335° *

* 北纬:2937.1526-{@code >}29.37.1526-29+37.1526÷60=29.61921° *

* @param degreeMinutes 度分格式:经纬度 * @return String 经纬度 * @since 1.7.4 */ public static String formatDegreeMinutes(double degreeMinutes) { // 向下取整 double number = Math.floor(degreeMinutes / 100); String number2 = String.valueOf(degreeMinutes / 100); // 获取小数点后的数 number2 = number2.substring(number2.indexOf(".")); double v = Double.parseDouble("0" + number2) * 100; double number3 = DoubleMathUtils.div(v, 60, 8); BigDecimal b1 = new BigDecimal(Double.toString(number)); BigDecimal b2 = new BigDecimal(Double.toString(number3)); return b2.add(b1).toString(); } /** * gga解析成实体 * * @param gga gga信息 * @return GgaDTO * @since 1.7.4 */ public static GgaDTO parseGga(String gga) { if (EmptyUtils.isEmpty(gga)) { return null; } GgaDTO ggaDTO = new GgaDTO(); String[] arr = gga.split(","); // 用,分割 for (int i = 0; i < arr.length; i++) { String str = arr[i]; switch (i) { case 0: ggaDTO.setName(str); break; case 1: ggaDTO.setDate(str); break; case 2: ggaDTO.setLatitude(str); break; case 3: ggaDTO.setLatitudeBearing(str); break; case 4: ggaDTO.setLongitude(str); break; case 5: ggaDTO.setLongitudeBearing(str); break; case 6: ggaDTO.setGpsStatus(str); break; case 7: ggaDTO.setNumberOfSatellites(str); break; case 8: ggaDTO.setHdopHorizontalAccuracyFactor(str); break; case 9: ggaDTO.setAltitude(str); break; case 10: ggaDTO.setWaterSurfaceAltitude(str); break; case 11: ggaDTO.setDifferentialTime(str); break; case 12: ggaDTO.setDifferentialStationId(str); break; default: break; } } ggaDTO.setCalibrationValue(arr[arr.length - 1]); return ggaDTO; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy