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

com.googlecode.xmemcached.spring.boot.geo.GeoTemplate Maven / Gradle / Ivy

package com.googlecode.xmemcached.spring.boot.geo;

import lombok.extern.slf4j.Slf4j;
import org.gavaghan.geodesy.Ellipsoid;
import org.gavaghan.geodesy.GeodeticCalculator;
import org.gavaghan.geodesy.GeodeticCurve;
import org.gavaghan.geodesy.GlobalCoordinates;

@Slf4j
public class GeoTemplate {



	/**
	 * 计算两点之间距离 https://www.cnblogs.com/zhaoyanhaoBlog/p/10121499.html
	 * @param longitude1	:坐标1经度
	 * @param latitude1		:坐标1维度
	 * @param longitude2	:坐标2经度
	 * @param latitude2		:坐标2维度
	 * @return	计算结果(单位:米)
	 */
	public double getDistance(double latitude1, double longitude1, double latitude2, double longitude2) {

		double lat1 = (Math.PI / 180) * latitude1;
		double lat2 = (Math.PI / 180) * latitude2;

		double lon1 = (Math.PI / 180) * longitude1;
		double lon2 = (Math.PI / 180) * longitude2;

//      double Lat1r = (Math.PI/180)*(gp1.getLatitudeE6()/1E6);
//      double Lat2r = (Math.PI/180)*(gp2.getLatitudeE6()/1E6);
//      double Lon1r = (Math.PI/180)*(gp1.getLongitudeE6()/1E6);
//      double Lon2r = (Math.PI/180)*(gp2.getLongitudeE6()/1E6);

		// 地球半径
		double R = 6371;

		// 两点间距离 km,如果想要米的话,结果*1000就可以了
		double d = Math.acos(Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1))
				* R;

		return d * 1000;
	}

	/**
	 * 1、计算Sphere模式下两个坐标点的距离(单位:米)
	 * @param longitude1	:坐标1经度
	 * @param latitude1		:坐标1维度
	 * @param longitude2	:坐标2经度
	 * @param latitude2		:坐标2维度
	 * @return	计算结果(单位:米)
	 */
	public double getSphereDistance(double latitude1, double longitude1, double latitude2, double longitude2) {
		return this.getDistance(Ellipsoid.Sphere, latitude1, longitude1, latitude2, longitude2);
	}

	/**
	 * 2、计算WGS84模式下两个坐标点的距离(单位:米)
	 * @param longitude1	:坐标1经度
	 * @param latitude1		:坐标1维度
	 * @param longitude2	:坐标2经度
	 * @param latitude2		:坐标2维度
	 * @return	计算结果(单位:米)
	 */
	public double getWGS84Distance(double latitude1, double longitude1, double latitude2, double longitude2) {
	    return this.getDistance(Ellipsoid.WGS84, latitude1, longitude1, latitude2, longitude2);
	}

	/**
	 * 2、计算指定模式下两个坐标点的距离(单位:米)
	 * @param ellipsoid		:坐标计算模式
	 * @param longitude1	:坐标1经度
	 * @param latitude1		:坐标1维度
	 * @param longitude2	:坐标2经度
	 * @param latitude2		:坐标2维度
	 * @return	计算结果(单位:米)
	 */
	public double getDistance(Ellipsoid ellipsoid, double latitude1, double longitude1, double latitude2, double longitude2) {

		// 1、此处可以传入起始点经纬度
		GlobalCoordinates gpsFrom = new GlobalCoordinates(latitude1, longitude1);

		// 2、此处可以传入目标点经纬度
		GlobalCoordinates gpsTo = new GlobalCoordinates(latitude2, longitude2);

	    // 3、调用计算方法,传入坐标系、经纬度用于计算距离
	    return this.getDistance(gpsFrom, gpsTo, ellipsoid);

	}

	public double getDistance(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid){

        // 1、创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离
        GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, gpsFrom, gpsTo);

        // 2、获取计算结果
        return geoCurve.getEllipsoidalDistance();
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy