2015-10-15 4 views
1

Используя leaflet, я пытаюсь построить несколько строк и установить их цвет на основе переменной скорости. Мои данные начинаются с уровня кодированной полилинии (т. Е. Серии lat/long points, закодированной как буквенно-цифровая строка) с одним значением скорости для каждой EPL.Создание SpatialLinesDataFrame из объекта SpatialLines и базового df

Я могу декодировать полилинии для получения длинной/длинной серии (спасибо Max, here), и я могу создавать сегменты из этих серий точек и отформатировать их как объект (спасибо Kyle Walker, here).

Моя проблема: я могу правильно построить линии, используя leaflet, но я не могу присоединиться к объекту SpatialLines к базовым данным, чтобы создать SpatialLinesDataFrame, и поэтому я не могу закодировать цвет линии на основе скорости var. Я подозреваю, что проблема заключается в том, что идентификаторы, которые я назначаю сегментам SL, не соответствуют тем, которые присутствуют в базовом df.

Объектами я пытался присоединиться, с SpatialLinesDataFrame():

  1. "sl_object", в объекта с ~ 140 наблюдений, по одному для каждого сегмента; Я использую код Кайла, связанный выше, с одним ключевым изменением - вместо создания произвольного итеративного значения ID для каждого сегмента я вытягиваю связанный идентификатор из своих базовых данных. (Или, по крайней мере, я пытаюсь.) Итак, я заменил:

    id <- paste0("line", as.character(p))

    с

    lguy <- data.frame(paths[[p]][1]) id <- unique(lguy[,1])

  2. "speed_object", ДФ с ~ 140 наблюдениями одна скорость var и row.names установлена ​​на тот же идентификатор var, который, как я думал, я создал в объекте SL выше. (Число наблюдений никогда не будет превышать, но может быть меньше, чем число сегментов в объекте SL.)

Мой присоединения Код:

splndf <- SpatialLinesDataFrame(sl = sl_object, data = speed_object)

И результат:

row.names of data and Lines IDs do not match

Спасибо, все. Я публикую это частично, потому что я видел некоторые подобные вопросы, в том числе некоторые, относящиеся конкретно к изменению вывода ID отличного инструмента Kyle, и не смогли найти хороший ответ.

EDIT: Включая образцы данных.

С sl_obj, один сегмент:

print(sl_obj) 

Slot "ID": 
[1] "4763655" 

[[151]] 
An object of class "Lines" 
Slot "Lines": 
[[1]] 
An object of class "Line" 
Slot "coords": 
      lon  lat 
1955 -74.05228 40.60397 
1956 -74.05021 40.60465 
1957 -74.04182 40.60737 
1958 -74.03997 40.60795 
1959 -74.03919 40.60821 

И соответствующая запись из speed_obj:

row.names speed 
...  ... 
4763657 44.74 
4763655 34.8 # this one matches the ID above 
4616250 57.79 
...  ... 
+1

Являются ли идентификаторы линий итеративными при построении кадра данных? Насколько я знаю, имена row.names назначаются во время создания, в то время как идентификаторы строк будут ссылаться на элемент в наборе данных линии. Можно ли разместить фрагмент этих данных или ссылку, где мы можем найти похожие данные? Я хочу сказать 'dput()' данные, но я никогда не делал этого с пространственными строками, поэтому я не уверен, как это будет реагировать. – Badger

+0

Нет - идентификаторы, с которыми я пытаюсь присоединиться, представляют собой семизначный ключ, который однозначно идентифицирует сегменты. Я назначаю их явно как «row.names» для объекта speed_object в его создании, и мое изменение в коде Kyle выше предназначалось для их переноса из исходного набора данных. Будет включать некоторые образцы данных в редактировании прямо сейчас. –

+0

О, я вижу это, когда перечитываю ваш вопрос, извините. По какой причине вы используете 'row.names' для назначения? Я чувствую, что вы можете сделать строки 'sldf', а затем' match() 'идентификатор присваивает скорости, где совпадают идентификаторы. – Badger

ответ

1

я, возможно, расшифровал вопрос.

Когда я втягиваю данные в свои пространственные линии, и я проверяю класс, который он читает как «Кадр данных пространственных линий», хотя я знаю, что это простой линейный шейп-файл, я использую readOGR для ввода данных и я верьте, что здесь происходит конверсия. Имея это в виду, назначение скорости относительно просто.

sl_object$speed <- speed_object[ match(sl_object$ID , row.names(speed_object)) , "speed" ] 

Это должен сделать трюк, как и я готов поспорить, ваш class(sl_object) является «Frame Пространственных линий данных».

EDIT: Я получил ту же ошибку, как ОП, свожу меня, чтобы проверить class()

Я нахожусь под впечатлением, что ошибка, которая была заселена для вас, потому что вы пытаетесь заставить кадр данных в данный и R не был поклонником этого.

+0

Хмм, нет кубиков. '> класс (sl_obj) [1] "SpatialLines" атр ("пакет") [1] "SP"' код включить выдает эту ошибку: 'Ошибка в sl_obj $ ID: no $ метод для объекта без атрибутов Кроме того, я не использую 'readOGR' для создания sl_obj - он создается с помощью' SpatialLines() '- см. процесс Кайла, связанный выше. Соответствующий бит начинается с 'sp_lines <- SpatialLines ...' –

+0

Да, я вижу, что теперь (захваченные данные Килса) очень озадачивает. – Badger

2

Хорошо, я понял. Ошибка не понравилась факту, что мой speed_obj был не такой же длины, как мой sl_obj, как упоминалось here. ("данные = объект класса data.frame, а количество строк в данных должно быть равно количеству строк элементов в сл)

Разрешение: используется быстрый цикл, чтобы вытащить все из уникальных линий идентификаторы, а затем выполняются левый присоединиться к этому списку уников создать исчерпывающий speed_obj (НСБ, которые, кажется, OK).

ids <- data.frame() 
for (i in (1:length(sl_obj))) { 
id <- data.frame([email protected][[i]]@ID) 
ids <- rbind(ids, id) 
} 

colnames(ids)[1] <- "linkId" 
speed_full <- join(ids, speed_obj) 
speed_full_short <- data.frame(speed_obj[,c(-1)]) 
row.names(speed_full_short) <- speed_full$linkId 

splndf <- SpatialLinesDataFrame(sl_obj, data = speed_full_short, match.ID = T) 

Работает отлично сейчас

4

чтобы избавиться от этого сообщения об ошибке , либо сделать row.names of da та и линии Идентификаторы матч по подготовке sl_object и/или speed_object, или, в случае, если вы уверены, что они должны быть согласованы в порядке их появления, используйте

splndf <- SpatialLinesDataFrame(sl = sl_object, data = speed_object, match.ID = FALSE) 

Это документированный в ?SpatialLinesDataFrame.

+0

простой peasy. спасибо за это быстрое решение! – joaoal

 Смежные вопросы

  • Нет связанных вопросов^_^