需求
已知地图中心点经纬度,求取指定半径的矩形四个角的经纬度
如图
已知中心点经纬度(centerLatitude,centerLongitude)和半径长度radius,求
分析
假设地球为一半径为R的表面光滑圆球体,
表面上同一经线圈上相差1"两点间的距离为 2πR/360/3600
表面上同一纬线圈上相差1"两点间的距离为 2πR×cos(纬度)/360/3600
当R取半径平均值6371km时,
地球表面上同一经线圈上相差1"两点间的距离约为30.887m
地球表面上同一纬线圈上相差1"两点间的距离约为30.887m×cos(纬度)
即我们可以求得距离中心点半径的四条经纬度线,也就是左右两条经度线和上下两条维度线
然后交叉的四个点就是我们需要的经纬度值
代码
/**
* 假设地球为一半径为R的表面光滑圆球体,
* 表面上同一经线圈上相差1"两点间的距离为 2πR/360/3600
* 表面上同一纬线圈上相差1"两点间的距离为 2πR×cos(纬度)/360/3600
* <p>
* 当R取半径平均值6371km时,
* 地球表面上同一经线圈上相差1"两点间的距离约为30.887m
* 地球表面上同一纬线圈上相差1"两点间的距离约为30.887m×cos(纬度)
*
* @param centerLatitude 中心维度
* @param centerLongitude 中心经度
* @param radius 半径距离
*/
private static void calculateLl(double centerLongitude, double centerLatitude, Double radius) {
//地球周长
Double perimeter = 2 * Math.PI * 6371000;
//纬度latitude的地球周长:centerLatitude
Double perimeter_latitude = perimeter * Math.cos(Math.PI * centerLatitude / 180);
//一米对应的经度(东西方向)1M实际度
double longitude_per_mi = 360 / perimeter_latitude;
double latitude_per_mi = 360 / perimeter;
System.out.println("经度(东西方向)1M实际度==" + longitude_per_mi);
System.out.println("纬度(南北方向)1M实际度==" + latitude_per_mi);
Double leftLo = centerLongitude - (radius * longitude_per_mi); //左边经度
Double rightLo = centerLongitude + (radius * longitude_per_mi); //右边经度
Double topLa = centerLatitude + (radius * latitude_per_mi); //上边经度
Double bottomLa = centerLatitude - (radius * latitude_per_mi); //下边经度
System.out.println("左边经度=" + leftLo);
System.out.println("右边经度" + rightLo);
System.out.println("上边经度" + topLa);
System.out.println("下边经度" + bottomLa);
}
public static void main(String[] args) {
// 中心点是深圳市,半径一公里
calculateLl(114.057939,22.543527, 1000D);
}
执行结果
经度(东西方向)1M实际度==9.737253785006766E-6
纬度(南北方向)1M实际度==8.993216059187306E-6
左边经度=114.048201746215
右边经度114.06767625378501
上边经度22.55252021605919
下边经度22.534533783940812
最后组合一下就是我们要的结果
左上=(leftLo,topLa)=(114.048201746215,22.55252021605919)
左下=(leftLo,bottomLa)=(114.048201746215,22.534533783940812)
右上=(rightLo,topLa)=(114.06767625378501,22.55252021605919)
右下=(rightLo,bottomLa)=(114.06767625378501,22.534533783940812)