Mehr

Berechnung der Distanz zwischen Punktmengen: lat und long in R?

Berechnung der Distanz zwischen Punktmengen: lat und long in R?


Ich habe Shapefiles, die den Standort mehrerer Personen über mehrere Monate hinweg enthalten. Positionen wurden im 30-Minuten-Intervall dokumentiert. Tabellen enthalten die folgenden Datenfelder:Kragen (ID),Datum,Zeit,lat,lang,Höhe.

Ich möchte den Abstand zwischen jedem Punktpaar jedes Individuums berechnen, die im Abstand von 30 Minuten oder 1 Stunde genommen wurden? eine Anzahl von Positionen und möchten die Länge zwischen den Positionen berechnen - pro Stunde und pro Tag.

Kann jemand den Weg dorthin mit R führen?


Es hängt alles von der Genauigkeit ab, die Sie benötigen.

Ein grober Ansatz wäre das Kugelgesetz des Kosinus. Dies hat Probleme mit kleinen Entfernungen - einige sagen, dass es etwa 1 km sind, andere sagen, dass es nur wenige Meter sind.

Ein besserer Ansatz wäre die Haversine-Formel. Das funktioniert gut, berücksichtigt aber nicht, dass die Erde eigentlich keine Kugel ist, sondern ein Sphäroid.

Der "beste" Ansatz wäre Vincentys Formel.

Eine sehr schöne Umsetzung all dessen finden Sie bei R-Bloggers von Mario Pineda-Krch.

Vincentys Formel ist auch in R als distance() im SDMTools-Paket implementiert.

Ein grobes R-Skript, um zu skizzieren, wie es gemacht werden könnte, finden Sie unten.
Es sollte angemerkt werden, dass ich in R keineswegs gut bin. Das Skript ist wahrscheinlich ineffizient und redundant. Das Skript verwendet das Zeitfeld im aktuellen Zustand nicht, aber die Verwendung des lubridate-Pakets zur Interpretation der Zeit- und Datumsfelder ermöglicht es, auf anständige Weise mit der Zeitdimension zu arbeiten.
Derzeit wird davon ausgegangen, dass die Punkte in der richtigen Reihenfolge vorliegen und nur eine 'Collar ID' im Shapefile vorhanden ist. Diese Dinge können behandelt werden, indem die Dateneinträge nach Zeitfeldern und Untergruppen anhand der 'Halsband-ID' sortiert werden.

Bibliothek(SDMTools) Bibliothek(rgeos) Bibliothek(maptools) Bibliothek(schmieren) Punkte <- readShapePoints("C:/Users/mlra/Desktop/FunWithDistance/DummyBird.shp") lon <- as.vector([email protected]$lon ) lat <- as.vector([email protected]$lat) z <- as.vector([email protected]$z) time <- parse_date_time(as.vector([email protected]$time),"H!M!") #Der Flugvektor ist die Entfernung zwischen dem aktuellen Punkt und dem vorherigen Punkt. flight <- vector() #Das erste Element des Flugvektors muss Null sein, da keine Distanz zurückgelegt wurde. flight[1] <- 0 #Wir iterieren von 2 bis zur Anzahl der Beobachtungen. for(i in 2:NROW(lon)){ Vincenty <- distance(lat1=lat[i-1],lon1=lon[i-1],lat2=lat[i],lon2=lon[i]) DirectDistance <- as.numeric(Vincenty[5]) # Das fünfte Element des Ausgabeframes ist der Abstand zwischen den Punkten. #Um genauer zu sein, berücksichtigen wir auch den Höhenunterschied zwischen den Punkten AltitudeChange <- abs(z[i]-z[i-1]) if(AltitudeChange!=0){ flight[i] <- sqrt( DirectDistance^2+AltitudeChange^2) } else { flight[i] <- DirectDistance } } ResultingFrame <- data.frame(lon,lat,z,time,flight)

Nach ein wenig Bearbeitung habe ich dieses Skript verwendet und es funktioniert gut. Jetzt muss ich es nur noch für jede ID und für jeden Tag tun :-)

