【GIS - 地理信息系统】经纬度计算 ( 经度、纬度概念

【GIS - 地理信息系统】经纬度计算 ( 经度、纬度概念

一、经度、纬度概念经度 Longitude , 本初子午线 位置 为 0 度经线 , 相当于水平 x 轴 的坐标 , 经度的取值范围 -180 度 ~ +180 度 ;

纬度 Latitude , 相当于 垂直 y 轴 的坐标 , 纬度的取值范围 -90 度 ~ + 90 度 ;

西经 和 南纬 是负数 ;

经度使用 W ( 东经 ) 和 E ( 西经 ) 表示 , 纬度 使用 N ( 北纬 ) 和 S ( 南纬 ) 表示 ,

北京 中心 坐标为 :

北纬 39°54′20″ , 东经 116°25′29″N 39°54′20″ , W 116°25′29″二、地球周长计算1、地球半径、周长计算地球的半径为 :

6371000 米 = 6371 千米 ;

地球的周长为 :

2 \pi \times 6371000 = 40030173 米2、地球经线周长计算经线 周长 计算 :

2 \pi \times 6371000 = 40030173 米经线 的 周长 , 就是 地球的 周长 ;

经线 是 南北走向的 , 任意一个经线 都要经过 南极 和 北极 ;

3、地球纬线周长计算纬线 周长 计算 :

2 \pi \times 6371000 \times \cos\alpha 米常用的 38 度 纬度 的地球周长为 :

2 \pi \times 6371000 \times \cos 38 = 31544206 米纬线 是 东西走向的 , 不同 纬度 的 纬线 长度是不同的 ,

赤道附近的 纬线最长 , 等于地球周长 ;南北极位置的 纬线最短 , 为 0 ;上述公式中

\alpha 是纬度 度数 ;

纬度 的取值范围 -90 度 ~ + 90 度 , 函数曲线如下图所示 :

在赤道位置 , 纬度为 0 度 , \cos 0 = 1 ;

在 南极 / 北极 位置 , 纬度为 90 度 , \cos 90 = 0 ;

三、经纬度相关计算1、经纬度坐标距离计算公式经纬度坐标距离计算公式 :

S = 2 \arcsin \sqrt{ \sin^2 \frac{a}{2} + \cos Lat1 \times \cos Lat2 \times \sin^2 \frac{b}{2}} \times 6378.137 两个坐标点分别为 :

( Lat1 , Lng1 ) , Lat1 是 坐标点一 纬度 , Lng1 是 经度 ;

( Lat2 , Lng2 ) , Lat2 是 坐标点一 纬度 , Lng2 是 经度 ;

a = Lat1 - Lat2 , 是 两个坐标点的 纬度之差 ;

b = Lng1 - Lng2 , 是 两个坐标点的 经度之差 ;

地球半径为 6378.137 千米 ;

使用代码实现上述逻辑 :

代码语言:javascript代码运行次数:0运行复制public class LocationUtils {

private static final double EARTH_RADIUS = 6371; // 地球平均半径,单位为公里

public static double getDistance(double lat1, double lon1, double lat2, double lon2) {

double radLat1 = Math.toRadians(lat1);

double radLat2 = Math.toRadians(lat2);

double a = radLat1 - radLat2;

double b = Math.toRadians(lon1) - Math.toRadians(lon2);

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

s = s * EARTH_RADIUS;

s = Math.round(s * 1000) / 1000.0; // 保留三位小数

return s;

}

}2、经纬度与实际距离换算1 米对应经度经度 ( 东西方向 ) 上 1 米 , 对应的度数是由当前的纬度决定的 ;

不同的 纬度 上 , 纬线 ( 东西方向 ) 的周长不一样 ;

赤道上 1 米对应的经度计算 :

赤道上 纬度为 0 度 , 东西方向的 纬线周长为 40030173 米 , 是最长的 ;

对应的计算过程如下 :

360° / 40030173 = 0.00000899°38° 纬度 1 米对应的经度计算 :

38° 纬度 , 东西方向的 纬线周长为 31544206 米 ;

对应的计算过程如下 :

360° / 31544206 = 0.00001141°1 米对应纬度纬度 ( 南北方向 ) 上 1 米 , 对应的度数是固定的 ;

值为

360° / 40030173 = 0.00000899°3、实际距离与经纬度换算1 度经度对应东西距离1 度经度对应东西距离 :

赤道位置的公式为 :

\frac{2\pi R}{360} = \frac{2\pi \times 6731000}{360} = 111194.926 644 558 737 米 R 为地球半径 ;

地球周长为 2\pi R 东西方向经度范围是 360 度 , 一度对应的距离就是周长处于 360 ;

非赤道位置的公式 :

\frac{2\pi R}{360} \times \cos纬度 = \frac{2\pi \times 6731000}{360} \times \cos纬度\approx 111194.926 644 558 737 \times \cos纬度 米38 度纬度位置 1 度经度对应的东西距离为 :

\frac{2\pi R}{360} \times \cos 38° = \frac{2\pi \times 6731000}{360} \times \cos 38°\approx 111194.926 644 558 737 \times 0.788010753607 米\approx 87622.7979425 米1 度纬度对应南北距离1 度纬度对应南北距离 公式 :

\frac{2\pi R}{360} \times \cos纬度 = \frac{2\pi \times 6731000}{360} \times \cos纬度\approx 111194.926 644 558 737 \times \cos纬度 米四、相关代码实现1、计算两个经纬度之间的距离代码语言:javascript代码运行次数:0运行复制public class LocationUtils {

private static final double EARTH_RADIUS = 6371; // 地球平均半径,单位为公里

public static double getDistance(double lat1, double lon1, double lat2, double lon2) {

double radLat1 = Math.toRadians(lat1);

double radLat2 = Math.toRadians(lat2);

double a = radLat1 - radLat2;

double b = Math.toRadians(lon1) - Math.toRadians(lon2);

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

s = s * EARTH_RADIUS;

s = Math.round(s * 1000) / 1000.0; // 保留三位小数

return s;

}

}2、距离与经纬度之间换算代码语言:javascript代码运行次数:0运行复制public class LocationUtils {

public static final double EARTH_RADIUS = 6371.393;

public static Double km2Degree(Double km){

return (180 / EARTH_RADIUS / Math.PI) * km;

}

public static Double degree2Km(Double degree){

return EARTH_RADIUS / 180 * Math.PI * degree;

}

}3、弧度与角度计算代码语言:javascript代码运行次数:0运行复制public class LocationUtils {

/**

* 将角度转换为弧度

* @param degree

* @return

*/

public static double deg2rad(double degree) {

return degree / 180 * Math.PI;

}

/**

* 将弧度转换为角度

* @param radian

* @return

*/

public static double rad2deg(double radian) {

return radian * 180 / Math.PI;

}

}参考链接 :

https://blog.csdn.net/qq_25598453/article/details/90446387https://codeleading.com/article/54392199618/https://blog.csdn.net/weixin_44248637/article/details/128467003https://blog.csdn.net/qq_42221334/article/details/81479800

相关推荐

你需要了解的远程登录协议——Telnet
注册送365体育平台

你需要了解的远程登录协议——Telnet

🕒 06-28 👁️ 4261
wuli涛涛是什么意思什么梗 wuli涛涛说的是黄子韬
注册送365体育平台

wuli涛涛是什么意思什么梗 wuli涛涛说的是黄子韬

🕒 06-27 👁️ 4024
为什么都不用长城机油?长城机油的优缺点
beat365登陆不了

为什么都不用长城机油?长城机油的优缺点

🕒 06-28 👁️ 9306