As my several recent posts have mentioned, I’m working with BBS spatial data (i.e. route paths and start points). I wanted to “downscale” by splitting routes into smaller segments and looking at data sub-route level. Specifically, I needed to split routes into fifths. I needed to know what order the segments were in from the start of the route to match the finer-scale data.
Here’s how to do it…
- Break up the accounted for routes (or maybe even raw data set?) into “good” and “bad” routes depending on if the start is nearest a segment for a matching route
- Work with “good starts” and “good routes” (the easiest!)
- identify the segments closest to the start point as the first segment of the route
- run near on the start points to find out which segment in the master file is closest
- use the near_FID to join with the FID of the route segment layer
- export the resultant start segments into their own layer (number them 1)
- remove join
- delete the start segments from the master file of all the broken up segments of the route (select by location: identical to)
- use select by location (touches the boundary of) to find the next closest line segment to the start in the master file, and number them 2
- repeat 2-4 for the remaining segments, and number them accordingly
- identify the segments closest to the start point as the first segment of the route
- Work with bad starts: once the good routes are out of the data set, is the bad point now closest to a remaining matching segment?
- break up those newly matched lines
- put leftover points into yet another file
- Look at remaining points to see if any more lines can be put to use
Given the numbering scheme recommended in the steps above, your segments should be numbered 1-5 on each route. I buffered those segments and averaged tree cover within each segment buffer. In order to match my segment numbering with the rest of my R code, I renamed the segments.
vcf_subroute <- read.dbf("landcover/bbs_segment_buffers.dbf") vcf_subroute$interval <- paste("count",vcf_subroute$segment,"0",sep="")
The remainder of the code is similar to that described in the route-level MODIS post, just with the added level of the interval.
vcf_subroute <- vcf_subroute[,c("rteno","interval",grep("[[:digit:]]", names(vcf_subroute), perl=TRUE, value=TRUE))] vcf_subroute <- melt(vcf_subroute,id=c("rteno","interval")) vcf_subroute$variable <- as.character(vcf_subroute$variable) vcf_subroute$Year <- str_extract(vcf_subroute$variable,"[[:digit:]]+") vcf_subroute$var <- sapply(strsplit(vcf_subroute$variable, "[[:digit:]]+"),"[[",2) vcf_subroute$variable <- NULL vcf_subroute <- dcast(vcf_subroute,rteno + interval ~ var,fun.aggregate=mean) vcf_subroute$rteno <- as.character(vcf_subroute$rteno)
The full script, to this point: bbs10vcf