Как создать случайные геоточки на расстоянии d от другой геоточки?

Как получить случайные гео-точки [широта/долгота в десятичном формате], размещенные в любом месте внутри круга радиусом 100 метров? В центре круга находится еще один ориентир GeoPoint. Есть ли какие-либо функции/формулы, которые это реализуют?

В основном я читаю данные GPS своего устройства Android и мне нужно генерировать случайные гео-точки вокруг устройства [в круге радиусом 100 метров с центром на моем устройстве].

Обратите внимание: в базе данных нет предварительно сохраненных гео-точек. Мне нужно создать все гео-точки на лету, как указано выше.


person aswin akhilesh    schedule 28.03.2012    source источник
comment
Я начинающий Android-программист. Я просмотрел несколько статей, касающихся минимального ограничивающего прямоугольника, географических местоположений и т. д. Я могу правильно определить местоположение пользователя через GPS, но застрял на следующем шаге, который я объяснил выше.   -  person aswin akhilesh    schedule 29.03.2012


Ответы (3)


Я только что написал метод 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

Выберите случайные точки на квадрате (т. е. пары одинаковых случайных чисел), затем отбросьте все, что не лежит в круге, вписанном в этот квадрат. Учитывая пары (x,y), точка находится внутри вашего круга, если:

(x - c_x)^2 + (y - c_y)^2 < r,

где (c_x, c_y) — центр вашего круга, а r — его радиус.

person jimw    schedule 28.03.2012
comment
У меня есть сомнения в первой части вашего ответа. Как мне получить эти точки внутри квадрата? Координаты указаны в широте/долготе, верно? Это проблема. - person aswin akhilesh; 29.03.2012
comment
Лучший способ — выбрать случайные числа через удобный интервал, а затем перевести их в соответствии с вашим географическим контекстом. Итак, если вам нужны точки в пределах 100 м от 10 lat 10 long, начните с квадрата с центром в (0,0) со стороной 200, поэтому вы выбираете пары случайных чисел между -100 и 100. Затем получите точки внутри вписанного круга, как указано выше. . Теперь у вас есть точки внутри круга радиусом 100, поэтому добавьте (x, y) к (широте, долготе), чтобы получить то, что вам нужно. - person jimw; 30.03.2012
comment
добавление широты + 100, долготы + 100 не дало бы точку, которая находится примерно, скажем, в 100 м. Это скорее указывает на место на каком-то другом континенте. Исходя из моего эксперимента, геолокация, расположенная на расстоянии 200 м, имеет смещение +- 0,000500 по широте и +- 0,000750 по долготе. - person aswin akhilesh; 30.03.2012
comment
ну нет, вам придется соответствующим образом масштабировать числа. Это не особенно просто, так как градус широты/долготы не является везде одинаковым линейным расстоянием. Вы также должны решить, хотите ли вы расстояние на земле или по прямой, и какое приближение формы Земли подходит для вашего приложения. - person jimw; 31.03.2012
comment
Правильно! Я предполагаю, что пользователь не покинет Новую Зеландию, поэтому необходимо соответствующим образом проработать масштабирование. Большое спасибо за ваш вклад! - person aswin akhilesh; 13.04.2012

Начните здесь: Создайте случайную точку внутри круга (равномерно). Затем выясните, как центрировать этот круг по опорной широте/долготе. Затем выясните, как сопоставить случайно сгенерированные точки со значениями широты/долготы. Подсказка: вы хотите добавить компоненты (скажем, x и y в вашем круге) в центр круга.

person Matt Ball    schedule 28.03.2012