2015-10-01 2 views
3

Я создал контрольную сетку, ячейки 50x50 м, на основе местоположения GPS одетых животных. Я хочу сделать эквивалент пространственного соединения в ArcGIS и подсчитать количество точек в каждой ячейке.R: Как я могу подсчитать, сколько очков в каждой ячейке моей сетки?

Я сделал эталонную сетку, используя объект SpatialPointsDataFrame (кадр данных уже проецируется, с помощью UTM системы координат)

RESO <- 50 # grid resolution (m) 
BUFF <- 500 # grid extent (m) (buffer around location extremes) 
XMIN <- RESO*(round(((min(dat.spdf$Longitude)-BUFF)/RESO),0)) 
YMIN <- RESO*(round(((min(dat.spdf$Latitude)-BUFF)/RESO),0)) 
XMAX <- XMIN+RESO*(round(((max(dat.spdf$Longitude)+BUFF-XMIN)/RESO),0)) 
YMAX <- YMIN+RESO*(round(((max(dat.spdf$Latitude)+BUFF-YMIN)/RESO),0)) 
NRW <- ((YMAX-YMIN)/RESO) 
NCL <- ((XMAX-XMIN)/RESO) 
refgrid<-raster(nrows=NRW, ncols=NCL, xmn=XMIN, xmx=XMAX, ymn=YMIN, ymx=YMAX) 
refgrid<-as(refgrid,"SpatialPixels") 

Чтобы убедиться, что моя сетка была в той же проекции, что и SpatialPoints:

proj4string(refgrid)=proj4string(dat.sp.utm) #makes the grid the same CRS as point 

count.point функция adehabitatMA кажется, что функция, которая будет делать трюк

cp<- count.points(dat.spdf, refgrid) 

Но я получаю эту ошибку:

Error in w[[1]] : no [[ method for object without attributes 

Это не правильный путь, чтобы предпринять, чтобы достичь своей цели? Или как я могу разрешить эту ошибку? Или может быть лучше подходит функция over (sp)?

выход из SpatialPointsDataFrame (dat.spdf)

dput(head(dat.spdf, 20)) 
structure(list(Latitude = c(5.4118432, 5.4118815, 5.4115713, 
5.4111541, 5.4087853, 5.4083702, 5.4082527, 5.4078161, 5.4075528, 
5.407321, 5.4070598, 5.4064237, 5.4070621, 5.4070555, 5.4065127, 
5.4065134, 5.4064872, 5.4056724, 5.4038751, 5.4024223), Longitude = c(118.0225467, 
118.0222841, 118.0211875, 118.0208637, 118.0205413, 118.0206064, 
118.0204101, 118.0209272, 118.0213827, 118.0214189, 118.0217748, 
118.0223343, 118.0227079, 118.0226916, 118.0220733, 118.02218, 
118.0221843, 118.0223316, 118.0198153, 118.0196021), DayNo = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L)), .Names = c("Latitude", "Longitude", "DayNo"), row.names = c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 15L, 16L, 
17L, 18L, 19L, 20L, 21L), class = "data.frame") 

И резюме:

summary(dat.spdf) 
Object of class SpatialPointsDataFrame 
Coordinates: 
      min  max 
Longitude 610361.0 613575.5 
Latitude 596583.5 599385.2 
Is projected: TRUE 
proj4string : [+proj=utm +zone=50 +ellps=WGS84] 
Number of points: 5078 
Data attributes: 
Latitude  Longitude  DayNo  
Min. :5.396 Min. :118 Min. : 1.0 
1st Qu.:5.404 1st Qu.:118 1st Qu.: 92.0 
Median :5.406 Median :118 Median :183.0 
Mean :5.407 Mean :118 Mean :182.6 
3rd Qu.:5.408 3rd Qu.:118 3rd Qu.:273.0 
Max. :5.422 Max. :118 Max. :364.0 
+0

Вы проверили, что 'refgrid' имеет класс (или унаследованный класс)' SpatialPixels'? –

+0

Да, кажется, (извините о форматировании ...) 'резюме (refgrid) Объект класса SpatialPixels Координаты: мин макс х 609850 614100 у 596100 599900 проецируется: ИСТИНА proj4string: [+ проектируемый = UTM + зона = 50 + ellps = WGS84] Кол-во пунктов: 6460 Сетка атрибуты: cellcentre.offset cellsize cells.dim s1 609875 50 85 s2 596125 50 76' – Danica

+0

Если оставить 'refgrid' как растровый, вы можете построить на 'table (cellFromXY (refgrid, dat.spdf))'. – jbaums

ответ

1

Вот один из способов сделать это, первый перфорационных частоту числа клеток, представленных точками, то назначение этих частоты к значениям ячеек и, наконец, извлечение координат и значений ячеек.

library(raster) 
r <- raster(xmn=0, ymn=0, xmx=10, ymx=10, res=1) 
r[] <- 0 
xy <- spsample(as(extent(r), 'SpatialPolygons'), 100, 'random') 
tab <- table(cellFromXY(r, xy)) 
r[as.numeric(names(tab))] <- tab 

Теперь у нас есть что-то вроде этого:

plot(r) 
points(xy, pch=20) 

enter image description here

Мы можем извлечь координаты клетки с coordinates() и их значения с values(r) или просто r[]:

d <- data.frame(coordinates(r), count=r[]) 

head(d) 
##  x y count 
## 1 0.5 9.5  0 
## 2 1.5 9.5  1 
## 3 2.5 9.5  1 
## 4 3.5 9.5  3 
## 5 4.5 9.5  2 
## 6 5.5 9.5  3  
6

Растрировать развлечения ction может это сделать для вас:

library(raster) 
r <- raster(xmn=0, ymn=0, xmx=10, ymx=10, res=1) 
xy <- spsample(as(extent(r), 'SpatialPolygons'), 100, 'random') 

x <- rasterize(xy, r, fun='count') 
+0

Ах, да, конечно! – jbaums

 Смежные вопросы

  • Нет связанных вопросов^_^