2014-09-29 12 views
5

Ich habe ein Shapefile von Ländern der Welt, heruntergeladen von here. Ich kann es in R plottenPlotten Weltkarte in orthographische Projektion gibt "nicht endliche Punkte"

countries <- readOGR("shp","TM_WORLD_BORDERS-0.3",encoding="UTF-8",stringsAsFactors=F) 
par(mar=c(0,0,0,0),bg=rgb(0.3,0.4,1)) 
plot(countries,col=rgb(1,0.8,0.4)) 
mit

Jetzt möchte ich es in Orthogonalprojektion plotten (Erde aus dem Weltraum zu sehen ist), so versuche ich,

countries <- spTransform(countries,CRS("+proj=ortho +lat_0=-10 +lon_0=-60")) 

ich auch mit dem x_0 und Y_0 gespielt Parameter (wie here angegeben), aber ich habe immer den Fehler:

non finite transformation detected: 
[1] 45.08332 39.76804  Inf  Inf 
Erro em .spTransform_Polygon(input[[i]], to_args = to_args, from_args = from_args, : 
    failure in Polygons 3 Polygon 1 points 1 
Além disso: Mensagens de aviso perdidas: 
In .spTransform_Polygon(input[[i]], to_args = to_args, from_args = from_args, : 
    108 projected point(s) not finite 

manchmal im 3. Polygon, manchmal im 7.. Woher kommen diese "Inf"? Ich muss einen Parameter ändern? Ich möchte, dass die Karte wie diese

orthographic projection

aber über Südamerika zentriert plotten. Danke für Ihre Hilfe!

+1

Sie versuchen, um alle Koordinaten von -180 bis 180 und von -90 bis 90 zu projizieren. Aber es ist nicht möglich mit der Art der Projektion, die Sie verwenden möchten. Versuchen Sie zuerst, auf die Region zuzuschneiden, die projiziert werden soll. Und ich empfehle Ihnen dringend, etwas Literatur über geographische Projektionen zu lesen. –

+0

Siehe auch: http://en.wikipedia.org/wiki/Orthographic_projection_in_cartography#Mathematics für eine Faustregel, wo geerntet werden soll. – plannapus

+0

Danke, Pascal. Ich möchte die ganze Halbwelt darstellen, genau wie das Bild oben. Ich dachte, ich würde nur das zentrale lat/long benötigen, und der Algorithmus würde wo nötig schneiden. – Rodrigo

Antwort

4

Geben Sie das maps Paket einen Versuch. Es gibt eine Warnung über die Punkte, die nicht projiziert werden können, aber es gibt keinen Fehler und schließt den Prozess. Mit ein wenig Gefummel, nämlich die Füllfarbe für den Ozean Einstellung (this Antwort geholfen, dieses Problem zu lösen), konnte ich die Karte, die Sie mit ein paar Zeilen an emulieren:

library(maps) 

## start plot & extract coordinates from orthographic map 
o <- c(-10,-60,0) # oreantation 
xy <- map("world",proj="orthographic", orientation=o, bg="black") 
xy <- na.omit(data.frame(do.call(cbind, xy[c("x","y")]))) 

## draw a circle around the points for coloring the ocean 
polygon(max(xy$x)*sin(seq(0,2*pi,length.out=100)),max(xy$y)*cos(seq(0,2*pi,length.out=100)), 
     col="blue4", border=rgb(1,1,1,0.5), lwd=2) 

## overlay world map 
colRamp <- colorRampPalette(c("lemonchiffon", "orangered")) 
map("world",proj="orthographic", orientation=o, 
    fill=TRUE, col=colRamp(5), add=TRUE) 

enter image description here

+0

Danke Paul, es funktioniert. Ich mache es für einen Einsatz und gebe den Standort einer anderen, größeren Karte an. Wie kann ich die Begrenzungsbox der anderen Karte als Rechteck über diesen Globus projizieren? (Es wird kein Rechteck, sondern ein gekrümmtes Rechteck ...) Ich könnte es mit mapproject und rect machen, aber dann bekomme ich ein nicht gekrümmtes Rechteck. – Rodrigo

+1

Es gibt wahrscheinlich einfachere Möglichkeiten, aber ich würde manuell die Koordinaten eines Rechtecks ​​erstellen, es mit 'mapproject' projizieren und es mit' polygon' hinzufügen: 'x <- seq (-60, -30, length.out = 100) ; y <- seq (-30, -10, length.out = 100); x <- c (x, rep (x [Länge (x)], Länge (x)), rev (x), rep (x [1], Länge (x))); y <- c (rep (y [1], Länge (y)), y, rep (y [Länge (y)], Länge (y)), rev (y)); xy <- mapproject (x, y, proj = "orthographisch", Orientierung = o); Polygon (xy $ x, xy $ y) ' –

+0

Ja, natürlich, wie habe ich nicht daran gedacht? ;) Danke noch einmal! – Rodrigo

Verwandte Themen