Hi,
in the last days i had an error during the computation of a
morfological clustering on a dtm,
thanks to R.Bivand and his suggestions i've resolved it.
error was generated by a large presence of Nas ( the sea
surface ) on my scene:
http://img299.imageshack.us/img299/1619/immagine8gg6.png
The problem is firstly that there are NAs in morph, and then
that the string listing the row numbers of the NAs exceeds 8K
characters
(my earlier message : Errore in sprintf(fmt, ...) : La lunghezza
della stringa eccede la dimensione del buffer di 8192)
So the right procedure is to try clara on morph once you have
omitted the NAs.
If the NAs are for all variables in a row, coercing from
SpatialGridDataFrame to
SpatialPixelsDataFrame will work,
if only some, we need to set the whole row to NA, coerce,
cluster, add the clara results to the
SpatialPixelsDataFrame, coerce back to SpatialGridDataFrame,
then back to
GRASS.
##My system configuration:
R version 2.4.0 (2006-10-03)
powerpc-apple-darwin8.7.0
locale:
C
attached base packages:
[1] "methods" "stats" "graphics" "grDevices" "utils"
"datasets"
[7] "base"
other attached packages:
spgrass6 rgdal maptools foreign sp cluster
"0.3-4" "0.5-3" "0.6-5" "0.8-18" "0.9-4" "1.11.4"
##This is the log of previous error:
...
...
names(morph) <- c
("er","crosc","longc","slope_n","profc","minic","maxic")
morph.clara <- clara(morph, k=5, stand=F)
Errore in clara(morph, k = 5, stand = F) :
Observations
1929241,1931311,1933381,1935451,1937521,1939591,1941661,1943731,194
58
01,1947871,........................................................
..
.............44521,2146591,2148661,2150731,2152801,2154871,2156941
,2159011,2161081,2163151,2165221,2167291,2169361,2171431
traceback()
2: stop(ngettext(length(i), sprintf("Observation %d
has", i[1]),
sprintf("Observations %s have", paste(i,
collapse = ","))),
" *only* NAs --> omit for clustering")
1: clara(morph, k = 5, stand = F)
##this code fix the problem:
library(spgrass6)
x <- readRAST6(c ('$map_1,..,$map_N'))
save(x, file="geomorphological.RData", compress=TRUE)
rm(x)
gc()
# copies the GridTopology object from its slot in x,
to use later on; it is the current GRASS region
grd <- x at grid
# Sets or retrieves projection attributes on classes
extending SpatialData
# again copying from x so as to allow x to be removed from the
# workspace. It read the projection info and apply it to the
x data
proj <- x at proj4string
# copying the data slot (in R >= 2.4.0 a data frame) out to
xx; for some
# reason getting it in other ways made a copy of it, so this
saves space.
xx <- x at data
rm(x)
gc()
library(cluster)
# makes a logical vector saying which rows are all NAs
(FALSE), and
# which are not (TRUE).
NArow <- apply(xx, 1, function(x) !(all(is.na(x))))
# create xx1 object (my data without Nas)
# selects the rows for which NArow is TRUE.
xx1 <- xx[NArow,]
rm(xx)
gc()
res <- clara(xx1, k='$clusters', metric="'$metric'",
stand='$stand', sampsize='$sampsizes', trace='$trace',
samples='$samples',
medoids='$medoids', keep.data='$keepdata', rngR='$rngR')
gc()
rm(xx1)
gc()
# object name out_class, an integer vector of NAs the same
length as NArow.
out_class <- as.integer(rep(NA, length(NArow)))
# Inserts the results of res$clustering - c() removes the
unecessary names -
# into the elements of out_class for which NArow is TRUE (so
the elements
# corresponding to all NA inputs are NA in the output).
out_class[NArow] <- c(res$clustering)
# out is a SpatialGridDataFrame, with the same region as x,
same projection
# as x, but only the classification output (correctly
assigned to elements
# with regard to NAs in the input) in its data slot.
out <- SpatialGridDataFrame(grd,
proj4string=proj,data=data.frame(cls=out_class))
save(out, file="klust_out.RData", compress=TRUE)
library(rgdal)
writeGDAL(out, fname="clust.tif", drivername="GTiff", type="Byte")
gc()
i hope this is usefool
regards,
Massimo