Sunday 31 March 2019

merge - Connect points from two SpatialPointsDataFrames in R, considering the closest distance


I have two SpatialPointsDataFrames. In SpatialPointsDataFrame one (dat1) I have three points (A, B and C). In SpatialPointsDataFrame two (dat2), I have eight points with temperature measurements. I must connect each of those eight points to the closest point from dat1 and then calculate the average temperature for each point. How can I do that in R?



library(sp)
library(tmap)

# SpatialPointsDataFrame 1
dat_orig <- read.table(text="
point lat lng
A 15.6 80.9
B 20.9 10.9
C 1.2 81.8", header=TRUE, stringsAsFactors=FALSE)


dat1 <- dat_orig
coordinates(dat1) <- ~lng+lat

# SpatialPointsDataFrame 2
dat2_orig <- read.table(text =
"temp lat lng
18 15.6 81.9
18.5 19.9 10.9
12.3 11.2 81.8
14.2 15.6 85.9

13.1 1.2 60.9
18.5 20.8 40.9
17 14.6 10.9
18.1 14.6 11.9", header=TRUE, stringsAsFactors=FALSE)

dat2 <- dat2_orig
coordinates(dat2) <- ~lng+lat

# tmap plot
tm_shape(dat1, ylim = c(-10, 35), xlim = c(-10,100)) + tm_dots(col = "red", size = 0.2) + tm_text("point") +

tm_shape(dat2) + tm_dots(size = 0.1)

Answer



Use the FNN package:


> library(FNN)

this computes the first-nearest neighbours from dat1 for each of dat2:


> nn1 = get.knnx(coordinates(dat1), coordinates(dat2), 1)

The index into the three elements of dat1 for the 8 rows of dat2 is:


> ii = nn1$nn.index[,1]

> ii
[1] 1 2 1 1 3 2 2 2

(You can also get the distance out from nn1$nn.dist)


So we can then average the properties of dat2 grouped by that index with tapply:


> tapply(dat2$temp, list(ii), mean)
1 2 3
14.83333 18.02500 13.10000

No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...