Estou tentando criar locais aleatórios próximos ao meu local. O que eu quero é criar pares aleatórios de latitude / longitude dentro de um círculo de 200 metros ao redor da minha localização.
Esta é a fórmula que eu criei (com a ajuda de pessoas no StackOverFlow): (Número aleatório entre -1 e 1) * raio + (longitude antiga) = nova longitude dentro do raio da longitude antiga
(Número aleatório entre -1 e 1) * raio + (latitude antiga) = nova latitude dentro do raio da latitude antiga
O problema é que algo estranho está acontecendo com minha implementação, porque todos os locais aleatórios estão muito próximos do meu centro de localização, parece que a fórmula não cobre todo o raio.
Alguma idéia do que poderia estar errado com a minha fórmula?
Editado para mostrar a implementação java atual:
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;
}
Não tenho certeza do que estou fazendo de errado, porque os novos locais são criados no meio do mar.
Qualquer ideia?
random.nextInt(1001)/1000
retornará um valor maior que 1 em cerca de 0,1% das vezes. Por que você não está usando random.nextDouble
ou random.nextFloat
? (ii) Multiplicar x0
e y0
por 1E6
é bastante misterioso; não parece produzir resultados corretos.