生成随机Lat Long,偏离极点

时间:2015-09-23 09:37:17

标签: java algorithm coordinates

我使用以下代码随机派生均匀分布的Lat / Lng

public static LatLng nextLatLng(){
    return new LatLng((r.nextDouble() * -180.0)+ 90.0,
                      (r.nextDouble() * -360.0)+ 180.0);  

我使用派生的Lat / Lng来使用

检索谷歌街景
streetView.setPosition (nextLatLng(), ONE_THOUSAND_KM_RADIUS);

我注意到我的结果中有很高的百分比(~10%)将我带到了南极洲。我认为这是因为经度越接近两极,而且在南极洲的街景位置越来越少。

什么是偏好随机LatLng发生器的好算法,以便更少生成南极?

2 个答案:

答案 0 :(得分:3)

如果您想在地球表面选择随机点统一,则需要遵循Sphere Point Picking的规则。另外,如您所述,您的样品将在两极附近“聚集”。

double u = r.nextDouble();
double v = r.nextDouble();

double latitude = Math.toDegrees(Math.acos(u*2-1)) - 90;
double longitude = 360 * v - 180;

答案 1 :(得分:2)

您需要在我们的外边界处使用少量值,而在分布的中心需要更多值。

对于完美的值,您必须根据不同纬度的经度的不同长度对分布进行建模。

现在我认为一个好的起点是高斯分布,它将为您提供更接近分布中心的更多值。它绝不是完美的,可能会在中心给你太多的价值,但这是一个开始。

代码更改就像它一样容易:

public static LatLng nextLatLng(){
    return new LatLng((r.nextGaussian() * -180.0)+ 90.0,
                      (r.nextDouble() * -360.0)+ 180.0);  
}

For more information about the nextGaussian() function see the java documentation.