Я только что написал метод Ruby, который расширяет Random
, чтобы обеспечить это.
Предупреждение: все точки лежат внутри рамки, а не круга.
class Random
def location(lat, lng, max_dist_meters)
Это вызывается с помощью Random.new.location(mid_lat, mid_lng, dist)
. Он вернет точку, которая вероятно находится в пределах max_dist_meters
от средней точки.
max_radius = Math.sqrt((max_dist_meters ** 2) / 2.0)
Без настройки на max_radius
мы получили бы точки внутри квадрата за пределами круга (то есть в углах), где расстояние было бы больше, чем max_dist_meters
. Это ограничивает нас квадратом внутри круга, что, вероятно, больше, чем вы хотите.
lat_offset = rand(10 ** (Math.log10(max_radius / 1.11)-5))
lng_offset = rand(10 ** (Math.log10(max_radius / 1.11)-5))
1.11
и 5
взяты из здесь.
lat += [1,-1].sample * lat_offset
lng += [1,-1].sample * lng_offset
lat = [[-90, lat].max, 90].min
lng = [[-180, lng].max, 180].min
Мы, вероятно, должны обернуть здесь вместо того, чтобы просто зажать значение, исправления приветствуются.
[lat, lng]
end
end
Комментарии / очистка приветствуется!
Пример вывода здесь, который вы можете хорошо увидеть, если вставите широту/долготу здесь.
person
davetapley
schedule
26.03.2013