Skip to content

plotKML: image width and height of legend in KML file

2 messages · Elbers, Jan, Tomislav Hengl

#
Hello,

With my first plotKML project I managed to create a KML file containing a layer with irregular points (air temperature data) and add a legend overlay to it.
I tried changing the size of the legend to no avail, whatever I fill in for "width" and "height" I get a png file that is 120x240 pixels.
What am I doing wrong?

Cheers,
JanE

My code is:
library(sp)
library(plotKML)
library(spacetime)
#
# working directory
setwd('D:/A-user/Hi-Aware/plotKML')
#
# input file
tripfile <- 'wbgt_input_data_new.csv'
tripdata <- read.csv(tripfile)
#
# convert time to POSIX
tripdata$ctime <- as.POSIXct(strptime(tripdata$timestamp,"%Y-%m-%d %H:%M:%S"),format="%Y-%m-%d %H:%M:%S")
#
# lat lon with decimal minutes
tripdata$lat <- tripdata$lat + tripdata$latmin/60.
tripdata$lon <- tripdata$lon + tripdata$lonmin/60.
#
# create STIDF object
sp <- SpatialPoints(tripdata[,c("lon","lat")])
proj4string(sp) <- CRS("+proj=longlat +datum=WGS84")
tripdata.st <- STIDF(sp, time = tripdata$ctime, data = tripdata[,c("t2m","rh")])
#
# save to kml with legend bar overlay
kml_open(file.name = paste(tripfile, ".kml", sep=""))
kml_layer(tripdata.st, file.name=paste(tripfile, ".kml", sep=""), colour=t2m, labels="", points_names="",
        shape="http://maps.google.com/mapfiles/kml/pal2/icon18.png", kmz=FALSE, open.kml=TRUE)
kml_legend.bar(x=tripdata$t2m, width=100, height=500, pointsize = 10, legend.file="legend.png",
              legend.pal=SAGA_pal$SG_COLORS_DEFAULT, z.lim = range(tripdata$t2m, na.rm=TRUE, finite=TRUE))
kml_screen(image.file = "legend.png", position = "ML", sname = "legend")
kml_close(file.name = paste(tripfile, ".kml", sep=""))

end of code
#
We did not consider legends for point data because users will most 
likely use multiple esthetics parameters (color, size, altitude), so yes 
you need to use the lower level functions "kml_open", "kml_layer" to 
achieve this :(
Also 'width' and 'height' arguments only really make sense for factor 
type variables (hence the easiest is that you then make the legend 
yourself and then insert it using "kml_screen").

Notice that you need to use "z.lim" 2 times to ensure that the legend 
matches the colors of points. Here is an example:

R> library(plotKML)
R> library(sp)
R> library(rgdal)
R> data(eberg)
R> coordinates(eberg) <- ~X+Y
R> proj4string(eberg) <- CRS("+init=epsg:31467")
R> eberg <- eberg[runif(nrow(eberg))<.1,]
R> shape = "http://maps.google.com/mapfiles/kml/pal2/icon18.png"
R> kml_open("eberg_CLYMHT_A.kml")
KML file opened for writing...
R> kml_layer(eberg["CLYMHT_A"], colour=CLYMHT_A, z.lim=c(20,60),
+    colour_scale=SAGA_pal[[1]], shape=shape, points_names="")
Reprojecting to +proj=longlat +datum=WGS84 ...
Writing to KML...
R> kml_legend.bar(x=eberg$CLYMHT_A, legend.file="kml_legend.png",
+    legend.pal=SAGA_pal[[1]], z.lim=c(20,60))
null device
           1
R> kml_screen(image.file="kml_legend.png")
R> kml_close("eberg_CLYMHT_A.kml")
Closing  eberg_CLYMHT_A.kml

If you need to do this N times, then the best is to make a function e.g.:

R> kml_points <- function(obj, file, z.lim, points_names="", ...){
   kml_open(file)
   kml_layer(obj, colour=obj at data[,1], 
shape="http://maps.google.com/mapfiles/kml/pal2/icon18.png", 
colour_scale=SAGA_pal[[1]], points_names="", ...)
   kml_legend.bar(x=obj at data[,1], legend.file=gsub(".kml", ".png", 
file), legend.pal=SAGA_pal[[1]], z.lim=z.lim)
   kml_screen(image.file=gsub(".kml", ".png", file))
   kml_close(file)
}
## test it:
R> kml_points(eberg["CLYMHT_A"], file="eberg_CLYMHT_A.kml", z.lim=c(20,60))

FYI, the kml_legend.bar function is at:

https://r-forge.r-project.org/scm/viewvc.php/pkg/R/legend.bar.R?view=markup&root=plotkml

HTH,

T. Hengl
On 15-4-2015 17:34, Elbers, Jan wrote: