Вложенные маркеры в буклете R - PullRequest
1 голос
/ 28 октября 2019

У меня есть dataframe, содержащий вложенные данные экологического обследования. Концептуальное описание данных - на «верхнем» уровне находится сайт обследования;внутри сайтов находятся n ловушки;в ловушках может быть поймано n животных.

Я хотел бы отобразить карту Leaflet, показывающую маркеры, которые соответствуют верхнему уровню данных (то есть участкам обследования). Когда вы нажимаете на сайт опроса, он должен разветвляться и показывать маркеры каждой ловушки в пределах сайта опроса. При нажатии на ловушку, он должен затем отобразить список животных, пойманных в ловушке (на этом этапе будет нормально всплывающее окно Leaflet).

Я понятия не имею, возможно ли это вообщев пределах R Leaflet, несмотря на многочисленные поиски в Google и / или SO. Я нашел одно потенциальное решение Javascript , но я не знаю, перешло ли оно точно для решения проблемы, с которой я столкнулся. Однако, по крайней мере, наведение на маркер и отображение вложенных маркеров - это та функция, которая мне нужна при просмотре traps на сайтах .

Я включил ниже пример вложенного фрейма данных некоторых фиктивных данных, а также скелеты Leaflet представ. В фиктивных данных для простоты я назначил каждому site один и тот же широту / долготу. При нажатии на любой site (001, 002, 003) ловушки будут разветвляться с этого сайта. На сайте 001 есть только 1 уникальная ловушка (ID = 001-001), но на сайте 2 есть две уникальные ловушки (002-001 и 002-002). На сайте 003 есть только одна ловушка.

library(leaflet)
library(tidyverse)

x<-as_tibble(data.frame(site = c("001", "001", "001", "002", "002", "002", "003"), 
              trap = c("001-001", "001-001", "001-001", "002-001", "002-001", "002-002", "003-001"),
              animal = c("001-001-001", "001-001-002", "001-001-003", "002-001-001", "002-001-002", "002-002-003", "003-001-001"),
              lat = c(51.1, 51.1, 51.1, 52.4, 52.4, 52.4, 51.5),
              lon = c(-1.1, -1.1, -1.1, -1.7, -1.7, -1.7, -1.2)))


leaflet() %>%
  addProviderTiles(providers$OpenStreetMap, options = providerTileOptions(noWrap = TRUE), group = "Open Street Map") %>%
  setView(lng = -1.900796, lat = 52.479380, zoom = 7) %>% 
  addLayersControl(baseGroups = c("Open Street Map")))

Надеясь на решение проблемы - любая помощь будет очень признательна.

1 Ответ

3 голосов
/ 29 октября 2019

Существует возможность создавать кластеры (clusterOptions = TRUE) в функции addCircleMarkers.

Я не уверен, что приведенный ниже код генерирует то, что вы хотите, но он может помочь вамследующий шаг.

leaflet() %>%
  addProviderTiles(providers$OpenStreetMap, options = providerTileOptions(noWrap = TRUE), group = "Open Street Map") %>%
  setView(lng = -1.900796, lat = 52.479380, zoom = 7) %>% 
  addLayersControl(baseGroups = c("Open Street Map")) %>% 
  addCircleMarkers(data = x, lng = ~lon, lat = ~lat, clusterOptions = TRUE, 
                   popup = paste("<b>Site:</b>", x$site, "<br>",
                                 "<b>lon:</b>", x$lon, "<br>",
                                 "<b>lat:</b>", x$lat, "<br>",
                                 "<b>trap:</b>", x$trap, "<br>",
                                 "<b>animal:</b>", x$animal))

Я добавил всплывающее окно, чтобы отследить, какой маркер был, какой, но вы можете сделать что-то с цветами или формами, если это более визуально привлекательно.

Дополнительное примечание : Как вы видите, я создал всплывающее окно с некоторым html-скриптом для форматирования (<b></b>) и разрывов строк (<br>). Вы можете использовать другие html-трюки в этих всплывающих окнах, если хотите, они обычно работают и легко настраиваются. Однако пакет leafpop может быть более быстрым способом добавления таблиц, изображений и графиков во всплывающих окнах.

...