拾取坐标系统 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"))+"")) ;
}