2012-07-11 24 views
8

Trong vài ngày qua, tôi đã đầu tiên sử dụng R để lập bản đồ. Tôi đã sử dụng R rộng rãi để mô hình hóa nhưng không phải loại công việc này trước đây. Tôi có một số câu hỏi và vấn đề liên quan đến shapefiles, cách họ đọc và vân vân.Vẽ một tệp hình dạng với lỗi ggplot2

Tôi đã tải xuống tệp hình dạng từ Australian Bureau of Statistics có nhiều tệp có đường viền trạng thái, mã bưu điện, thành phố, v.v. Các tệp hình dạng rất lớn, biên giới tiểu bang Úc có khoảng 1,8 triệu điểm tọa độ trong đó, tệp khác mà tôi đã thử là khu vực thống kê có hơn 8 triệu trong đó. Tôi đã không làm bất cứ điều gì với tập tin này vì nó chỉ là quá lớn cho R của tôi thiết lập.

Tôi đọc các tập tin hình dạng với readShapePoly và chuyển đổi nó như vậy

[email protected]$id = rownames([email protected])  
AUS.points = fortify(AUS, region="id") 
AUS.df = join(AUS.points, [email protected], by="id") 

Một khi tôi đã chuyển đổi biên giới nước hình dạng tập tin từ SpatialPolygonsDataFrame đến một dataframe thường xuyên Tôi vẽ nó thành công nhưng nó đã mãi mãi và các chi tiết quá lớn. Tôi nghĩ sử dụng thinnedSpatialPoly để đơn giản hóa nó, nhưng nó mang lại cho các lỗi:

Error in stopifnot(length([email protected]) == nrow(data)) :trying to get slot "polygons" from an object of a basic class ("NULL") with no slots 

mà Google không thể giúp tôi với.

Chiến lược tiếp theo của tôi là đọc nó vào SAS và sử dụng proc greduce để lấy tệp và tạo trường mật độ và bạn có thể chọn các đa giác dày đặc như thế nào.

proc mapimport out=states datafile='\Digital Boundaries\States\Shape file\STE_2011_AUST.shp'; 
id ste_code11; run; 
proc greduce data = states out = reduced_states; 
id ste_code11; run; 

SAS có đồ họa tào lao và thậm chí không thể vẽ những điều đối với tôi vì vậy tôi đã xuất khẩu các tập dữ liệu và đọc nó trở lại vào R với lĩnh vực mật độ mới mà tôi hy vọng sẽ tập hợp con các dataframe bằng và sử dụng trong âm mưu của tôi .

Vấn đề của tôi bây giờ là khi tôi đi đến mưu trong R i có được điều này Map of Australian State Borders

ggplot(data=states.df, aes(X, Y, group=SEGMENT)) + 
geom_polygon(colour='black', fill='white') + theme_bw() 

Tôi đoán đó là vì các đa giác là không theo thứ tự hoặc đã bị hỏng? Tôi đã sử dụng chức năng này để thử và tham gia lại các đa giác của mình nhưng vẫn không có may mắn

RegroupElements <- function(df, longcol, idcol){ 
g <- rep(1, length(df[,longcol])) 
if (diff(range(df[,longcol])) > 300) { # check if longitude within group differs more    than 300 deg, ie if element was split 
d <- df[,longcol] > mean(range(df[,longcol])) # we use the mean to help us separate the extreme values 
g[!d] <- 1 # some marker for parts that stay in place (we cheat here a little, as we do not take into account concave polygons) 
g[d] <- 2 # parts that are moved 
} 
g <- paste(df[, idcol], g, sep=".") # attach to id to create unique group variable for the dataset 
df$group.regroup <- g 
df 
} 

### Function to close regrouped polygons 
# Takes dataframe, checks if 1st and last longitude value are the same, if not, inserts first as last and reassigns order variable 
ClosePolygons <- function(df, longcol, ordercol){ 
if (df[1,longcol] != df[nrow(df),longcol]) { 
tmp <- df[1,] 
df <- rbind(df,tmp) 
} 
o <- c(1: nrow(df)) # rassign the order variable 
df[,ordercol] <- o 
df 
} 

