Nokta maruziyetlerimin olduğu bir çevresel epidemiyoloji projesi üzerinde çalışıyorum (~ 2.000 endüstriyel domuz operasyonu - IHO). Bu IHO'lar yakındaki tarlalara püskürtülür, ancak dışkı su damlacıkları ve kokusu kilometrelerce yol alabilir. Yani bu nokta maruziyetleri 3mi tamponları alıyor ve NC sayım blokları başına IHO maruziyetlerinin sayısını (çeşitli türlerde - gübre miktarı, domuz sayısı, her neyse; en basit, sadece üst üste binen maruz kalma tamponlarının sayısı) bilmek istiyorum. (~ 200,000). Hariç tutma sayımı blokları (mavi), (1) en kalabalık 5 şehirdeki herhangi bir şey ve (2) bir ilçeyi IHO ile sınırlamayan ilçelerdir (not: gRelate işlevi ve DE-9IM kodlarıyla yapılmıştır - çok kaygan!). Görsel için aşağıdaki resme bakın
Son adım, her sayım bloğuna tamponlu pozlama gösterimini toplamaktır. İşte burada güldüm.
Şimdiye kadar sp paketindeki% over% fonksiyonları ile iyi zaman geçirdim, ancak poli-poli ve poli-line üzerinden rgeos uygulanan aşırı skeç anlıyorum. Vinyet sadece çizgi-poli ve kendinden referanslı poli'yi kapsar ve toplama ile değil, bu yüzden seçeneklerimin toplam veya ortalama gibi fonksiyon toplama ile poli-poli için ne olduğu konusunda biraz kafam karıştı.
Bir test durumu için, dünya ülke sınırları dosyasıyla çalışan aşağıdaki biraz ayrıntılı pasajı göz önünde bulundurun. Puanlar için rastgele bir tohum kullandığımdan ve dünya dosyasını kodda indirip açtığımdan beri bu kopyalanmalı ve olduğu gibi çalıştırılmalıdır.
İlk olarak, 100 nokta oluştururuz, ardından öğeyi veri çerçevesine eklemek için over işlevini fn argümanıyla kullanırız. Burada çok puan var, ama Avustralya'ya bir bakın: 3 puan, etiket olarak 3 numara. Çok uzak çok iyi.
Şimdi geometrileri dönüştürüyoruz, böylece tampon oluşturabilir, geri dönüştürebilir ve bu tamponları eşleyebiliriz. (Önceki haritaya dahil, iki bağlantıyla sınırlı olduğum için.) Her ülkede kaç tamponun üst üste geldiğini bilmek istiyoruz - Avustralya'nın durumunda, göze göre, bu 4'tür. Hayatım boyunca neler olduğunu anlayamıyorum over fonksiyonu ile almak için olsa. Kodun son satırlarındaki girişimimi karıştırıyorum.
DÜZENLEME: r-sis-geo üzerinde yorum yapan bir yığın işlevi - aynı zamanda yığın değişim sorusu 63577 başvurulan - bahsettiğini bu yüzden etrafında / akış bir çalışma bu işlevi aracılığıyla olabilir, ama neden gitmek gerekir anlayamıyorum diğer uzamsal nesneler için bu işlevselliğe sahip gibi gözüktüğünde polipol için bir araya gelmek.
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?