Распределение случайных выборок по полигонам

Я пытаюсь написать сценарий случайного распределения. План выборки имеет регион, разделенный на многочисленные полигоны или слои. Набор, но разное количество образцов должно быть случайным образом распределено по каждой страте (минимум 2 образца, но до 7 в некоторых слоях). Таким образом, у меня есть шейп-файл слоев и в его таблице атрибутов имена слоев и количество желаемых образцов в каждом.

  • СЛОИ; ОБРАЗЦЫ
  • 440; 4
  • 441; 2
  • 5Z3; 4
  • 5Z1; 7
  • 560; 2

Я нашел хорошую документацию по этим типам планов выборки (http://casoilresource.lawr.ucdavis.edu/drupal/book/export/html/519), хотя у меня возникли некоторые проблемы с реализацией этой процедуры для собственных нужд. По этой ссылке я работал с пакетами rgdal и maptools. Мой рабочий скрипт выглядит следующим образом:

# read in strata boundary shapefile 
strataboundaries <- readOGR('strataboundaries.shp', layer='strataboundaries')
#sample allocation to strata
allocation <- sapply(slot(strataboundaries, 'polygons'), function(i) spsample(i, n=4, type='random'))
allocation.merge <- do.call('rbind', allocation)
stratumID <- sapply(slot(strataboundaries, 'polygons'), function(i) slot(i, 'ID'))
sample <- sapply(allocation, function(i) nrow(i@coords))
sampleID <- rep(stratumID, sample)
allocation.final <- SpatialPointsDataFrame(allocation.merge, 
data=data.frame(poly_id=sampleID))
plot(strataboundaries, col="lightcyan", bborder="black", axes=TRUE, bg="lightsteelblue1")
points(allocation.final, col="red", pch=3, cex=0.8)
#write out shapefile containing sampling locations
allocation.final@proj4string <- strataboundaries@proj4string
writeOGR(allocation.final, ".", "allocation", driver='ESRI Shapefile')

Однако интенсивность выборки на страту не является статической (где у меня n = 4). Мне нужно это, чтобы отразить столбец в таблице атрибутов, который указывает соответствующее количество выборок, необходимых для данной страты. Я также хотел бы присвоить имена стратам местам отбора проб, которые были выделены.

В идеале подпрограмма должна выполнять итерацию по каждому полигону и случайным образом назначать n отсчетов внутри (как указано в таблице атрибутов) и записываться в виде шейп-файла. Любое направление будет с благодарностью. Я относительно новичок в программе, поэтому прошу прощения, если пропустил что-то очевидное.

[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"

Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots
  ..@ data       :'data.frame': 66 obs. of  3 variables:
  .. ..$ OBJECTID_1: int [1:66] 1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ Stratum1  : Factor w/ 66 levels "440","441","442",..: 65 64 63 62 61 60 12 11 7 49 ...
  .. ..$ Primary   : int [1:66] 2 2 4 5 2 7 2 2 2 2 ...
  ..@ polygons   :List of 66
  .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
  .. .. .. ..@ Polygons :List of 1
  .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
  .. .. .. .. .. .. ..@ labpt  : num [1:2] -68.3 40.4
  .. .. .. .. .. .. ..@ area   : num 0.769
  .. .. .. .. .. .. ..@ hole   : logi FALSE
  .. .. .. .. .. .. ..@ ringDir: int 1
  .. .. .. .. .. .. ..@ coords : num [1:654, 1:2] -66.3 -66.3 -66.4 -66.4 -66.4 ...
  .. .. .. ..@ plotOrder: int 1
  .. .. .. ..@ labpt    : num [1:2] -68.3 40.4
  .. .. .. ..@ ID       : chr "0"
  .. .. .. ..@ area     : num 0.769

person user24537    schedule 16.01.2014    source источник


Ответы (1)


К сожалению, я не могу помочь вам провести соответствующую выборку, не открывая ваш шейп-файл. Но позвольте дать вам несколько советов, которые, возможно, будут вам полезны:

  1. Если количество точек варьируется и не является статичным, как вы упомянули выше, будет разумно использовать цикл for, который поможет различать количество точек каждый раз, когда они должны распределяться по определенной многоугольной области.
  2. SpatialPolygons — объекты сжаты таким образом, что ваш первый многоугольник будет найден в разделе «x@polygons[[i]]@Polygons[[1]]», здесь i=1 первый многоугольник, i=2 — второй многоугольник и так далее в конце i=n — ваш n-й многоугольник, x — ваш SpatialPolygonsDataFrame.

Надеюсь, я помог вам сделать шаг вперед.

person And_R    schedule 23.01.2014