在指定的网格框上过滤 TC 轨迹(经纬度点)
Filter TC tracks (lat-lon points) over a specified gridbox
我正在使用 R 过滤经过网格框的热带气旋路径。我有一个包含轨道的 csv 文件并将它们转换为 shapefile。
我只想过滤具有相同标识符(下面示例数据中的 "SN" 列)且经过指定网格框(5N 到 25N 和 115E 到 135 E)的点。下面是我正在使用的代码和数据的 link。
jtwc <- read.csv("1979-1993_TC.csv",header=T,sep=",")
latmin <-5.00
latmax <- 25.00
lonmin <- 115.00
lonmax <- 135.00
jtwc.unique <- unique(jtwc[jtwc$Lat >= latmin & jtwc$Lat <= latmax & jtwc$Lon >= lonmin & jtwc$Lon <= lonmax,c(1,2)])
jtwc.filter <- merge(jtwc,jtwc.unique,all.x = F,all.y = T, sort = F)
jtwc.filter$Lon <- ifelse(jtwc.filter$Lon < 0, jtwc.filter$Lon + 360, jtwc.filter$Lon)
jtwc.filter <- jtwc.filter[with(jtwc.filter,order(Year,Month,Day,Hour,CY)),]
write.table(jtwc.filter,file = "test2_jul_par_1979-1993.csv", sep = ",", row.names = F)
问题:
此代码无法正常工作。当我 运行 脚本时,我仍然看到框外的轨道。
任何人都可以提出任何改进方法吗?
如有任何帮助,我将不胜感激。
要过滤您可以使用
library(dplyr)
dat %>%
filter(Lat>=5 & Lat <=25 & Lon>=115 & Lon<135)
相反,如果您想保留原始数据框,您可以使用
dat %>%
mutate(boxed = ifelse(Lat>=5 & Lat <=25 & Lon>=115 & Lon<135, 1,0))
如果你想绘制轨迹
library(ggplot2)
dat %>%
mutate(boxed = ifelse(Lat>=5 & Lat <=25 & Lon>=115 & Lon<135, 1,0)) %>%
ggplot(aes(Lon,Lat, color=factor(boxed)))+geom_point()
此代码更正了基本问题,但我不知道它是否完全解决了您的问题。您的原始代码似乎假设 CY 和 SN 的组合在数据集中是唯一的,我认为这是不正确的。对于同一对,必须存在具有不同测量值的组合。此版本保存 bounded
值,然后针对此 bounded
table
进行合并
library(assertthat)
jtwc <- read.csv("~/Downloads/1979-1993_TC.csv", header=T, sep=",")
latmin <-5.00
latmax <- 25.00
lonmin <- 115.00
lonmax <- 135.00
# adjust for negative lat
jtwc$Lon <- ifelse(jtwc$Lon < 0, jtwc$Lon + 360, jtwc$Lon)
# derive the bounded points
jtwc.bounded <- jtwc[jtwc$Lat >= latmin & jtwc$Lat <= latmax & jtwc$Lon >= lonmin & jtwc$Lon <= lonmax,]
# all these are TRUE
assert_that (all(jtwc.bounded$Lat >= latmin))
assert_that (all(jtwc.bounded$Lat <= latmax))
assert_that (all(jtwc.bounded$Lon >= lonmin))
assert_that (all(jtwc.bounded$Lon <= lonmax))
jtwc.unique <- unique(jtwc.bounded[,c(1,2)])
# merge with bounded (
jtwc.filter <- merge(jtwc.bounded, jtwc.unique, all.x = F, all.y = T, sort = F)
assert_that (all(jtwc.filter$Lat >= latmin))
assert_that (all(jtwc.filter$Lat <= latmax))
assert_that (all(jtwc.filter$Lon >= lonmin))
assert_that (all(jtwc.filter$Lon <= lonmax))
jtwc.filter <- jtwc.filter[with(jtwc.filter,order(Year,Month,Day,Hour,CY)),]
write.table(jtwc.filter,file = "test2_jul_par_1979-1993.csv", sep = ",", row.names = F)
这是一种使用 data.table
进行数据处理,然后使用 googleway
在 google 地图
上绘制轨迹的方法
library(googleway)
library(data.table) ## because I like working with data.table to do data manipulation
jtwc <- read.csv("~/Downloads/1979-1993_TC.csv")
setDT(jtwc) ## set as data.table
latmin <-5.00
latmax <- 25.00
lonmin <- 115.00
lonmax <- 135.00
df_bounds <- data.frame(north = latmax, south = latmin, west = lonmin, east = lonmax)
## apply a logical column whether the point is in the box
jtwc[, inBounds := Lat >= latmin & Lat <= latmax & Lon >= lonmin & Lon <= lonmax]
## create a column that identifies if the SN at some point passes through the box
jtwc[SN %in% jtwc[inBounds == TRUE, unique(SN)], passesThroughBox := T ]
jtwc[is.na(passesThroughBox), passesThroughBox := F]
## adding a colour for plotting
jtwc[, colour := ifelse(passesThroughBox, "#4286F4", "#F44141") ]
## you need a google maps API key to plot on Google Maps
map_key <- 'your_api_key'
google_map(key = map_key) %>%
add_polylines(data = jtwc, lat = "Lat", lon = "Lon", id = "SN", stroke_colour = 'colour',
mouse_over_group = 'passesThroughBox') %>%
add_rectangles(data = df_bounds, north = 'north', south = 'south', west = 'west', east = 'east',
fill_opacity = 0.1)
然后将鼠标悬停在线条上时,您可以看到通过的那些
我正在使用 R 过滤经过网格框的热带气旋路径。我有一个包含轨道的 csv 文件并将它们转换为 shapefile。
我只想过滤具有相同标识符(下面示例数据中的 "SN" 列)且经过指定网格框(5N 到 25N 和 115E 到 135 E)的点。下面是我正在使用的代码和数据的 link。
jtwc <- read.csv("1979-1993_TC.csv",header=T,sep=",")
latmin <-5.00
latmax <- 25.00
lonmin <- 115.00
lonmax <- 135.00
jtwc.unique <- unique(jtwc[jtwc$Lat >= latmin & jtwc$Lat <= latmax & jtwc$Lon >= lonmin & jtwc$Lon <= lonmax,c(1,2)])
jtwc.filter <- merge(jtwc,jtwc.unique,all.x = F,all.y = T, sort = F)
jtwc.filter$Lon <- ifelse(jtwc.filter$Lon < 0, jtwc.filter$Lon + 360, jtwc.filter$Lon)
jtwc.filter <- jtwc.filter[with(jtwc.filter,order(Year,Month,Day,Hour,CY)),]
write.table(jtwc.filter,file = "test2_jul_par_1979-1993.csv", sep = ",", row.names = F)
问题:
此代码无法正常工作。当我 运行 脚本时,我仍然看到框外的轨道。
任何人都可以提出任何改进方法吗?
如有任何帮助,我将不胜感激。
要过滤您可以使用
library(dplyr)
dat %>%
filter(Lat>=5 & Lat <=25 & Lon>=115 & Lon<135)
相反,如果您想保留原始数据框,您可以使用
dat %>%
mutate(boxed = ifelse(Lat>=5 & Lat <=25 & Lon>=115 & Lon<135, 1,0))
如果你想绘制轨迹
library(ggplot2)
dat %>%
mutate(boxed = ifelse(Lat>=5 & Lat <=25 & Lon>=115 & Lon<135, 1,0)) %>%
ggplot(aes(Lon,Lat, color=factor(boxed)))+geom_point()
此代码更正了基本问题,但我不知道它是否完全解决了您的问题。您的原始代码似乎假设 CY 和 SN 的组合在数据集中是唯一的,我认为这是不正确的。对于同一对,必须存在具有不同测量值的组合。此版本保存 bounded
值,然后针对此 bounded
table
library(assertthat)
jtwc <- read.csv("~/Downloads/1979-1993_TC.csv", header=T, sep=",")
latmin <-5.00
latmax <- 25.00
lonmin <- 115.00
lonmax <- 135.00
# adjust for negative lat
jtwc$Lon <- ifelse(jtwc$Lon < 0, jtwc$Lon + 360, jtwc$Lon)
# derive the bounded points
jtwc.bounded <- jtwc[jtwc$Lat >= latmin & jtwc$Lat <= latmax & jtwc$Lon >= lonmin & jtwc$Lon <= lonmax,]
# all these are TRUE
assert_that (all(jtwc.bounded$Lat >= latmin))
assert_that (all(jtwc.bounded$Lat <= latmax))
assert_that (all(jtwc.bounded$Lon >= lonmin))
assert_that (all(jtwc.bounded$Lon <= lonmax))
jtwc.unique <- unique(jtwc.bounded[,c(1,2)])
# merge with bounded (
jtwc.filter <- merge(jtwc.bounded, jtwc.unique, all.x = F, all.y = T, sort = F)
assert_that (all(jtwc.filter$Lat >= latmin))
assert_that (all(jtwc.filter$Lat <= latmax))
assert_that (all(jtwc.filter$Lon >= lonmin))
assert_that (all(jtwc.filter$Lon <= lonmax))
jtwc.filter <- jtwc.filter[with(jtwc.filter,order(Year,Month,Day,Hour,CY)),]
write.table(jtwc.filter,file = "test2_jul_par_1979-1993.csv", sep = ",", row.names = F)
这是一种使用 data.table
进行数据处理,然后使用 googleway
在 google 地图
library(googleway)
library(data.table) ## because I like working with data.table to do data manipulation
jtwc <- read.csv("~/Downloads/1979-1993_TC.csv")
setDT(jtwc) ## set as data.table
latmin <-5.00
latmax <- 25.00
lonmin <- 115.00
lonmax <- 135.00
df_bounds <- data.frame(north = latmax, south = latmin, west = lonmin, east = lonmax)
## apply a logical column whether the point is in the box
jtwc[, inBounds := Lat >= latmin & Lat <= latmax & Lon >= lonmin & Lon <= lonmax]
## create a column that identifies if the SN at some point passes through the box
jtwc[SN %in% jtwc[inBounds == TRUE, unique(SN)], passesThroughBox := T ]
jtwc[is.na(passesThroughBox), passesThroughBox := F]
## adding a colour for plotting
jtwc[, colour := ifelse(passesThroughBox, "#4286F4", "#F44141") ]
## you need a google maps API key to plot on Google Maps
map_key <- 'your_api_key'
google_map(key = map_key) %>%
add_polylines(data = jtwc, lat = "Lat", lon = "Lon", id = "SN", stroke_colour = 'colour',
mouse_over_group = 'passesThroughBox') %>%
add_rectangles(data = df_bounds, north = 'north', south = 'south', west = 'west', east = 'east',
fill_opacity = 0.1)
然后将鼠标悬停在线条上时,您可以看到通过的那些