

Generate Neighbour Files
How to generate neighbour files for generalization filtering and Dorling cartograms? Two ways:
Using R
The following R program calculates neighbourhoods starting with a ArcGIS shapefile. There are some R packages required. Here the code:
################################################################# # INPUT # shapefileName: the name of the shapefile without ".shp" # shapefileDirectory: the name of the directory of the shapefile # ids: the ID variable in the shapefile defining the sorting order # of the boundary file and the data file (case sensitive!) # OUTPUT # The resulting neighbour file has the name shapefileName + ".fil" shapefileName = "Polygone_SH" shapefileDirectory = "." idName = "BFS2009" ################################################################# # library(ctv) # install.views("Spatial") library(spdep) library(rgdal) sh <- readOGR(shapefileDirectory, shapefileName) ids = sh[[idName]] nb <- poly2nb(sh) plot(sh, border="grey") plot(nb, coordinates(sh), add=TRUE) title(main=paste("Nachbarn im Shapefile",shapefileName, sep="\n")) cards <- card(nb) maxconts <- which(cards == max(cards)) if(length(maxconts) > 1) maxconts <- maxconts[1] fg <- rep("grey", length(cards)) fg[maxconts] <- "red" fg[nb[[maxconts]]] <- "green" plot(sh, col=fg) title(main="Region with largest number of contiguities") plot(sh, border="grey") plot(nb, coordinates(sh), add=TRUE) title(main=paste("Neighbours in Shapefile",shapefileName, sep="\n")) dsts <- nbdists(nb, coordinates(sh)) idw <- lapply(dsts, function(x) 1/(x / 10)) nbWeight <- function(nb, style, showNr) { nbw <- nb2listw(nb, glist=idw, style=style, zero.policy=T) cat(style, summary(unlist(nbw$weights)), "\n") cat(style, summary(sapply(nbw$weights, sum)), " (Sum)\n") if (showNr >= 0) cat(style, unlist(nbw$weights[showNr]), " - area", showNr, "\n" ) nbw } nbw <- nbWeight(nb, "W", 24) nbw <- nbWeight(nb, "B", 24) nbw <- nbWeight(nb, "C", 24) nbw <- nbWeight(nb, "U", 24) nbw <- nbWeight(nb, "S", 24) expandNBleft <- function(x) { rrr <- vector(mode="integer", length(unlist(nbw$neighbours))) k = 0 for(i in 1:length(x)) { for(j in 1:length(x[i][[1]])) { k = k + 1 rrr[k] = i } } rrr } w1 <- sort(ids) w0 <- 1:length(w1) w <- as.data.frame(cbind(w0,w1)) v1 <- expandNBleft(nbw$neighbours) v2 <- unlist(nbw$neighbours) v3 <- 100* unlist(nbw$weights) nb.df <- as.data.frame(cbind(v1,v2,v3)) rr <- merge(nb.df, w, by.x = "v1", by.y = "w0") rr <- merge(rr, w, by.x = "v2", by.y = "w0") res <- as.data.frame(cbind(rr$w1.x, rr$w1.y,rr$v3)) summary(res) options(scipen=12) filFilename = paste(shapefileName, ".fil", sep="") write.table(res, file=filFilename, col.names=F, row.names=F) cat ("Resulting neighbour file:", filFilename, "\n") #################################################################
NB: For the .wgt file: use e.g. population data.
Using ArcGIS and Excel
(mainly for internal documentation)
Step 1: ArcInfo-AML (ArcInfo required)
Input: ArcInfo-Shapefile with an ID-Item; output: 3 text files for the subsequent processing step.
Step 2: Excel-Macro (MS Excel required)
The content of the 4 files from step 1 were pasted into the three sheets "aat", "pat", "reg" and "nam". The macro creates the .fil data in the sheet "fil".
shapefileDirectory
Previous page: Neighbours || Next page: Feature (De)Activation