2017-01-18 16 views
1

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

Для этого мне нужно знать, для каждого размера многоугольника, и это среднее расстояние до всех других полигонов. Я ищу, как ускорить этот расчет, возможно, можно сделать более элегантным (и более быстрым) способом. Попытка, показанная ниже, работает, но в качестве упрощающего алгоритма требуется слишком много времени.

#program tries to place random points on shapefile shapes[[i]] if it fails after 300 seconds it goes though to simplifying part and swaps the old shapefile with a simplified version. 

d <- shapes[[i]] 
Fdist <- list() 

for(m in 1:dim(d)[1]) { 
     pDist <- vector() 
     for(n in 1:dim(d)[1]) { 
     pDist <- append(pDist, gDistance(d[m,],d[n,])) 
     } 

     Fdist[[m]] <- pDist 
     [email protected]$mean[m]<-mean(Fdist[[m]]) 
     [email protected]$gArea[m]<-gArea(d[m,]) 
    } 

#drop small and remote polygons 

d.1<-d[[email protected]$gArea>=quantile([email protected]$gArea, prob = seq(0, 1, length=11), type=5)[[1]] & ([email protected]$mean<=quantile([email protected]$mean, prob = seq(0, 1, length=11), type=5)[[10]]),] 

#replace with simplified polygon 

shapes[[i]]<-d.1 

Я был бы признателен за любые предложения.

ответ

2

Я попробовал бы сначала упростить полигоны. ms_simplify в rmapshaper пакете может значительно упростить многоугольники, не вводя скользят многоугольники или пробела:

library("rgdal") 
library("rmapshaper") 

big <- readOGR(dsn = ".", "unsimplified_shapefile") 
big_sample <- spsample(big, 1000, type = "stratified") 

small <- rmapshaper::ms_simplify(big, keep = 0.01) 
small_sample <- spsample(small, 1000, type = "stratified") 

С шейпом я должен был передать, я уменьшил шейп ~ 100МБ до ~ 2MB и сократить время, необходимое для выборки из ~ 2,3 с ~ 0,11 с.

Если упрощая это не вариант вы можете vectorise ваши gArea() и gDistance() функции с помощью byid = TRUE:

library("rgeos") 
[email protected]$area <- gArea(big, byid = TRUE) 
[email protected]$dist <- gDistance(big, byid = TRUE) 
+0

Спасибо Фил! Я применил как sm_simplify, так и векторизацию, и теперь он работает ** намного ** быстрее! – Juta

+0

@juta действительно рад, что это помогло! – Phil