Haversine
Die Haversinus-Formel ist eine in der Schifffahrt wichtige Gleichung, die Großkreisentfernungen zwischen zwei Punkten auf einer Kugel anhand ihrer Längen- und Breitengrade angibt. Sie ist ein Spezialfall einer allgemeineren Formel in der sphärischen Trigonometrie, dem Haversinus-Gesetz, das die Seiten und Winkel sphärischer Dreiecke in Beziehung setzt. Die erste Tabelle der Haversinus-Formel in englischer Sprache wurde 1805 von James Andrew veröffentlicht. Florian Cajori schreibt eine frühere Verwendung durch Jose de Mendoza y Ríos im Jahr 1801 zu. Der Begriff Haversine wurde 1835 von Prof. James Inman geprägt.
- Quelle: wikipedia-haversine
Mein Kollege Giovanni hat die Formel in einem früheren Beitrag beschrieben und eine Implementierung in Python mit NumPy für schnelle Ergebnisse programmiert. In diesem Beitrag zeige ich Ihnen, wie Sie Impala verwenden
Dies funktioniert auch in Hive. (aber das ist natürlich viel langsamer)
Impala Abfragesprache
Impala verfügt über eine Vielzahl von Mathematik-, String-, Datums- und anderen Funktionen, die Sie sich ansehen sollten. Impala unterstützt alle mathematischen Funktionen, die zur Implementierung der Formel erforderlich sind. Die Abfrage, die ich zusammengestellt habe:
Wählen Sie 2 * asin( sqrt( cos(Radiant(lat1)) * cos(Radiant(lat2)) * pow(Sünde(Radiant((einsam1 - lon2)/2)), 2) + pow(Sünde(Radiant((lat1 - lat2)/2)), 2) ) ) * 6371 Entfernung_km von meine_tabelle;
Hinweis: Für Meilen verwenden Sie 3956 anstelle von 6371.
Test
Ich habe ein Beispiel mit dem Bahnhof Hoofddorp zum Hauptbahnhof Amsterdam erstellt. In HUE können Sie Ihre Abfrageergebnisse mit Breiten- und Längenwerten auf der Karte darstellen. Ich nehme an, Sie wissen nicht, wo Amsterdam liegt, aber Hoofddorp ist bekannt für seine..., nun, jetzt wissen Sie, wo Hoofddorp und Amsterdam liegen.
- Bahnhof Hoofddorp: 52.2909264998, 4.700868765513
- Bahnhof Amsterdam: 52.3773759354, 4.896747677825
Lassen Sie uns diese Variablen in der Abfrage verwenden:
Wählen Sie 2 * asin( sqrt( cos(Radiant(52.2909264998)) * cos(Radiant(52.3773759354)) * pow(Sünde(Radiant((4.700868765513 - 4.896747677825)/2)), 2) + pow(Sünde(Radiant((52.2909264998 - 52.3773759354)/2)), 2) ) ) * 6371 Entfernung_km; -- Ergebnis: 16.415929129056497
Überprüfen Sie das Ergebnis
Mit der Funktion google-maps-calculate-distance können Sie die Entfernung zwischen zwei Punkten auf der Karte messen.
Das ist gut! Kopieren Sie die Formel und verwenden Sie sie in Impala oder Hive, um einige Geodaten zu verarbeiten.
Grüße, Alexander Bij
Unsere Ideen
Weitere Blogs
Contact




