Отфильтровать треки TC (точки широты и долготы) по заданному блоку сетки

Я использую R для фильтрации треков тропических циклонов, проходящих через сетку. У меня есть файл csv, содержащий треки, и я конвертирую их в шейп-файл.

Я хотел отфильтровать только точки с одним и тем же идентификатором (столбец «SN» в приведенном ниже примере данных), которые прошли через заданный блок сетки (от 5N до 25N и от 115E до 135E). Ниже приведен код, который я использую, и ссылка на данные.

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)

Проблема:

Этот код не работает должным образом. Когда я запустил скрипт, я все еще вижу нестандартные треки.

Может ли кто-нибудь предложить способ улучшить это?

Буду признателен за любую помощь.


person Lyndz    schedule 20.04.2017    source источник
comment
Дело принято. Спасибо за предложение. Выложил образец данных.   -  person Lyndz    schedule 20.04.2017
comment
Вы используете какую-либо библиотеку построения в R для "построения треков"?   -  person SymbolixAU    schedule 20.04.2017
comment
ах.но .. Я использую ГИС для преобразования точек в шейп-файл линии. Я перефразирую свой вопрос, чтобы было понятнее.   -  person Lyndz    schedule 20.04.2017


Ответы (3)


Вот подход, который использует 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)

введите описание изображения здесь

Затем при наведении курсора на линии можно увидеть те, которые проходят через

введите описание изображения здесь

person SymbolixAU    schedule 20.04.2017

Для фильтрации вы можете использовать

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()
person B Williams    schedule 20.04.2017

Этот код исправляет основную проблему, но я не знаю, полностью ли он решает вашу проблему. Ваш исходный код, похоже, предполагает, что комбинация CY и SN уникальна в наборе данных, что, как я считаю, неверно. Для одной и той же пары должны быть комбинации с разными размерами. Эта версия сохраняет boundedvalues, а затем объединяется с этой boundedtable

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)
person Andrew Lavers    schedule 20.04.2017