Bibliothek(SDMTools) Bibliothek(rgeos) Bibliothek(maptools) Bibliothek(lubridate) #points <- readShapePoints("C:/Users/mlra/Desktop/FunWithDistance/DummyBird.shp") Punkte <- tellus_2012_2013 lon <- as.vector( points$long) lat <- as.vector(points$lat) z <- as.vector(points$alt) time <- parse_date_time(as.vector(points$time),"%H:%M:%S" ) #Der Flugvektor ist die Entfernung zwischen dem aktuellen Punkt und dem vorherigen Punkt. flight <- vector() #Das erste Element des Flugvektors muss Null sein, da keine Distanz zurückgelegt wurde. flight[1] <- 0 #Wir iterieren von 2 bis zur Anzahl der Beobachtungen. for(i in 2:NROW(lon)){ Vincenty <- distance(lat1=lat[i-1],lon1=lon[i-1],lat2=lat[i],lon2=lon[i]) DirectDistance <- as.numeric(Vincenty[5]) # Das fünfte Element des Ausgabeframes ist der Abstand zwischen den Punkten. #Um genauer zu sein, berücksichtigen wir auch die Höhendifferenz zwischen den Punkten AltitudeChange <- abs(z[i]-z[i-1]) if(AltitudeChange!=0){ flight[i] <- sqrt( DirectDistance^2+AltitudeChange^2) } else { flight[i] <- DirectDistance } } ResultingFrame <- data.frame(lon,lat,z,time,flight)

R berechnet den Abstand zwischen den Koordinaten

