Как изменить класс с фрейма данных на пространственный полигон?

Я нашел то же самое здесь Как преобразовать фрейм данных в пространственные координаты< /а>. Но в моем случае я получил очень большие данные.

exchange    longitude   latitude
AB  103.3281386 1.594218196
AB  103.3285929 1.593990735
AB  103.3312494 1.591424235
AB  103.3283736 1.594063254
AB  103.3536164 1.622771588
AB  103.3613242 1.627138676
AB  103.3560151 1.619455334
AB  103.3297071 1.593398614
AB  103.3269466 1.596574285
AB  103.3279517 1.593614052
AB  103.3281356 1.593848271
AB  103.3567136 1.620498495
AB  103.3668021 1.63456952
AB  103.359686  1.624821271
AB  103.3308963 1.585290892
AB  103.3319569 1.59104387
AB  103.3307149 1.592006748
AB  103.3283657 1.593675616
AB  103.3314873 1.591186363
AB  103.3319648 1.590585241
AB  103.3321508 1.590422594
AB  103.3318503 1.588685843
AB  103.3324507 1.594547225
AB  103.3442528 1.60909707
AB  103.3292733 1.593461728
AB  103.3288584 1.594312512
AB  103.329041  1.594135083
AB  103.3348961 1.59761749
AB  103.3500524 1.614224612

Невозможно сделать так, как они:

mydf <- structure(list(longitude = c(128.6979, 153.0046, 104.3261, 124.9019, 
126.7328, 153.2439, 142.8673, 152.689), latitude = c(-7.4197, 
-4.7089, -6.7541, 4.7817, 2.1643, -5.65, 23.3882, -5.571)), .Names = c("longitude", 
"latitude"), class = "data.frame", row.names = c(NA, -8L))

Итак, кто-нибудь может помочь мне изменить класс с data.frame на пространственный многоугольник?


person ahmad fikri    schedule 31.05.2016    source источник
comment
Это потому, что мои данные такие же, как и в другом сообщении. Но решение только для небольших данных. Если бы я получил, скажем, 100 данных. Как я могу использовать структуру (список (долгота = C (......)))   -  person ahmad fikri    schedule 31.05.2016
comment
Что касается вашего редактирования: очевидно, ваши данные не такие, как в другом посте. Пожалуйста, привыкайте предоставлять воспроизводимые примеры, как описано в ссылке RDC.   -  person lukeA    schedule 31.05.2016


Ответы (1)


мои данные такие же, как и в другом сообщении [...] Так кто-нибудь может помочь мне изменить classfrom data.frame на пространственный многоугольник?

library(sp)
sp <- SpatialPolygons(list(Polygons(list(Polygon(mydf[, -1])), ID=1)))
class(sp)
# [1] "SpatialPolygons"
# attr(,"package")
# [1] "sp"

или, если вы хотите, чтобы exchange был идентификатором полигона:

sp <- lapply(split(mydf[, -1], mydf[, 1]), Polygon)
sp <- SpatialPolygons(lapply(seq_along(sp), function(i) { 
  Polygons(list(sp[[i]]), ID = row.names(mydf[!duplicated(mydf[, 1]), ])[i] ) 
}))
# class(sp)
# [1] "SpatialPolygons"
# attr(,"package")
# [1] "sp"

Данные:

mydf <- read.table(header=T, text="
exchange   longitude   latitude
AB  103.3281386 1.594218196
AB  103.3285929 1.593990735
AB  103.3312494 1.591424235
AB  103.3283736 1.594063254
AB  103.3536164 1.622771588
AB  103.3613242 1.627138676
AB  103.3560151 1.619455334
AB  103.3297071 1.593398614
AB  103.3269466 1.596574285
AB  103.3279517 1.593614052
AB  103.3281356 1.593848271
AB  103.3567136 1.620498495
AB  103.3668021 1.63456952
AB  103.359686  1.624821271
AB  103.3308963 1.585290892
AB  103.3319569 1.59104387
AB  103.3307149 1.592006748
AB  103.3283657 1.593675616
AB  103.3314873 1.591186363
AB  103.3319648 1.590585241
AB  103.3321508 1.590422594
AB  103.3318503 1.588685843
AB  103.3324507 1.594547225
AB  103.3442528 1.60909707
AB  103.3292733 1.593461728
AB  103.3288584 1.594312512
AB  103.329041  1.594135083
AB  103.3348961 1.59761749
AB  103.3500524 1.614224612")
person lukeA    schedule 31.05.2016
comment
я не мог получить его. что такое mydf в вашем ответе? имя данных? - person ahmad fikri; 31.05.2016
comment
он говорит: "Ошибка в .local(obj,...): невозможно получить координаты из нечисловой матрицы" - person ahmad fikri; 31.05.2016
comment
Это из поста, на который вы ссылаетесь. - person lukeA; 31.05.2016
comment
моя проблема в том, что мои данные большие, скажем, у меня есть 100 точек. Это невозможно сделать, как они, mydf ‹- структура (список (долгота = c (128,6979, 153,0046, 104,3261, 124,9019, 126,7328, 153,2439, 142,8673, 152,689) , широта = c(-7,4197, -4,7089, -6,7541, 4,7817, 2,1643, -5,65, 23,3882, -5,571)), .Names = c(долгота, широта), class = data.frame, row.names = c( Н.А., -8л)) - person ahmad fikri; 31.05.2016
comment
Да, ты сказал это. Если я передам вышеприведенное значение mydf, я получу объект пространственных полигонов. На вопрос ответили как можно лучше, поскольку вы не последовали совету @RDC. - person lukeA; 31.05.2016
comment
Используйте Polygon(mydf[, -1]) вместо Polygon(mydf) - первый столбец не является частью координат. - person lukeA; 31.05.2016
comment
я не понял. Пишет: Ошибка в lapply(seq_along(lst), function(i) {: объект 'lst' не найден - person ahmad fikri; 01.06.2016
comment
К сожалению, здесь lst должно быть sp. Пожалуйста, попробуйте еще раз - person lukeA; 01.06.2016
comment
это тип пространственного многоугольника? если я наберу class(sp), он должен быть SpatialPolygon правильным? но он возвращает list - person ahmad fikri; 01.06.2016
comment
Вы должны снова обернуть его в SpatialPolygons - см. мое редактирование - person lukeA; 01.06.2016
comment
да ты правильно понял. Если возможно, вы можете добавить описание, потому что я новичок в r. многого не понял. цените свое время - person ahmad fikri; 01.06.2016
comment
Это немного сложно. Сначала мы разделяем все столбцы фрейма данных, кроме первого, на первый. Затем мы делаем каждое разделение (которое представляет собой фрейм данных long/lat) объектом Polygon. Таким образом, первый lapply получает список объектов Polygon. Следующий lapply получает список объектов Polygons. И это то, что мы можем преобразовать в объект SpatialPolygons. Посмотрите файлы справки, например. ?Polygons. - person lukeA; 01.06.2016