Vì vậy, cuối cùng là câu hỏi của tôi! Mọi người xử lý các tệp hình dạng quá chi tiết lớn như thế nào? Tại sao không hoạt động không gian mỏng (tôi muốn tránh SAS nếu có thể)? Làm thế nào tôi có thể nhận được âm mưu của tôi không giống như crap?

Cuối cùng thông số kỹ thuật của tôi R:

R version 2.15.1 (2012-06-22) 
Platform: x86_64-pc-mingw32/x64 (64-bit) 

locale: 
[1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252 
[3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C      
[5] LC_TIME=English_Australia.1252  

attached base packages: 
[1] grid  stats  graphics grDevices utils  datasets methods 
[8] base  

other attached packages: 
[1] gridExtra_0.9 gpclib_1.5-1 ggmap_2.1  maptools_0.8-16 
[5] lattice_0.20-6 rgeos_0.2-7  plyr_1.7.1  stringr_0.6  
[9] ggplot2_0.9.1 sp_0.9-99  shapefiles_0.6 foreign_0.8-50 
[13] fastshp_0.1-0 

loaded via a namespace (and not attached): 
[1] colorspace_1.1-1 dichromat_1.2-4 digest_0.5.2  labeling_0.1  
[5] MASS_7.3-18  memoise_0.1  munsell_0.3  png_0.1-4   
[9] proto_0.3-9.2  RColorBrewer_1.0-5 reshape2_1.2.1  RgoogleMaps_1.2.0 
[13] rjson_0.2.8  scales_0.2.1  tools_2.15.1 
+0

Hãy thử 'rgeos :: gSimplify' nếu nó phù hợp với bạn. –

+3

Sử dụng rgdal: readOGR để đọc shapefiles của bạn. Sử dụng đồ họa cơ sở sp cho bản đồ của bạn. – Spacedman

+0

Ngoài ra, nếu các ranh giới đó quá chi tiết, hãy thử các địa chỉ đó từ www.gadm.org - chúng có thể không mang tính tác giả, nhưng chúng có thể đủ tốt cho công việc của bạn. – Spacedman

Trả lời

8

Thứ nhất, nếu bạn đang lặn trong đầu đầu tiên, đừng đi vào cuối cạn.

PC khá cũ của tôi có thể đọc các ranh giới kỹ thuật số bang ở định dạng shapefile không có vấn đề:

aus=readOGR(".","STE_2011_AUST") 
plot(aus) 

nhưng bản đồ rõ ràng là trên chi tiết. Tôi cũng tải nó vào Quantum GIS để tôi có thể có một zoom cũ tốt và xoay quanh, và mọi hòn đảo nhỏ bé đều ở đó. Tôi nghĩ đây là một trong những bản đồ cấp quốc gia chi tiết nhất mà tôi từng thấy. Vì vậy, thứ hai, bạn có thể muốn thử và tìm thấy một bản đồ dễ dàng đơn giản của các tiểu bang (xem www.gadm.org cho possibles).

Vì vậy, cho phép xem nếu gSimplify từ gói: rgeos giúp:

aus2 = gSimplify(aus,0.1) 
plot(aus2) 

mà loại bỏ rất nhiều những hòn đảo nhỏ bé nhưng thật đáng buồn cho tôi (và một phần lớn dân số) nó loại bỏ New South Wales cũng . Không tốt. Nếu tôi làm giảm khả năng chịu đựng cuối cùng tôi có thể nhận được một cái gì đó mà giữ NSW:

aus2 = gSimplify(aus,0.01) 
plot(aus2) 

nhưng rõ ràng có một số vấn đề với gSimplify hoặc dữ liệu shapefile riêng của mình. Dù sao, nếu tôi tiết kiệm aus2 trở lại một shapefile có một giảm kích thước lớn, các .shp được 180k thay vì 29 megabyte.

Ngoài ra, tôi muốn dính vào âm mưu với đồ họa cơ sở.

+0

Cảm ơn câu trả lời, tôi đã sai khi giả định rằng bạn phải chuyển đổi tệp shp thành một khung dữ liệu trước khi vẽ đồ thị! Khi tôi có cơ hội sẽ sử dụng 'gSimplify' – user1414259

Các vấn đề liên quan