我正在尝试在我的位置附近创建随机位置。我想要的是在围绕我的位置的200米圆内创建随机的纬度/经度对。
这是我想出的公式(在StackOverFlow的人们的帮助下):(-1和1之间的随机数)*半径+(旧经度)=旧经度范围内的新经度
(介于-1和1之间的随机数)*半径+(旧纬度)=旧纬度半径内的新纬度
问题是我的实现发生了一些奇怪的事情,因为所有随机位置都离我的位置中心太近了,看来该公式不能覆盖整个半径。
我的公式有什么问题的想法吗?
编辑以显示当前的Java实现:
public static Location getLocation(Location location, int radius) {
Random random = new Random();
// Convert radius from meters to degrees
double radiusInDegrees = radius / METERS_IN_DEGREES;
double x0 = location.getLongitude() * 1E6;
double y0 = location.getLatitude() * 1E6;
double u = random.nextInt(1001) / 1000;
double v = random.nextInt(1001) / 1000;
double w = radiusInDegrees * Math.sqrt(u);
double t = 2 * Math.PI * v;
double x = w * Math.cos(t);
double y = w * Math.sin(t);
// Adjust the x-coordinate for the shrinking of the east-west distances
double new_x = x / Math.cos(y0);
// Set the adjusted location
Location newLocation = new Location("Loc in radius");
newLocation.setLongitude(new_x + x0);
newLocation.setLatitude(y + y0);
return newLocation;
}
我不确定自己在做什么错,因为新位置是在海中创建的。
任何的想法?
random.nextInt(1001)/1000
将在大约0.1%的时间内返回大于1的值。为什么不使用random.nextDouble
或random.nextFloat
?(ii)乘x0
和y0
乘1E6
是相当神秘的;它似乎不会产生正确的结果。