Gegeben ein Satz von zeigt auf eine Kugel und einen anderen Punkt auf der Kugel möchte ich die finden Punkte in das sind die nächsten (euklidische oder Großkreisentfernung).
Ich bin bereit, eine angemessene Menge an Vorberechnungen durchzuführen. Die Lösung muss genau und effizient sein (schneller als die lineare Zeit).
Antworten:
Verwenden Sie den Raumpartitionierungsansatz für die Suche nach nächsten Nachbarn .
Ein Ansatz ist beispielsweise die Verwendung von ak -d Baum auf der Oberfläche der Kugel. Sie können jeden Punkt auf der Kugel mit sphärischen Koordinaten ausdrücken : Jeder Punkt auf der Kugel hat Koordinaten( 1 , θ , ϕ ) . Wir haben also einen zweidimensionalen Raum mit Koordinaten( θ , ϕ ) . Organisieren Sie nun Ihre Punkte mit ak -d Baum, wo wir hier sind k = 2 Maße. Es gibt Standardalgorithmen für die Suche nach dem nächsten Nachbarn in ak -d Baum; heuristisch ist die erwartete LaufzeitO ( lgN.) .
Sie müssen kleine Änderungen an der Datenstruktur vornehmen, um zu berücksichtigen, dass die Koordinaten modulo "umlaufen"2 π , aber das ist nicht schwer. Die Schlüsselunterroutine, die bei der Suche nach dem nächsten Nachbarn in a verwendet wirdk -d Baum ist: gegeben einen Punkt P. und einen "rechteckigen" Bereich R. , finde die Entfernung von P. zum nächsten Punkt in R. . In Ihrem Fall die RegionR. ist [θℓ,θu] × [ϕℓ,ϕu]] dh die Menge der Punkte { ( 1 , θ , ϕ ) :θℓ≤ θ ≤θu,ϕℓ≤ ϕ ≤ϕu}} . Es ist einfach, die Entfernung von zu berechnenP. zum nächsten Punkt in R. . Auf diese Weise können Sie den Standardalgorithmus für die Suche nach dem nächsten Nachbarn in a verwendenk -d Baum.
Alternativ anstelle von ak -d Baum, Sie könnten jeden anderen Binärraum-Partitionierungsbaum verwenden oder sich metrische Bäume ansehen , obwohl ich keinen Grund habe zu erwarten, dass sie wesentlich besser sind.
quelle
Hier finden Sie Links zu zwei verschiedenen Softwarepaketen, die Ihre Frage beantworten. Es kann sich lohnen, jeden einzelnen zu untersuchen, um festzustellen, ob die von ihm verwendeten Methoden Ihren Anforderungen entsprechen:
(1) Matlab GridSphere . "Ein geodätisches Gitter ist ein gleichmäßiges Gitter über der Oberfläche einer Kugel. Der Algorithmus ist für ein von GridSphere erzeugtes Gitter optimiert und funktioniert nicht mit einem beliebigen geodätischen Gitter."
(2) DarkSkyApp Sphere-Knn .js . "Bietet schnelle Suche nach dem nächsten Nachbarn auf einer Kugel ... gut getestet und funktioniert korrekt, unabhängig davon, wo sich die Dinge auf der Erde befinden."
quelle