2014-01-04 4 views
3

После довольно неудачного написания question, я надеюсь, что этот более ясный и прямой, и любая помощь с ним очень ценится.Поиск соседей из многоугольных полигонов в пределах установленной области карты

Я хочу создать многоугольники voronoi/thiessen вокруг множества точек в пределах данной «карты», чтобы определить, какие точки являются соседями (совместно использовать границу) друг с другом в пределах данной области.

library(sp); library(rgeos); library(deldir) 

Учитывая ситуацию, в которой у меня есть 14 мест Меня интересует:

x<-c(0.9,1.7,2.4,2.9,4.83, 0.73, 2.31, 3.69, 4.23, 2.86, 1.91, 4.32, 4.60, 1.82) 
y<-c(1.9,0.9,2.8,1.9,1.81, 1.66, 4.54, 5.66, 1.99, 4.03, 4.32, 5.98, 5.56, 3.41) 
crds<-cbind(x,y) 

в пределах данного многоугольника (карта)

x.p<-c(0.1,0.1,3.5,3,5,1,6,6,0.1) 
y.p<-c(0.1,5,4.8,1,5,5.5,6.5,1,0.1) 
poly<-cbind(x.p,y.p) 

и многоугольник (карта) имеет множество отверстие в нем:

x.h<-c(1,1.1,1.5,2.1,1.9,2.3,3,1) 
y.h<-c(1,2.9,3.1,3,2.8,2.2,1.5,1) 
hole<-cbind(x.h,y.h) 

Теперь мне нужно знать соседей первого порядка между каждой из представляющих интерес точек, но где полигоны вороней вокруг интересующей точки не могут простираться от границ карты или в/через отверстие.

deldir(crds[,1],crds[,2]) 

просто дает многоугольники voronoi (и соседей первого порядка) без этих ограничений.

В иллюстративных целях и в дальнейшем объяснить, что я имею в виду, например, если мы должны были построить полигоны обычным способом:

voronoipolygons <- function(crds) { 
z <- deldir(crds[,1], crds[,2],rw=c(0,7,0,7)) 
w <- tile.list(z) 
polys <- vector(mode='list', length=length(w)) 
for (i in seq(along=polys)) { 
pcrds <- cbind(w[[i]]$x, w[[i]]$y) 
pcrds <- rbind(pcrds, pcrds[1,]) 
polys[[i]] <- Polygons(list(Polygon(pcrds)), ID=(1:nrow(crds))[i]) 
} 
SP <- SpatialPolygons(polys) 
voronoi <- SpatialPolygonsDataFrame(SP, data=data.frame(x=crds[,1],y=crds[,2], row.names=sapply(slot(SP, 'polygons'),function(x) slot(x, 'ID')))) 
return(voronoi) 
} 
SP<-voronoipolygons(crds[,1:2]) 
plot(SP) 

, а затем, если я сюжет моих ограничений по этому поводу, чтобы продемонстрировать, что Я имею в виду

ybox<-xbox<-c(0,7) 

polypath(c(poly[,1], NA, c(xbox, rev(xbox))), c(poly[,2], NA, rep(ybox, each=2)), col="light blue", rule="evenodd") 
polygon(hole[,1],hole[,2],col="light blue") 
text(crds[,1],crds[,2],1:nrow(crds)) 

Я хотел, чтобы это так, когда я использую команду deldir (или что-то подобное?), «3» не будет классифицироваться как соседи с «1» или «2», и не будет " 10 'и' 8 'будут считаться соседями друг с другом и т. Д.

Edit:

С тех пор я нашел this. Это похоже на то, что мне нужно (с опцией «экстент»), но надеялось выполнить его без использования программного обеспечения ArcGIS.

+0

Кроме того, если у кого есть какие-либо идеи о том, как это сделать даже без отверстия в середине полигона, то это было бы слишком большим.Спасибо – user3122539

+0

далее, В предыдущем связанном [post] (http://stackoverflow.com/questions/12156475/combine-voronoi-polygons-and-maps/) Я думаю, @Spacedman предполагает, что что-то вроде этого может быть достигнуто с помощью фиктивных точек , но я не уверен, как это можно сделать. Удачи всем, кто попробовал – user3122539

ответ

1

Следующее, кажется, помогает в более простом вопросе (без отверстия).

https://github.com/cran/deldir/blob/master/inst/code.discarded/triang.list.R.save

В частности, «TList» объект, определенный линией 24.

Вы не можете включать как соседи, чьи плитки только встретить далеко за пределами области черчения. В этом случае было бы проще брать в качестве соседей каждую пару точек с записью в столбцах «ind1» и «ind2» компонента «dirsgs» вывода «deldir». Опять же, это для более простой версии вопроса (без дыр).

Нил

+1

Добро пожаловать в StackOverflow! Пожалуйста, подумайте о том, чтобы включить в свой ответ важные части связанного ресурса. Ссылка только ответы считаются плохими ответами и, скорее всего, удаляются быстро. – VMai