地图 经纬度 坐标系 两点之间距离计算 (拾取坐标系统)

701 阅读1分钟

拾取坐标系统 api.map.baidu.com/lbsapi/getp… 百度 www.opengps.cn/Map/Tools/P… 高德

longitude 英 [ˈlɒŋɡɪtjuːd] 美 [ˈlɑːndʒɪtuːd] 经度 104.*** latitude 英 [ˈlætɪtjuːd] 美 [ˈlætɪtuːd] n. 纬度 36.***

st_distance 为mysql5.6+版本中开始自带的经纬度计算函数

经纬度 存int:整数只需要四个字节的存储空间(扩大了10的6次方)。 IEEE双精度浮点数是8个字节。内存更优,查询性能更快int。计算时 /100000;

经纬度:使用 火星坐标系 (高德) 计算,两地之间距离。百度和高德误差约10-35米

SELECT `CompanyName`,
       `DetailAddress`,
       PoiLatMars,
       PoiLngMars,
       st_distance(point(104048661/100000, 30683208/100000), point(104.04894, 30.683448)) * 111195 as poidistance,
       st_distance(point(104.048661, 30.683208), point(104.04894, 30.683448)) * 111195 as poidistance,
       st_distance(point(104.048935, 30.683432), point(104.04894, 30.683448)) * 111195 as baidudistance,
       st_distance(point(PoiLatMars, PoiLngMars), point(104.04894, 30.683448)) * 111195 as distance,
       (st_distance(point(PoiLatMars, PoiLngMars), point(104.04894, 30.683448))  / 0.0111) *1000 as targetdistance -- 建议
       
  FROM AddressInfo
    HAVING distance< 1000
 ORDER BY distance
 LIMIT 20;
SET @g1 = point(104.055079,30.689686), @g2 = point(104.063159,30.696356);
select st_distance (@g1, @g2) as distance
union all
select st_distance (@g1, @g2) * 111195 as distance
union all
SELECT st_distance (point (104.055079,30.689686),point(104.063159,30.696356) ) * 111195 as distance
union all
select st_distance (@g1, @g2) * 111195/(500*2) as distance;
-- 输出结果:157253.47706807632 单位:米  公里 ==千米
-- st_distance 计算的结果单位是度,需要乘111195(地球半径6371000*PI/180)是将值转化为米。


SET @g1 = point(104.055079,30.689686), @g2 = point(104.063159,30.696356);
select st_distance (@g1, @g2) as distance
union all
select st_distance (@g1, @g2) * 111195 as distance
union all
SELECT st_distance (point (104.055079,30.689686),point(104.063159,30.696356) ) * 111195 as distance
union all
select st_distance (@g1, @g2) * 111195/(500*2) as distance
union all
select st_distance (@g1, @g2) /0.0111 as distance;


 -- 输出结果:157253.47706807632 单位:米  公里 ==千米
-- st_distance 计算的结果单位是度,需要乘111195(地球半径6371000*PI/180)是将值转化为米。


public double getDistance(Point point) {

double radLat1 = Math.toRadians(this.lat);

double radLat2 = Math.toRadians(point.getLat());

double a = radLat1 - radLat2;

double b = Math.toRadians(this.lng) - Math.toRadians(point.getLng());

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)));

// 取WGS84标准参考椭球中的地球长半径(单位:m)

s = s * Constant.EARTH_RADIUS;

s = Math.round(s * 10000) / 10000;

return s;

}

<dependency>
  <groupId>org.gavaghan</groupId>
  <artifactId>geodesy</artifactId>
  <version>1.1.3</version>
</dependency>


  /**
     * 根据经纬度计算距离
     *
     * @param lon1 经度1
     * @param lat1 纬度1
     * @param lon2 经度2
     * @param lat2 纬度2
     * @return 距离 (km)
     */
    public static String getDistance(String lon1, String lat1, String lon2, String lat2) {
        GlobalCoordinates source = new GlobalCoordinates(Double.parseDouble(lat1), Double.parseDouble(lon1));
        GlobalCoordinates target = new GlobalCoordinates(Double.parseDouble(lat2), Double.parseDouble(lon2));
        GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.Sphere, source, target);
        double distance = geoCurve.getEllipsoidalDistance();
        BigDecimal distanceBig = new BigDecimal(distance).setScale(2, RoundingMode.UP);
        distanceBig = distanceBig.multiply(new BigDecimal("0.001")).setScale(2, RoundingMode.UP);
        return distanceBig.toString().concat("km");
    }

    public static void main(String[] args) {
        String lon1 = "119.6438888888889";
        String lat1 = "37.966944444444444";
        String lon2 = "119.63916666666667";
        String lat2 = "37.9675";
        System.out.println(getDistance(lon1, lat1, lon2, lat2));

    }
 
   

public static void main(String[] args) {

    System.out.println(30683448/1000000);
    System.out.println(new BigDecimal(10404894).divide(new BigDecimal("100000")));
    System.out.println(new BigDecimal(30683448).divide(new BigDecimal("100000")));
    System.out.println(getDistance("30.683208","104.048661","30.683448","104.048951"));
    System.out.println(getDistance("30.683208","104.048661",
            new BigDecimal(30683204).divide(new BigDecimal("1000000"))+"",
            new BigDecimal(104048669).divide(new BigDecimal("1000000"))+"")) ;
}