[R] What is the easiest way to interpolate vertical values on a square section of a nearly-planar 3D surface
David Winsemius
dwinsemius at comcast.net
Wed Dec 4 01:21:16 CET 2013
On Dec 2, 2013, at 8:02 PM, Mercutio Florid wrote:
> I want to map out a mostly flat area of land, 300 meters on a side.
>
>
> I want to make (x,y,z) triples where x and y vary between -150 and 150 and there is just one z value.
>
>
> Eventually I will try to use graphics to actually draw this, but my first problem is that I need to get 90601 values by interpolating just 13 actual measurements. The measurements are currently unsorted, which might cause errors with some functions, and they are in a matrix that looks like this:
> X Y Value
> 1 20 135 105
> 2 -127 69 106
> 3 -98 47 107
> 4 -39 69 105
> 5 49 47 105
> 6 108 69 107
> 7 -9 3 106
> 8 -39 3 106
> 9 -127 -63 105
> 10 -39 -41 108
> 11 -39 -107 106
> 12 79 -63 107
> 13 20 -129 107
I have no idea what sort of "interpolation would make sense here. There is an 'akima' package that does interpretation at irregularly located x-y coordinates, but after doing a planar fit with scatter3d (which also lets you look at the points in 3d, I think your points have a rather irregular cliff-like structure.
rd.txt <- function (txt, header = TRUE, ...)
{
rd <- read.table(textConnection(txt), header = header, ...)
closeAllConnections()
rd
}
dat <- rd.txt(" X Y Value
1 20 135 105
2 -127 69 106
3 -98 47 107
4 -39 69 105
5 49 47 105
6 108 69 107
7 -9 3 106
8 -39 3 106
9 -127 -63 105
10 -39 -41 108
11 -39 -107 106
12 79 -63 107
13 20 -129 107")
library(car)
# will also need rgl
scatter3d(dat$X, dat$Y, dat$Value)
library(akima)
akima.li <- interp(dat$X, dat$Y, dat$Value,
xo=seq(min(dat$X), max(dat$X), length = 100),
yo=seq(min(dat$Y), max(dat$Y), length = 100))
persp(akima.li$z)
persp(akima.li$z, theta=30)
persp(akima.li$z, theta=45)
persp(akima.li$z, theta=60)
--
David.
>
>
> The syntax for the output seems pretty easy:
> x_coord<-seq(from=-150,to=150)
> y_coord<-seq(from=-150,to=150)
> planebreadth=301
> spaceArray<-array(0,c(planebreadth, planebreadth,1))
>
> But what I need to do is somehow interpolate 90601 values into spaceArray, based on just 13 measurements.
>
> I looked through some introductory R tutorials such as
>
> cran.r-project.org/doc/manuals/R-intro.html
>
> and I didn't see any examples that seemed to cover this kind of problem.
>
>
>
> I did some web searches and there seem to be many, many ways to do interpolation. There are packages like mgcv and DiceKriging. There are various packages that mention splines in their descriptions, such as cobs.
>
> What is the easiest way to interpolate this kind of data? Thanks.
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
David Winsemius
Alameda, CA, USA
More information about the R-help
mailing list