2012-07-15 9 views
6

Làm thế nào để ngăn chặn việc đa giác các quốc gia bị cắt theo các dự báo khác nhau?Ngăn chặn ánh xạ một phần đường bờ biển

Trong ví dụ sau, tôi muốn thực hiện bản đồ chiếu lập thể của Nam Cực bao gồm vĩ độ < -45 ° S. Bằng cách đặt giới hạn y của tôi thành phạm vi này, vùng ô là chính xác, nhưng sau đó các đa giác của quốc gia cũng bị cắt tại các giới hạn này. Có cách nào để có đường bờ biển được vẽ ở các cạnh của khu vực ô không?

Cảm ơn bạn đã tư vấn.

library(maps) 
library(mapproj) 

ylim=c(-90,-45) 
orientation=c(-90, 0, 0) 

x11() 
par(mar=c(1,1,1,1)) 
m <- map("world", plot=FALSE) 
map("world",project="stereographic", orientation=orientation, ylim=ylim) 
map.grid(m, nx=18,ny=18, col=8) 
box() 

enter image description here

Trả lời

7

Vấn đề là bởi vì bạn đang băng việc xac định một max ylim của -45, và các dữ liệu đang được cắt chính xác ở vĩ độ đó. Rõ ràng ranh giới thực tế của cốt truyện được tính toán theo một cách riêng biệt, có thể là do một số giả định thận trọng dựa trên các giới hạn dự kiến ​​(nhưng tôi không biết gì về việc không khám phá mã nguồn).

Bạn có thể tránh vấn đề bằng cách thiết lập một âm mưu giả mà không vẽ đường bờ biển, sau đó thêm các dữ liệu trên đầu trang với một tăng ylim:

library(maps) 
library(mapproj) 

ylim = c(-90,-45) 
orientation=c(-90, 0, 0) 

x11() 
par(mar=c(1,1,1,1)) 
m <- map("world", plot=FALSE) 
map("world",project="stereographic", orientation=orientation, ylim=ylim, col = "transparent") 
map("world",project="stereographic", orientation=orientation, ylim=ylim + c(-5, 5), add = TRUE) 
map.grid(m, nx=18,ny=18, col=8) 
box() 

BTW, chiến lược này sẽ không làm việc cho tất cả các dự đoán vì một số sẽ ngụ ý chồng lấp cho một số giới hạn dữ liệu, nhưng Polar Stereographic chỉ mở rộng ra khỏi trung tâm nên không có vấn đề như vậy ở đây.

Ngoài ra, sẽ có một cách cập nhật hơn để thực hiện việc này với maptools, rgdal và rgeos cho phép bạn sử dụng chia sẻ dữ liệu một phép chiếu Lập thể PROJ.4 phù hợp (nhưng tôi không tìm ra được đoạn cắt bậc thang). Các dự báo trong mapproj là "hình dạng chỉ" và nó sẽ là một chút công việc để có được dữ liệu khác vào những người, afaik.

+0

Tuyệt vời - cảm ơn bạn rất nhiều. Hoạt động tuyệt vời! –

3

Tôi nhận ra rằng một tùy chọn khác sẽ là xác định các giới hạn đối với vùng ô chứ không phải bản đồ. Điều này có thể cung cấp một số tính linh hoạt trong việc xác định khu vực ô chính xác (ví dụ: xaxs = "i" và yaxs = "i"). Bạn cũng đảm bảo rằng tất cả các đa giác sẽ được vẽ - trong ví dụ của @mdsumner, Úc bị thiếu và các giới hạn y sẽ cần được mở rộng để vẽ chính xác đa giác của nó.

orientation=c(-90, 0, 0) 

ylim <- c(mapproject(x=-180,y=-45, project="stereographic", orientation=orientation)$y, mapproject(x=0,y=-45, project="stereographic", orientation=orientation)$y) 
xlim <- c(mapproject(x=-90,y=-45, project="stereographic", orientation=orientation)$x, mapproject(x=90,y=-45, project="stereographic", orientation=orientation)$x) 

x11(width=6,height=6) 
par(mar=c(1,1,1,1)) 
plot(0,0, t="n", ylim=ylim, xlim=xlim, xaxs="i", yaxs="i", xlab="", ylab="", xaxt="n", yaxt="n") 
map("world",project="stereographic", orientation=orientation, add=TRUE) 
map.grid(nx=18,ny=18, col=8) 
box() 
3

Một cách khác là sử dụng phép chiếu PROJ.4 thực tế và sử dụng tập dữ liệu trong gói maptools. Đây là mã, vẫn còn một vấn đề ở lục địa Nam Cực, nơi đường bờ biển gặp cực tại -90 (hơi khó chịu một chút, và sẽ tìm ra tọa độ đó và loại bỏ nó khỏi kết quả biến đổi, hoặc chạy qua một công cụ tô pô để tìm mảnh).

library(maptools) 
data(wrld_simpl) 
xrange <- c(-180, 180, 0, 0) 
yrange <- c(-90, -45, -90, -45) 

stere <- "+proj=stere +lat_0=-90 +lat_ts=-71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs" 

library(rgdal) 

w <- spTransform(wrld_simpl, CRS(stere)) 

xy <- project(cbind(xrange, yrange), stere) 
plot(w, xlim = range(xy[,1]), ylim = range(xy[,2])) 
box()