Tham gia tệp CSV để shapefile


9

Tôi muốn tham gia một tệp CSV vào một shapefile.

Khi tôi xác định một lĩnh vực để tạo điều kiện tham gia, ví dụ:

map <- spChFIDs(map, as.character(map$ID))

nó trở lại

Lỗi trong spChFID (SP, x): độ dài khác nhau

Ai có thể tư vấn?


Cảm ơn. Nhưng ID cột có các giá trị duy nhất có thể được sử dụng làm trường tham gia. Các đầu vào của trường phải có cùng độ dài?
dùng3915459

Bạn có thể gửi một mẫu của bản đồ và csv của bạn?
cengel

@cengel Đó là một bộ dữ liệu khổng lồ và ảnh chụp màn hình sẽ không đủ để hiển thị các biến thể. Trường "ID" trong "bản đồ" shapefile là một chuỗi các số (với số chữ số khác nhau).
dùng3915459

Có lẽ lưu CSV vào một bảng để bạn biết các trường tham gia có cùng kiểu dữ liệu.
klewis

Câu trả lời:


7

Đây là cách bạn có thể làm điều đó trong R bằng cách sử dụng sp::merge

library(raster)
# read data    
p <- shapefile("path/file.shp")
d <- read.csv("path/file.csv")

# merge on common variable, here called 'key'
m <- merge(p, d, by='key')

# perhaps save as shapefile again
shapefile(m, "path/merged.shp")

Xin chào @RobertH, tôi đã được gửi đến đây từ câu hỏi tôi đã đăng ngày hôm qua. Khi tôi hợp nhất theo biến chung, tôi có kéo biến đó từ shapefile hoặc CSV không? Hai biến được khớp với nhau trong nội dung, nhưng không phải theo tên. Tôi đã thử chơi xung quanh với nó một chút và liên tục gặp lỗi (chủ yếu là: Lỗi trong [.data.frame(x @ data ,, by.x, drop = FALSE): các cột không xác định được chọn)
Lauren

1
Tìm ra. Bởi vì tôi cần phải tham gia hai lớp có tên khác nhau, tôi phải thay đổi định dạng một chút. Nó trông giống như hợp nhất (p, d, by.x = "key", by.y = "Match.key")
Lauren

3

Tôi không biết làm thế nào với R để tham gia một shapefile với một csv. Tuy nhiên, nếu điều này có thể giúp bạn, bạn cũng có thể thực hiện việc này trên QGIS bằng cách sử dụng MMQGIS bổ trợ.

nhập mô tả hình ảnh ở đây


Cảm ơn. Tôi đã thử với ArcGIS trước đây nhưng bộ dữ liệu rất lớn và tôi thích làm điều này trong R.
user3915459

2

Nếu bạn đang làm việc trong R thì shapefile và .csv của bạn cần được tải dưới dạng data.frame hoặc data.table. Bạn có thể sử dụng phép nối () để hợp nhất chúng.

Bạn có thêm thông tin nào về loại shapefile bạn có không?

Tôi đã may mắn làm được những điều sau đây khi tôi hợp nhất dữ liệu và dữ liệu. Lưu ý rằng bạn cần bỏ phần mở rộng .shp trong đối số "lớp". Tôi đã sử dụng "GEOID" trong đó bạn đặt bất kỳ tên nào của "hình dạng" mà bạn quan tâm.

library("rgdal")
library("data.table")
shapefile = readOGR(dsn = "DIRECTORY WITH SHAPEFILES", layer = "THE ACTUAL SHAPEFILE")
shapefile@data$id = rownames(shapefile@data)
shapefile.points = fortify(shapefile, region = "id")
shapefile.df = join(shapefile.points, shapefile@data, by = "id")
shapefile.df = subset(shapefile.df, select = c(long, lat, group, GEOID))
names(shapefile.df) = c("long", "lat", "group", "GEOID")

Sau đó, bạn có thể hợp nhất dữ liệu của mình bằng cách sử dụng một cái gì đó như

full.data = join(mydata, shapefile.df, by = "GEOID", type = "full")

1

Nếu bạn đang làm việc trong R thì thực sự không cần phải hợp nhất. Bạn có thể sử dụng ggplot để hiển thị dữ liệu của mình trên bản đồ. Xem, ví dụ của tôi. Điều này một lót làm việc kỳ diệu với tập tin hình dạng bangladesh = fortify(p1, region = "ADM1_EN"). Và, sau đó bạn có thể sử dụng

ggplot() + geom_map(data = br2016a, aes(map_id = ADM1_EN, fill = HectareLocal), 
                    map =bangladesh) +
  expand_limits(x = bangladesh$long, y = bangladesh$lat) + 
  coord_fixed(.96) +
  scale_fill_gradient(low="thistle2", high="darkred", 
                      guide="colorbar", na.value="white") +
  labs(title = "Bangladesh Boro Rice (Local variety), 2016", x = element_blank(), y = element_blank(), 
       fill='Hectares') +   theme(legend.position = "bottom") 

Và, bản đồ tôi nhận được là ở đây.

Đầu ra

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.