2012-08-28 6 views
12

Ich möchte Voronoi Polygone mit Karte kombinieren, um diese später für räumliche Analyse zu verwenden. Ich habe Punkte und Shapefiles, die ich kombinieren möchte, und speichere sie als Shapefile/räumliche Polygone. Um Voronoi-Polygone zu erhalten, verwende ich die Funktion this topic.Kombiniere Voronoi Polygone und Karten

Mein Code ist wie folgt:

coords<-data.frame(LONG=c(16.9252,16.9363,16.9408,16.8720,16.9167,16.9461,16.9093,16.9457,16.9171,16.8506,16.9471,16.8723,16.9444,16.9212,16.8809,16.9191,16.8968,16.8719,16.9669,16.8845), 
LAT=c(52.4064,52.4266,52.3836,52.3959,52.4496,52.3924,52.4012,52.3924,52.3777,52.4368,52.4574,52.3945,52.4572,52.3962,52.3816,52.3809,52.3956,52.3761,52.4236,52.4539)) 

Meine Karte ist hier verfügbar: https://docs.google.com/file/d/0B-ZJyVlQBsqlSURiN284dF9YNUk/edit

library(rgdal) 
voronoipolygons <- function(x) { 
    require(deldir) 
    if (.hasSlot(x, 'coords')) { 
    crds <- [email protected] 
    } else crds <- x 
    z <- deldir(crds[,1], crds[,2]) 
    w <- tile.list(z) 
    polys <- vector(mode='list', length=length(w)) 
    require(sp) 
    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=as.character(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')))) 
} 

Und mein Code voronoipolygons zu bekommen:

pzn.coords<-voronoipolygons(coords) 
plot(pznall) 
plot(pzn.coords,add=T) 
points(coords$LONG,coords$LAT) 

Ergebnis: enter image description here

Ich möchte dieses Voronoi-Polygon in meiner Map als neues spatiales Polygon haben.

Ich wäre dankbar für Anwsers!

Edit:

klar sein, möchte ich so etwas wie dies erreichen (diese Zeilen aus voronoi Polygonen erstellt werden soll):

enter image description here

+2

Es ist nicht klar, was Sie wollen. Sie haben die Voronoi-Polygone als spatialpolygonsdataframe im pzn.coords-Objekt. – Spacedman

+0

Der von Ihnen angegebene Link ist eine '.rdata' Datei. Sie können eine neue 'myvoronietc.rdata'-Datei unter Verwendung von' save() ', z. 'save ('pzn.coords', 'loto_other_data', Datei = 'myvoronietc.rdata')'. –

+0

Ich möchte beide Dateien kombinieren, um Voronoi-Polygone in meiner Map zu haben, nicht um diese quadratischen Grenzen von Voronoi-Polygonen zu haben, sondern in meinen Map-Grenzen. – Maciej

Antwort

12

Leicht modifizierte Funktion, nimmt ein zusätzliches Argument für räumliche Polygone und erstreckt sich auf dieses Feld:

voronoipolygons <- function(x,poly) { 
    require(deldir) 
    if (.hasSlot(x, 'coords')) { 
    crds <- [email protected] 
    } else crds <- x 
    bb = bbox(poly) 
    rw = as.numeric(t(bb)) 
    z <- deldir(crds[,1], crds[,2],rw=rw) 
    w <- tile.list(z) 
    polys <- vector(mode='list', length=length(w)) 
    require(sp) 
    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=as.character(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) 

} 

Dann tun:

pzn.coords<-voronoipolygons(coords,pznall) 
library(rgeos) 
gg = gIntersection(pznall,pzn.coords,byid=TRUE) 
plot(gg) 

Beachten Sie, dass gg ist ein SpatialPolygons Objekt, und man könnte eine Warnung über nicht übereinstimmen proj4 Saiten bekommen. Möglicherweise müssen Sie den proj4-String dem einen oder anderen Objekt zuweisen.

+0

Danke sehr viel, das wollte ich! – Maciej

+0

Sie haben einen streunenden 'pznall' in Zeile 7 (sollte' poly' sein) – jbaums

+0

Ich stimme zu, 'rw = as.numeric (t (bbox (pznall)))' sollte durch 'rw = as.numeric (t (bb)) '(da' bbox (poly) 'bereits in' bb' gespeichert wurde). –