Ich habe einen Breiten-, Längen- und Radius von 400 m bis 1000 m und bilde eine Kugelkappe. Ich muss einen zufälligen Punkt auf dieser Kappe finden. Die Punkte müssen gleichmäßig über die Fläche verteilt sein.

Es gibt eine verwandte Frage zum Finden von zufälligen Punkten in einem Kreis. Mein erster Gedanke war, die Kappe auf eine kartesische Ebene zu projizieren und den Kreisalgorithmus zu verwenden. Der Radius ist klein genug, damit kein wichtiger Fehler auftritt.

Ich bin mir nicht sicher, ob das Projizieren und anschließende Konvertieren des Punkts in ein lat / lng die einfachste Lösung ist oder welche anderen möglichen Lösungen es für dieses Problem gibt

2
Qwertie 19 Jän. 2019 im 13:38

3 Antworten

Beste Antwort

Sie können einen zufälligen Azimut im Bereich von 0 bis 360 und einen zufälligen Abstand mit sqrt-Verteilung erzeugen, um eine gleichmäßige Verteilung zu erzielen

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

Dann erhalten Sie Geopunktkoordinaten unter Verwendung von Peilung und Entfernung, wie hier hier {{X0 }}

φ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
1
MBo 19 Jän. 2019 im 11:37

Wie auf der Wiki-Seite theta + phi = 90 erwähnt, wenn phi ein Breitengrad ist. Da r für alle Punkte auf der Kappe festgelegt ist, müssen wir nur den Wert von theta festlegen. Daher können Sie einen zufälligen Wert von 0 bis theta auswählen (bezogen auf die Obergrenze) und den Punkt anhand der erläuterten Einschränkungen definieren.

0
OmG 19 Jän. 2019 im 11:36

Bei einer Scheibe, die im Vergleich zum Radius der Kugel sehr klein ist, ist die lat-lange Projektion einfach ungefähr eine Ellipse, es sei denn, Sie befinden sich sehr nahe an den Polen.

Berechnen Sie zuerst die Strecke bei dem angegebenen Breitengrad:

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

Berechnen Sie dann den Scheibenradius in Breitengrad

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

Berechnen Sie dann einen einheitlichen zufälligen Punkt in einem Kreis

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

Ihr zufälliger Punkt auf der CD wird sein

double random_lat = (latitude*PI/180 + r*cos(a))/PI*180;
double random_longitude = (longitude*PI/180 + (r/k)*sin(a))/PI*180;
0
6502 19 Jän. 2019 im 14:35