地理圆圈到矩形坐标

时间:2018-01-25 09:58:25

标签: java google-maps latitude-longitude

考虑到输入,中心纬度,中心经度和以公里为单位的半径,我想得到包含这个圆的矩形的坐标(东北和西南纬度/ lng)。

我应该自己编写方法吗?即使我害怕不考虑某些事情,因为我的数学生锈了。或者我可以找到一个现成的java实现?我的项目中有谷歌地图sdk,但我找不到任何有用的东西。

1 个答案:

答案 0 :(得分:4)

我认为你的方形半径远小于地球的半径(6371 km) 这样你就可以安全地忽略地球的曲率。

然后数学很容易:

// center of square
double latitudeCenter = ...;     // in degrees
double longitudeCenter = ...;    // in degrees

double radius = ...;             // in km
double RADIUS_EARTH = 6371;      // in km

// north-east corner of square
double latitudeNE  = latitudeCenter  + Math.toDegrees(radius / RADIUS_EARTH);
double longitudeNE = longitudeCenter + Math.toDegrees(radius / RADIUS_EARTH / Math.cos(Math.toRadians(latitudeCenter)));

// south-west corner of square
double latitudeSW  = latitudeCenter  - Math.toDegrees(radius / RADIUS_EARTH);
double longitudeSW = longitudeCenter - Math.toDegrees(radius / RADIUS_EARTH / Math.cos(Math.toRadians(latitudeCenter))); 

示例:

位于48.00,11.00和半径10 km的中心(纬度,经度) 将48.09,11.13处的NE-corner(lat,lon)和47.91,10.87处的SW-corner(lat,lon)给予NE-corner(lat,lon)。

以下是LatLng的使用方法 和google-maps-services-java API的Bounds

public static final double RADIUS_EARTH = 6371;

public static Bounds boundsOfCircle(LatLng center, double radius) {
    Bounds bounds = new Bounds();
    double deltaLat = Math.toDegrees(radius / RADIUS_EARTH);
    double deltaLng = Math.toDegrees(radius / RADIUS_EARTH / Math.cos(Math.toRadians(center.lat)));
    bounds.northeast = new LatLng(center.lat + deltaLat, center.lng + deltaLng);
    bounds.southwest = new LatLng(center.lat - deltaLat, center.lng - deltaLng);
    return bounds;
}