Tôi đang làm việc trong một dự án dịch tễ học môi trường nơi tôi có phơi nhiễm điểm (~ 2.000 hoạt động của lợn công nghiệp - IHOs). Những IHOs phun trên cánh đồng gần đó, nhưng các giọt phân nước và khứu giác có thể đi dặm. Vì vậy, các mức phơi nhiễm này nhận được bộ đệm 3mi và tôi muốn biết số lượng phơi nhiễm IHO (với nhiều loại khác nhau - tổng số lượng phân, số lượng lợn, bất cứ thứ gì, đơn giản nhất, chỉ là số lượng bộ đệm phơi nhiễm chồng chéo) trên mỗi khối điều tra NC (~ 200.000). Các khối điều tra dân số loại trừ (màu xanh) là (1) bất cứ thứ gì trong 5 thành phố đông dân nhất và (2) các quận không giáp với quận có IHO trong đó (lưu ý: được thực hiện với chức năng gRelate và mã DE-9IM - rất lắt léo!). Xem hình ảnh dưới đây cho một hình ảnh
Bước cuối cùng là tổng hợp các đại diện tiếp xúc được đệm cho mọi khối điều tra dân số. Đây là nơi tôi đang bối rối.
Cho đến nay, tôi đã có thời gian tốt với các hàm% trên% trong gói sp, nhưng hiểu từ họa tiết trên rằng poly-poly và poly-line over được thực hiện trong rgeos. Các họa tiết chỉ bao gồm poly-line và poly tự tham chiếu, không bao gồm tổng hợp, vì vậy tôi hơi bối rối về các tùy chọn của mình cho poly-poly với tổng hợp chức năng, như tổng hoặc trung bình.
Đối với trường hợp thử nghiệm, hãy xem xét đoạn trích dưới đây, hơi dài dòng làm việc với tệp biên giới quốc gia trên thế giới. Điều này sẽ có thể được sao chép và chạy như vậy, vì tôi đang sử dụng một hạt giống ngẫu nhiên cho các điểm và vì tôi đang tải xuống và giải nén tệp thế giới trong mã.
Đầu tiên, chúng ta tạo 100 điểm, sau đó sử dụng hàm over với đối số fn để thêm phần tử vào khung dữ liệu. Có rất nhiều điểm ở đây, nhưng hãy xem Úc: 3 điểm, số 3 là nhãn hiệu. Càng xa càng tốt.
Bây giờ chúng ta biến đổi hình học để chúng ta có thể tạo bộ đệm, biến đổi trở lại và ánh xạ các bộ đệm đó. . mặc dù để có được điều đó với chức năng hơn. Xem mớ hỗn độn của tôi trong một dòng mã cuối cùng.
EDIT: Lưu ý rằng một người bình luận về r-sis-Geo đã đề cập đến hàm tổng hợp - cũng được tham chiếu trong câu hỏi trao đổi ngăn xếp 63577 - vì vậy một công việc xung quanh / dòng chảy có thể thông qua chức năng đó, nhưng tôi không hiểu tại sao tôi cần phải đi để tổng hợp cho polypoly khi dường như có chức năng đó cho các đối tượng không gian khác.
require(maptools)
require(sp)
require(rgdal)
require(rgeos)
download.file("http://thematicmapping.org/downloads/TM_WORLD_BORDERS_SIMPL-0.3.zip", destfile="world.zip")
unzip("world.zip")
world.map = readOGR(dsn=".", "TM_WORLD_BORDERS_SIMPL-0.3", stringsAsFactors = F)
orig.world.map = world.map #hold the object, since I'm going to mess with it.
#Let's create 500 random lat/long points with a single value in the data frame: the number 1
set.seed(1)
n=100
lat.v = runif(n, -90, 90)
lon.v = runif(n, -180, 180)
coords.df = data.frame(lon.v, lat.v)
val.v = data.frame(rep(1,n))
names(val.v) = c("val")
names(coords.df) = c("lon", "lat")
points.spdf = SpatialPointsDataFrame(coords=coords.df, proj4string=CRS("+proj=longlat +datum=WGS84"), data=val.v)
points.spdf = spTransform(points.spdf, CRS(proj4string(world.map)))
plot(world.map, main="World map and points") #replot the map
plot(points.spdf, col="red", pch=20, cex=1, add=T) #...and add points.
#Let's use over with the point data
join.df = over(geometry(world.map), points.spdf, fn=sum)
plot(world.map, main="World with sum of points, 750mi buffers") #Note - happens to be the count of points, but only b/c val=1.
plot(points.spdf, col="red", pch=20, cex=1, add=T) #...and add points.
world.map@data = data.frame(c(world.map@data, join.df))
#world.map@data = data.frame(c(world.map@data, over(world.map, points.spdf, fun="sum")))
invisible(text(getSpPPolygonsLabptSlots(world.map), labels=as.character(world.map$val), cex=1))
#Note I don't love making labels like above, and am open to better ways... plus I think it's deprecated/ing
#Now buffer...
pointbuff.spdf = gBuffer(spTransform(points.spdf, CRS("+init=EPSG:3358")), width=c(750*1609.344), byid=T)
pointbuff.spdf = spTransform(pointbuff.spdf, world.map@proj4string)
plot(pointbuff.spdf, col=NA, border="pink", add=T)
#Now over with the buffer (poly %over% poly). How do I do this?
world.map = orig.world.map
join.df = data.frame(unname(over(geometry(world.map), pointbuff.spdf, fn=sum, returnList = F)) ) #Seems I need to unname this...?
names(join.df) = c("val")
world.map@data = data.frame(c(world.map@data, join.df)) #If I don't mess with the join.df, world.map's df is a mess..
plot(world.map, main="World map, points, buffers...and a mess of wrong counts") #replot the map
plot(points.spdf, col="red", pch=20, cex=1, add=T) #...and add points.
plot(pointbuff.spdf, col=NA, border="pink", add=T)
invisible(text(getSpPPolygonsLabptSlots(world.map), labels=as.character(world.map$val), cex=1))
#^ But if I do strip it of labels, it seems to be misassigning the results?
# Australia should now show 4 instead of 3. I'm obviously super confused, probably about the structure of over poly-poly returns. Help?