5

Ich habe nach einer Lösung gesucht, kartesische Koordinaten (lat, long) zu konvertieren, die ich zu Polarkoordinaten habe, um eine Simulation zu ermöglichen, die ich will zu laufen, aber ich habe keine Fragen oder Antworten hier gefunden, um dies in R zu tun. Es gibt eine Reihe von Optionen, einschließlich der eingebauten Funktion cart2pol in Matlab, aber alle meine Daten sind in R und ich würde gerne weiterhin bequem in diesem Rahmen arbeiten.R: Konvertieren von kartesischen Koordinaten in Polarkoordinaten und dann Berechnen der Entfernung vom Ursprung

Frage:

Ich habe lat/long Koordinaten von Daten Tagging, und ich möchte diese Polarkoordinaten konvertieren (dh Sprung Größe und Winkel: http://en.wikipedia.org/wiki/Polar_coordinate_system), so dass ich dann mische oder Bootstrap sie (haven‘ t entschieden, was) etwa 1000 mal, und berechnen Sie die geradlinige Entfernung von jeder simulierten Spur vom Startpunkt. Ich habe eine echte Spur und ich bin daran interessiert herauszufinden, ob dieses Tier eine Standortaffinität aufweist, indem ich 1.000 zufällige Spuren mit den gleichen Sprunggrößen und Drehwinkeln simuliere, aber in völlig verschiedenen Ordnungen und Kombinationen. Also brauche ich 1.000 Strecken vom Ursprung, um eine Verteilung der Entfernungen zu erstellen und dann diese mit der geraden Strecke meines wahren Datensatzes zu vergleichen.

Ich bin zufrieden mit dem Bootstrapping, aber ich bin im allerersten Schritt stecken, die meine kartesischen Lat/Long-Koordinaten in Polarkoordinaten (Sprunggröße und Drehwinkel) konvertiert. Ich weiß, dass es eingebaute Funktionen gibt, um dies in anderen Programmen wie Matlab zu tun, aber ich kann keine Möglichkeit finden, es in R zu machen. Ich könnte es manuell in einer For-Schleife tun, aber wenn es ein Paket gibt Dort oder irgendeinen einfacheren Weg würde ich das lieber machen.

Idealerweise möchte ich die Daten in Polarkoordinaten umwandeln, die Simulation ausführen und dann für jede zufällige Spur einen Endpunkt als kartesische Koordinaten, lat/long, ausgeben, damit ich dann die zurückgelegte Strecke berechnen kann .

Ich habe keine Beispieldaten, da es nur ein zweispaltiger Datenrahmen von Lat und lange Koordinaten wäre.

Vielen Dank für Ihre Hilfe! Wenn es eine einfache Erklärung irgendwo auf dieser Seite oder anderen gibt, die ich vermisst habe, bitte zeig mich in diese Richtung! Ich konnte nichts finden.

Prost

+0

Sie Matlab 'cart2pol' Funktion bedeuten? – Nishanth

+0

Das 'circular' Paket könnte Sie interessieren: http://cran.r-project.org/web/packages/circular/circular.pdf –

+0

Ja, cart2pol. Ich schaue mir das runde Paket an, danke! – stewart6

Antwort

1

Da es ziemlich einfach ist, können Sie Ihre eigene Funktion schreiben. Matlab-like cart2pol Funktion in R:

cart2pol <- function(x, y) 
{ 
    r <- sqrt(x^2 + y^2) 
    t <- atan(y/x) 

    c(r,t) 
} 
+2

Dies berücksichtigt nicht Winkel zwischen 90 und 270 Grad (sie werden falsch mit Ihrem Code kommen) –

+0

In der realen Welt Achse sind gekippt und der Ursprung ist nicht 0,0 – skan

7

Für xy-Koordinaten, die in den gleichen Einheiten (zB Meter statt Breitengrade und Längengrade), können Sie diese Funktion verwenden, um einen data.frame zu bekommen, Sprunggrößen und Drehwinkel (in Grad).

getSteps <- function(x,y) { 
    d <- diff(complex(real = x, imaginary = y)) 
    data.frame(size = Mod(d), 
       angle = c(NA, diff(Arg(d)) %% (2*pi)) * 360/(2*pi)) 
} 

## Try it out 
set.seed(1) 
x <- rnorm(10) 
y <- rnorm(10) 
getSteps(x, y) 
#  size  angle 
# 1 1.3838360  NA 
# 2 1.4356900 278.93771 
# 3 2.9066189 101.98625 
# 4 3.5714584 144.00231 
# 5 1.6404354 114.73369 
# 6 1.3082132 135.76778 
# 7 0.9922699 74.09479 
# 8 0.2036045 141.67541 
# 9 0.9100189 337.43632 

## A plot helps check that this works 
plot(x, y, type = "n", asp = 1) 
text(x, y, labels = 1:10) 

enter image description here

+0

Hallo Josh-das hat sich gut für die Umwandlung meiner lat/lang zeigt auf Schrittgrößen und Winkel. Lat- und Long-Koordinaten haben ungefähr den gleichen Abstand zwischen den Graden am Äquator, also sind sie im Wesentlichen in den gleichen Einheiten. Wie würden Sie zurück zu kartesischen Koordinaten aus einem Datenrahmen von Größen und Drehwinkeln konvertieren (dh nachdem ich sie randomize?) – stewart6

+0

@ stewart6 - Um zurück zu konvertieren, konvertieren Sie Ihre Winkel von Grad zurück in Radiant (durch ** dividieren ** durch '360/(2 * pi)', und dann 'sin()' und 'cos()' verwenden, um von Polarkoordinaten zu xy-Koordinaten zu wechseln. Ich überlasse das als eine gute Übung für dich;) Außerdem, außer du wirklich arbeiten in der Nähe des Äquators, achten Sie darauf, nicht anzunehmen, dass Grad von lat/long gleichwertig sind. Wo ich wohne, um 45 Grad, sind die Längengrade nur etwa 70% der Längengrade. –

+0

Hallo Josh, ich habe heute Morgen an der Implementierung Ihrer Lösung gearbeitet und es geschafft, vernünftige Ergebnisse zu erzielen, aber ich glaube dass aus irgendeinem Grund die Daten, die es ausspuckt, falsch sind ... Ich habe sie unten genauer beschrieben. Ich würde mich über Vorschläge freuen! – stewart6

1

I Josh O'Brien-Code verwendet und bekam, was vernünftige Sprünge und zu sein scheinen Winkel-sie zusammenpassen ziemlich gut die grobe Entfernung Anglotzen und zwischen den Punkten Überschrift. Ich benutzte dann eine Formel aus seinen Vorschlägen, um eine Funktion zu erstellen, um die Polarkoordinaten zurück in kartesische Koordinaten zu bringen, und eine for-Schleife, um die Funktion auf den Datenrahmen aller Polarkoordinaten anzuwenden. Die Schleifen scheinen zu funktionieren, und die Ausgaben sind in den richtigen Einheiten, aber ich glaube nicht, dass die Werte, die sie ausgibt, meinen Daten entsprechen. Also habe ich entweder eine Fehlberechnung mit meiner Formel gemacht, oder es passiert etwas anderes.Details siehe unten:

Hier ist der Kopf meines lat lange Daten:

> head(Tag1SSM[,3:4]) 
     lon  lat 
1 130.7940 -2.647957 
2 130.7873 -2.602994 
3 130.7697 -2.565903 
4 130.7579 -2.520757 
5 130.6911 -2.704841 
6 130.7301 -2.752182 

Wenn ich den vollständigen Datensatz plotten nur als Werte, erhalte ich diese Handlung: Lat-Long Plot

, die genau gleich aussieht als würde ich dies unter Verwendung irgendeines räumlichen oder Mapping-Pakets in R zeichnen.

Dann habe ich Joshs Funktion verwendet, um meine Daten in Polarkoordinaten umzuwandeln:

x<-Tag1SSM$lon 
y<-Tag1SSM$lat 

getSteps <- function(x,y) { 
    d <- diff(complex(real = x, imaginary = y)) 
    data.frame(size = Mod(d), 
      angle = c(NA, diff(Arg(d)) %% (2*pi)) * 360/(2*pi)) 
} 

, die produziert die folgenden Polarkoordinaten in geeigneter Weise:

> polcoords<-getSteps(x,y) 
> head(polcoords) 
     size  angle 
1 0.04545627  NA 
2 0.04103718 16.88852 
3 0.04667590 349.38153 
4 0.19581350 145.35439 
5 0.06130271 59.37629 
6 0.01619242 31.86359 

Auch diese richtig aussehen zu mir, und stimmen gut mit den tatsächlichen Winkeln und relativen Abstände zwischen den Punkten. So weit, ist es gut.

Jetzt möchte ich diese zurück in kartesische Koordinaten konvertieren und berechnen Sie einen euklidischen Abstand vom Ursprung. Diese müssen nicht im wahren lat/long sein, da ich sie nur untereinander vergleiche. Ich bin froh, dass der Ursprung als (0,0) und die Entfernungen in x-, y-Werten anstelle von Kilometern oder ähnlichem angegeben werden.

Also, habe ich diese Funktion mit Joshs Hilfe und ein bisschen Web-Suche:

polar2cart<-function(x,y,size,angle){ 

    #convert degrees to radians (dividing by 360/2*pi, or multiplying by pi/180) 
    angle=angle*pi/180 
    if(is.na(x)) {x=0} #this is for the purpose of the for loop below 
    if(is.na(y)) {y=0} 
    newx<-x+size*sin(angle) ##X #this is how you convert back to cartesian coordinates 
    newy<-y+size*cos(angle) ##Y 
    return(c("x"=newx,"y"=newy)) #output the new x and y coordinates 
} 

Und dann steckte es in dieser for-Schleife:

u<-polcoords$size 
v<-polcoords$angle 
n<-162 #I want 162 new coordinates, starting from 0 
N<-cbind(rep(NA,163),rep(NA,163)) #need to make 163 rows, though, for i+1 command below— first row will be NA 
for(i in 1:n){ 
    jump<-polar2cart(N[i,1],N[i,2],u[i+1],v[i+1]) #use polar2cart function above, jump from previous coordinate in N vector 
    N[i+1,1]<-jump[1] #N[1,] will be NA's which sets the starting point to 0,0—new coords are then calculated from each previous N entry 
    N[i+1,2]<-jump[2] 
    Dist<-sqrt((N[163,1]^2)+(N[163,2]^2)) 
} 

Und dann kann ich einen Blick bei N, mit meinem neuen Koordinaten auf der Grundlage dieser Sprünge:

> N 
       [,1]  [,2] 
    [1,]   NA   NA 
    [2,] 0.011921732 0.03926732 
    [3,] 0.003320851 0.08514394 
    [4,] 0.114640605 -0.07594871 
    [5,] 0.167393509 -0.04472125 
    [6,] 0.175941466 -0.03096891 

Dies ist, wo das Problem ist, ... die x, y-Koordinaten von N g und zwar progressiv größer - es gibt ein bisschen Variation dort, aber wenn Sie die Liste nach unten scrollen, geht y von 0,39 bis 11,133, mit sehr wenigen Rückwärtsschritten zu niedrigeren Werten. Dies ist nicht was meine lat/long Daten tun, und wenn ich den Cart-> Pol und Pol-> Cart richtig berechnet habe, sollten diese neuen Werte von N mit meinen Lat/Long Daten übereinstimmen, nur in einem anderen Koordinatensystem. Dies ist, was die N-Werte aussehen aufgetragen:

back-converted cartesian coordinates

die Mitnichten gleichen ... Der letzte Punkt in N ist der entfernteste Punkt vom Ursprung, während in meinen lat/long-Daten, die letzten Punkt ist tatsächlich ziemlich nah an dem ersten Punkt, und definitiv nicht der am weitesten entfernte Punkt. Ich denke, dass das Problem in meiner Umwandlung von Polarkoordinaten zurück zu kartesischen Koordinaten sein muss, aber ich bin nicht sicher, wie man es repariert ...

Jede Hilfe bei der Lösung dieses Problems wäre sehr zu begrüßen!

Prost

+0

Gute Arbeit. Entschuldige, hab nicht viel Zeit, aber hier kommt was zuerst auf mich zu. Ich würde erwarten, etwas wie 'v <- cumsum (polcoords $ angle) 'anstelle von' v <- polcoords $ angle' zu sehen (nachdem man 'v [is.na (v)] <- 0 'gemacht hat, um loszuwerden Dann als). Die Peilung jedes Sprunges ist schließlich eine Anhäufung aller vorherigen Drehwinkel, und ich glaube nicht, dass dein Code dies noch widerspiegelt. Ich werde es eine Weile nicht mehr sehen können, also hoffe ich, dass ich zufällig über den (einzigen) Fehler gestolpert bin. –

+0

Eine weitere Idee - während Sie diesen Code konstruieren, möchten Sie vielleicht mit einer sehr einfachen Reihe von Sprüngen spielen. Ich würde wahrscheinlich einen Datenrahmen konstruieren und verwenden, der aus 4 Rechtwinkelsprüngen und einigen geraden Sprüngen besteht. Das macht es einfacher zu sehen, wo ein Fehler in unserem Code liegt. –

+0

Hallo Josh, danke für die Vorschläge. Ich werde sehen, was ich daraus machen kann und hier eine Lösung oder weitere Probleme veröffentlichen. Ihre Hilfe wird sehr geschätzt! – stewart6

0

Eine weitere Option nur in Grad

pol2car = function(angle, dist){ 
    co = dist*sin(angle) 
    ca = dist*cos(angle) 
    return(list(x=ca, y=co)) 
} 
pol2car(angle = 45, dist = sqrt(2))