Как генерировать случайные LAT & LNG внутри области, учитывая центр и радиус - PullRequest
3 голосов
/ 12 сентября 2011

В моем проекте мои пользователи могут выбрать случайное положение внутри заданной круглой области. У меня есть широта и долгота центра и радиуса: как я могу рассчитать широту и долготу случайной точки внутри данной области? (Я использую PHP, но примеры на любом языке подойдут в любом случае)

Ответы [ 2 ]

12 голосов
/ 12 сентября 2011

Вам нужно два случайно сгенерированных числа.

Думать об этом, используя прямоугольные ( декартовы ) (x, y) координаты, несколько неестественно для проблемного пространства.Учитывая радиус, несколько трудно подумать о том, как напрямую вычислить (Δx, Δy) дельту, которая попадает в круг, определяемый центром и радиусом.

Лучше использовать полярные координаты для анализа проблемы - в которой размеры (r1, Θ).Вычислить одно случайное расстояние, ограниченное радиусом.Вычислить случайный угол от 0 до 360 градусов.Затем преобразуйте (r, Θ) в декартову (Δx, Δy) , где декартовы величины просто смещены от центра вашего круга, используя простые соотношения тригонометрии.

  Δx = r * cos(Θ)
  Δy = r * sin(Θ)

Тогда ваша новая точка будет просто

  xnew = x + Δx
  ynew = y + Δy

Это работает для малых r, и в этом случае геометрия Земли может быть аппроксимирована геометрией Евклида (плоская плоскость).


Когда r становится больше, кривизна Земли означает, что евклидово приближение не соответствует реальности ситуации.В этом случае вам нужно будет использовать формулы для геодезического расстояния , которые учитывают трехмерную кривизну Земли.Это начинает иметь смысл, скажем, на расстояниях свыше 100 км.Конечно, это зависит от степени точности, которая вам нужна, но я предполагаю, что у вас есть немного места для маневра.

В 3d-геометрии вам снова нужно вычислить 2 величины - угол и расстояние.Расстояние снова ограничено вашим радиусом r, за исключением того, что в этом случае расстояние измеряется на поверхности земли и называется «расстоянием большого круга».Произвольно сгенерируйте число, меньшее или равное вашему r, для первой величины.

Соотношение геометрии большого круга

 d =  R Δσ

... утверждает, что d, расстояние большого круга, пропорционально радиусу сферы и центральному углу, представленному двумя точкамина поверхности сферы.«центральный угол» относится к углу, описываемому тремя точками с центром сферы в вершине и двумя другими точками на поверхности сферы.

В вашей задаче это d должно быть случайной величиной, связанной с вашим исходным 'r'.Расчет ad тогда дает вам центральный угол, другими словами Δσ, так как R для Земли известна (около 6371,01 км).

Это дает вам абсолютное (случайное) расстояние по большому кругу от вашего первоначального широты / долготы.Теперь вам нужно направление, количественно определенное углом, описывающее направление перемещения N / S / E / W от вашей исходной точки.Опять же, используйте случайное число 0-360 градусов, где ноль представляет собой восток, если хотите.


Изменение широты можно рассчитать как d sin(Θ), изменение долготы - d cos(Θ).Это дает расстояние по большому кругу в тех же измерениях, что и r (предположительно, в километрах), но вы хотите использовать широту / долготу, поэтому вам придется конвертировать.Получить от широтного расстояния до градусов легко: это около 111,32 км на градус независимо от широты .Преобразование из продольного расстояния в продольные градусы является более сложным, потому что продольные линии ближе друг к другу ближе к полюсам.Поэтому вам нужно использовать еще несколько сложных формул , чтобы вычислить изменение долготы, соответствующее выбранному d (большое расстояние) и углу.Помните, что вам, возможно, придется прыгнуть через барьер +/- 180 °.(Разработчики боевого самолета F22 Raptor забыли об этом, и их самолеты почти разбились при попытке пересечь 180-й меридиан .)

Из-за ошибки, которая может накапливаться в последовательных приближениях, вы будетехочу убедиться, что новая точка соответствует вашим ограничениям.Используйте формулу

Δσ  = arccos( cos(Δlat) - cos(lat1)*cos(lat2)*(1 - cos(Δlong) ) .

, где Δlat - изменение широты и т. Д.

Этодает Δσ, центральный угол между новой и старой точками широты и долготы.Убедитесь, что центральный угол, который вы здесь вычислили, совпадает с центральным углом, который вы случайно выбрали ранее.Другими словами, убедитесь, что вычисленное d (расстояние по большому кругу) между вычисленными точками совпадает с расстоянием по большому кругу, которое вы выбрали случайным образом.Если вычисленное значение d отличается от выбранного значения d, вы можете использовать числовую аппроксимацию для повышения точности, слегка изменяя широту или долготу до тех пор, пока она не будет соответствовать вашему критерию.

0 голосов
/ 12 сентября 2011

Это может быть просто сделано путем вычисления случайного пеленга (между 0 и 2 * пи) и случайного расстояния между 0 и желаемым максимальным радиусом.Затем вычислите новый (случайный) широту / долготу, используя случайный азимут / диапазон из заданной вами центральной точки широты / долготы.См. Раздел «Точка назначения с указанным расстоянием и азимутом от начальной точки» на этом веб-сайте: http://www.movable -type.co.uk / scripts / latlong.html

Примечание: формуладанные ожидают все углы в радианах (включая широты / долготы).Результирующая широта / долгота будет в радианах, так что вам нужно будет конвертировать в градусы.

...