Funktion zur Berechnung der räumlichen Distanz zwischen zwei Punkten (lat , Ich habe Punkte im langen Lat-Format geokodiert und möchte die Entfernung zwischen ihnen mit R berechnen. Dies scheint ziemlich einfach zu sein, aber ich Die Matrix m gibt die Entfernungen zwischen den Punkten an (wir teilen durch 1000, um Entfernungen in KM zu erhalten). Euklidische Distanzen. Eine andere Möglichkeit besteht darin, die Punkte zuerst auf eine Projektion zu projizieren, die Entfernungen beibehält, und dann die Entfernungen zu berechnen. Diese Option ist rechnerisch schneller, kann aber weniger genau sein, wie wir sehen werden. Wir verwenden die lokale UTM-Projektion.

[PDF] Paket 'Geodist', 2 Geodt. R-Themen dokumentiert: geodist . entlang x (wenn kein y übergeben wird), ansonsten Matrix der paarweisen Abstände zwischen allen Punkten berechnen. Berechnen Sie den geografischen Abstand zwischen zwei Punkten (Gruppen von) auf dem WGS-Ellipsoid ( lonlat=TRUE) oder auf einer Ebene ( lonlat=FALSE ). Wenn beide Sätze nicht die gleiche Anzahl von Punkten haben, wird der Abstand zwischen jedem Punktpaar angegeben. Wenn beide Mengen die gleiche Anzahl von Punkten haben, wird der Abstand zwischen jedem Punkt und dem entsprechenden Punkt in der anderen Menge angegeben, außer wenn allpairs=TRUE ist.

[PDF] Paket 'Geosphäre', Betreuer Robert J. Hijmans [email protected]> berechnet den Abstand zwischen Punkten und Polylinien und berechnet den Zielpunkt bei der Fahrt entlang einer "Rhumb-Linie" (Loxodrome), wenn ein Startpunkt gegeben ist. Um die Entfernung zwischen Adressen zu berechnen, verwenden Sie einfach den GPS-Konverter, um eine Adresse in Breiten- und Längengrad umzuwandeln, und verwenden Sie dann diesen Koordinatenentfernungsrechner, um die Entfernung zu berechnen.


Sobald wir die Entfernung für unsere Punkte erhalten haben, können wir sie mit den Koordinaten kombinieren und in einzeichnen ggplot2. Dazu erstellen wir a data.frame. Das Objekt dist ist eine Matrix aus einer Spalte, also müssen wir sie mit der Funktion as.vector( ) in einen Vektor umwandeln. Außerdem teilen wir durch 1000, um die Entfernung in Metern in km umzurechnen. Die Funktion st_coordinates( ) extrahiert die Koordinaten unserer Punkte. Für die endgültige Visualisierung verwenden wir einen Farbvektor mit der RdGy-Palette (mehr hier).


Entfernung berechnen¶

Um mit der Analyse unserer potenziellen Versandkosten zu beginnen, berechnen wir einfach die Entfernung vom Büro zu jedem Kunden.

Von dem unique_customers Datensatz, erstellen Sie a Vorbereiten Rezept.

Verwenden Sie die Berechnen Sie die Entfernung zwischen Geopunkten Prozessor auf dem ip_address_geopoint Säule.

  • Dieser Prozessor berechnet die Entfernung zwischen einem festen Geopunkt oder einer anderen Geopunktspalte. Wählen ein fester Geopunkt mit Breiten-/Längenkoordinaten von 48,8443079 bzw. 2,3685028 .

  • Wählen Sie Kilometer als Ausgabeeinheit und benennen Sie die Spalte km_to_office .

Verwendung der Analysieren Werkzeug können wir sehen, dass die km_to_office Spalte hat eine extrem rechtsschiefe Verteilung, wobei die überwiegende Mehrheit der Kunden weniger als 20 Kilometer und eine kleine Anzahl von Kunden Hunderte von Kilometern entfernt sind.


R-Version 3.4.3 (2017-11-30) Plattform: x86_64-apple-darwin15.6.0 (64-Bit) Läuft unter: macOS Sierra 10.12.6

Matrix-Produkte: Standard-BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources /lib/libRlapack.dylib

Gebietsschema: [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

angehängte Basispakete: [1] stats graphics grDevices utils datasets Methoden
[7] Basis

andere angehängte Pakete: [1] geosphere_1.5-7 ggmap_2.6.1 ggplot2_2.2.1 rgdal_1.2-15
[5] sp_1.2-5

über einen Namensraum geladen (und nicht angehängt): [1] Rcpp_0.12.13 knitr_1.17 magrittr_1.5
[4] maps_3.2.0 munsell_0.4.3 colorspace_1.3-2 [7] lattice_0.20-35 rjson_0.2.15 jpeg_0.1-8
[10] rlang_0.1.4 stringr_1.2.0 plyr_1.8.4
[13] tools_3.4.2 grid_3.4.2 gtable_0.2.0
[16] png_0.1-7 htmltools_0.3.6 yaml_2.1.14
[19] lazyeval_0.2.1 rprojroot_1.2 digest_0.6.12
[22] tibble_1.3.4 reshape2_1.4.2 mapproj_1.2-5
[25] rsconnect_0.8.5 evaluieren_0.10.1 rmarkdown_1.8
[28] stringi_1.1.6 Compiler_3.4.2 RgoogleMaps_1.4.1 [31] scales_0.5.0 backports_1.1.1 proto_1.0.0


Messen des Abstands zwischen Längengraden entlang eines Breitengrads.

Am Äquator beträgt der Abstand zwischen den Längenmeridianen 60 sm. (oder 60.113, um genau zu sein). Wenn wir uns jedoch nach Norden oder Südäquator bewegen, stellen wir fest, dass der Abstand zwischen ihnen abnimmt, wenn sie in Richtung der Pole konvergieren. Wie berechnen wir also den Abstand zwischen Längenmeridianen entlang eines bestimmten Breitengrads?

Betrachten Sie das Diagramm unten. CD sei ein Bogen von n o der Länge, gemessen entlang des Umfangs des Großkreises, der der Äquator ist.

Sei AB ein Bogen von n o des Längengrades, der entlang eines Breitengrads gemessen wird.

Sei Q der Mittelpunkt der Ebene des kleinen Kreises, der der Breitengrad ist.

Sei O der Mittelpunkt der Äquatorebene.

Dann Winkel A Q B = Winkel D O C

Mit der Formel C = 2πr können wir ableiten, dass der Umfang des Äquators gleich 2π.CO ist (da CO im Diagramm den Erdradius darstellt).

Daraus folgt, dass 1 o der Länge einem Bogen von . entspricht

⇒ CD = 2πn.CO /360 ⇒ CO = 360.CD / 2πn

AB = 2πn.BQ / 360 ⇒ BQ = 360.AB / 2πn

Winkel BOC repräsentiert den Breitengrad,

Daher Winkel QOB = 90 o – Lat.

und Winkel QBO = Lat. (alternative Winkel).

Winkel OQB = 90 o (da die Ebene von QAB rechtwinklig zur Polarachse liegt).

⇒ QBO ist ein rechtwinkliges Dreieck

Auch CO = BO = r (da r = Erdradius) ⇒Sin (90 o -Lat.) = BQ /CO

Auch Koslat. = BQ/CO (da CO = BO)

⇒ 360.AB /2πn = 360.CD Cos Lat /2πn

⇒ Distanz AB = CD (Differenz in Länge) x Cos Lat. (da 1 Seemeile entlang des Äquators 1 Bogenminute entspricht).

Um den Abstandsunterschied entlang eines Breitenkreises (Ddist) entsprechend einem Längenunterschied (Dlong) zu berechnen, haben wir daher die Formel:

Notiz. Da der Sekant der Kehrwert des Kosinus ist, kann die Formel für Dlong vereinfacht werden zu: Dlong = Ddist x Sec Lat.


Tableau-Tipp: Berechnen des Abstands zwischen zwei Punkten

Ich arbeite an einem Projekt, bei dem ich die Entfernung zwischen den Geschäften berechnen muss, um die Ressourcenzuweisung zu planen. Ziemlich cooles Zeug, das einen großen Einfluss haben könnte, wenn es sich herausstellt.
Natürlich möchte ich dies in Tableau tun, aber da ich dies noch nicht getan hatte, habe ich mich an das Tableau-Forum gewandt und dieses großartige Schritt-für-Schritt-Tutorial gefunden.

  1. Stellen Sie eine Verbindung zu Ihrer Datenquelle her, wählen Sie Single Table und dann Custom SQL
  2. Erstellen Sie einen Inner Join für eine zweite Instanz der Tabelle, bei der die Positionen der beiden Instanzen nicht gleich sind (siehe SQL-Skript in den detaillierten Anweisungen).
  3. Klicken Sie auf OK, dann Extrahieren Sie die Daten. Für mich schaue ich mir 7271 Geschäfte an, also wird die Selbstverknüpfung zu etwa 50 Millionen Datensätzen führen. Nutzen Sie die Leistungsfähigkeit der Datenextrakte von Tableau!
  4. Doppelklicken Sie auf die Felder für den Breiten- und Längengrad, um mit der Erstellung der Karte zu beginnen. Möglicherweise müssen Sie die geografische Rolle der Felder festlegen, wenn sie nicht Breiten- und Längengrad heißen.
  5. Verwenden Sie die Formel für die Großkreisentfernung, indem Sie ein berechnetes Feld namens Entfernung (oder den Namen Ihrer Wahl) erstellen.

Die Formel lautet:
3959 * ACOS
(
SIN(RADIANS([Lat])) * SIN(RADIANS([Lat2])) +
COS(RADIANS([Lat])) * COS(RADIANS([Lat2])) * COS(RADIANS([Long2]) - RADIANS([Long]))
)

HINWEIS: Um Meilen zu berechnen, verwenden Sie 3959 als erste Zahl. Verwenden Sie für Kilometer 6371 als erste Zahl (danke an Shawn Wallwork für den Kommentar)

Überlegen Sie, wie Sie andere Datenquellen zusammenführen könnten. Für mich habe ich möglicherweise Heimatpostleitzahlen für Mitarbeiter in einer anderen Datenquelle und möchte alle Filialen in einem bestimmten Umkreis jedes Mitarbeiters sehen. Die Möglichkeiten sind fast endlos!

Hier finden Sie ein Beispiel-Arbeitsbuch, wie dies alles gemacht wird. Ich weiß, dass ich diese Technik immer wieder verwenden werde.


Breiten-/Längengrad der Google Distance Matrix API

Übersicht | Entfernungsmatrix-API, Ich bin überrascht, dass Sie bei Methode 1 einen Zeitüberschreitungsfehler erhalten. Können Sie die Ausgabe bestätigen? Haben Sie einen Google Maps-API-Schlüssel erstellt? Es ist kostenlos Die Distance Matrix API ist ein Dienst, der Reiseentfernung und -zeit für eine Matrix von Start- und Zielorten bereitstellt. Die API gibt Informationen basierend auf der empfohlenen Route zwischen Start und . zurück

Entfernungsmatrix-Dienst | Maps-JavaScript-API, Ich habe das Literal 'latitiude,longitude' zum Beispiel '30.3453463,80,34534534' im Ursprungs- oder Zielfeld auf diese Weise ausprobiert: Wie verwendet man lat richtig? lang. in Ursprungs- und Zielfeldern werde ich mich in diesem Artikel nicht auf diesen Teil konzentrieren, aber ich habe die Google Geocode API verwendet, um ihre Adresse in die Breiten- und Längenkoordinaten für die Verwendung in meiner Google Distance Matrix API umzuwandeln.

Breiten- und Längengrade in eine Entfernungsmatrix einfügen, Google Map , Berechnen Sie die Luftlinie von Breiten- und Längengrad. Die einfachste Methode zum Berechnen von Entfernungen basiert auf einigen fortgeschrittenen Der Bounds-Parameter definiert die Breiten-/Längenkoordinaten der südwestlichen und nordöstlichen Ecken dieses Begrenzungsrahmens unter Verwendung eines senkrechten Strichs (|) zum Trennen der Koordinaten. Zum Beispiel a


Schau das Video: 17207 Thanvitha Reddy Latitude, longitude u0026 heat zones B,S,R,IS