[R] How to efficiently generate data of points within specified radii for each geometric point
Jeff Newmiller
jdnewm|| @end|ng |rom dcn@d@v|@@c@@u@
Tue Jun 2 08:38:31 CEST 2020
Wrong list. Do _read_ the Posting Guide and then check out r-sig-geo.
On June 1, 2020 5:18:49 PM PDT, Lom Navanyo <lomnavasia using gmail.com> wrote:
>Hello,
>I have data set of about 3400 location points with which I am trying to
>generate data of each point and their neighbors within defined radii
>(eg,
>0.25, 1, and 3 miles).
>
>Below is a reprex using the built-in nz_height data:
>
>library(sf)
>library(dplyr)
>library(spData)
>library(ggplot2)
>library(stringr)
>library(rgdal)
>library(lwgeom)
>library(sp)
>
>
>#Transform and project to required UTM
>
>projdata<-st_transform(nz_height, 32759) #32759 is for UTM Zone 59S
>
>
># plot(projdata$geometry)
>
># sequence of radii
>
>bufferR <- c(402.336, 1609.34, 3218.69, 4828.03, 6437.38)
>
>#Create data of neighboring wells per buffer
>
>dataout <- do.call("rbind", lapply(1:length(bufferR), function(y) {
> bfr <- projdata %>% st_buffer(bufferR[y]) ## create Buffer
> ## minus the next smaller buffer
> if(y>1) {
> inters <- suppressWarnings(st_difference(bfr, projdata %>%
>st_buffer(bufferR[y-1])))
> bfr <- inters[which(inters$t50_fid == inters$t50_fid.1),]
> }
>
> # get ids that intersect with buffer
> inters <- bfr %>% st_intersects(projdata)
>
>
> do.call("rbind", lapply(which(sapply(inters, length)>0),
> function(z) data.frame(t50_fid = projdata[z,]$t50_fid, radius =
>bufferR[y],
> t50_fid_2 = projdata[unlist(inters[z]),]$t50_fid,
> elevation_mtchd = projdata[unlist(inters[z]),]$elevation)))
>}))
>
>This gives data frame as:
>
>> head(dataout)
> t50_fid radius t50_fid_2 elevation_mtchd
>1 2353944 402.336 2353944 2723
>2 2354404 402.336 2354404 2820
>3 2354405 402.336 2354405 2830
>4 2369113 402.336 2369113 3033
>5 2362630 402.336 2362630 2749
>6 2362814 402.336 2362814 2822
>
>The end goal is that for each (original) point with t50_fids, I want
>its
>neighboring points within the specified radius listed under t50_fid_2
>in a
>long format. The caveat is that for the very first (ie. the smallest)
>radius 402.336, t50_fid_2 should return neighboring points within that
>distance. But for subsequent radii, t50_fid_2 should return
>neighboring
>points within them but not within the smaller radius. Thus for example,
>for
>radius 1609.34m, I should get as neighboring points, points within
>1609.34m
>but not within the smaller buffer/radius 402.336m.
>
>The problem is that if I use my full data set of over 3000 rows
>(points), I
>get the following error:
>
>Error in CPL_geos_op2(op, st_geometry(x), st_geometry(y)) : Evaluation
>error: std::bad_alloc.
>
>I understand this is a memory issue as the code I am using creates
>buffers
>around each point and this approach is memory intensive.
>
>A suggestion was made that I could achieve my objective using
>st_is_within_distance instead of st_buffer , st_difference and
>st_intersect without creating buffers.
>
>How can I achieve my objective (that is, the table in dataout)
>efficiently
>either with the suggested use of st_is_within_distance, or with my
>code
>without running out of memory (RAM) or any other approach?
>
>Thank you for considering my question.
>-----------------------
>Lom Navanyo Newton
>
> [[alternative HTML version deleted]]
>
>______________________________________________
>R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>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.
--
Sent from my phone. Please excuse my brevity.
More information about the R-help
mailing list