Найти равномерно распределенные случайные точки на сферической крышке - PullRequest
0 голосов
/ 19 января 2019

У меня широта, долгота и радиус 400м-1000м, образуя сферическую крышку .Мне нужно найти случайную точку на этой кепке.Точки должны быть равномерно распределены по области.

Существует связанный с этим вопрос о нахождении случайных точек в круге .Моей первой мыслью было спроецировать кепку на декартову плоскость и использовать алгоритм круга.Радиус достаточно мал, чтобы не было важного уровня ошибки.

Я не уверен, является ли простое решение проецированием и последующим преобразованием точки обратно в широту / долготу или какие другие возможные решения существуютк этой проблеме

Ответы [ 3 ]

0 голосов
/ 19 января 2019

Вы можете сгенерировать случайный азимут в диапазоне 0..360 и случайное расстояние с sqrt-распределением, чтобы обеспечить равномерное распределение

d = maxR * Sqrt(random(0..1))
theta = random(0..1) * 2 * Pi

Затем получить координаты геопозиции с использованием азимута и расстояния, как описано здесь (Destination point given distance and bearing from start point)

φ2 = asin( sin φ1 ⋅ cos δ + cos φ1 ⋅ sin δ ⋅ cos θ )
λ2 = λ1 + atan2( sin θ ⋅ sin δ ⋅ cos φ1, cos δ − sin φ1 ⋅ sin φ2 )

where   φ is latitude, λ is longitude, θ is the bearing
(clockwise from north), δ is the angular distance d/R; 
d being the distance travelled, R the earth’s radius
0 голосов
/ 19 января 2019

Для диска, очень маленького по сравнению с радиусом сферы, проекция по длине широты будет просто приблизительно эллипсом, кроме случаев, когда вы очень близки к полюсам.

Сначала вычислите растяжение на заданной широте:

double k = cos(latitude * PI / 180);

затем вычислите радиус диска в градусах широты

// A latitude arc-second is 30.87 meters
double R = radius / 30.87 / 3600 * PI / 180;

затем вычислим равномерную случайную точку в круге

double a = random() * 2 * PI;
double r = R * sqrt(random());

ваша случайная точка на диске будет

double random_lat = (latitude*PI/180 + r*cos(a))/PI*180;
double random_longitude = (longitude*PI/180 + (r/k)*sin(a))/PI*180;
0 голосов
/ 19 января 2019

Как упомянуто на вики-странице theta + phi = 90, если phi - широта. С другой стороны, поскольку r фиксировано для всех точек на кепке, нам просто нужно установить значение theta. Следовательно, вы можете выбрать случайное значение от 0 до theta значения (связанного с ограничением) и определить точку с помощью объясненных ограничений.

...