R-Blogger블로그·해설한국어2023-11-17
포인트를 다각형에 클러스터링
클러스터링을 통한 다각형 생성이 게시물에서는 이전에 작성한 lynx발생 데이터(2015~2023년)를 활용해, 개체의 핵심 서식지를 시각화하고자 합니다. 데이터에는 많은 이산적 관측이 포함돼 있어, DBSCAN 알고리즘을 이용해 포인트를 클러스터링하고, 각 클러스터에 대해 비포물선 형태의 외곽선을 생성합니다. 클러스터 간 최소 12km 거리와 클러스터당 최소 5개의 포인트를 기준으로 설정했습니다.library(rgbif) library(tidyverse) library(sf) library(leaflet) library(dbscan) library(concaveman) # GBIF에서 데이터 가져오기 lynx <- occ_download_import() %>% drop_na(decimalLongitude, decimalLatitude) %>% filter(year >= "2015", countryCode == "FR", occurrenceStatus == "PRESENT") %>% st_as_sf(coords = c("decimalLongitude", "decimalLatitude"), crs = "EPSG:4326", remove = FALSE) # 클러스터링: 라만투 투영으로 단위(m) 확보 clusters <- lynx %>% st_transform("EPSG:2154") %>% st_coordinates() %>% dbscan(eps = 12000, minPts = 5) # 비포물선 형태 외곽선 생성 concave_hulls <- bind_cols(tibble(cluster = clusters$cluster)) %>% filter(cluster != 0) %>% group_by(cluster) %>% summarise(nd = n_distinct(decimalLongitude, decimalLatitude), .groups = "drop") %>% filter(nd 2) %>% mutate(geom = map(geometry, ~ concaveman(st_sf(st_sfc(.x)), concavity = 1.7))) %>% st_drop_geometry() %>% unnest(geom) %>% st_sf(crs = "EPSG:4326") %>% st_zm() # 지도 시각화 lynx %>% leaflet() %>% addCircleMarkers(radius = 0.1, opacity = 0.1) %>% addPolygons(data = concave_hulls, color = "red") %>% addTiles()결과적으로 4개의 클러스터가 도출되었습니다: 주라(Jura), 보제(North and South)와 디종 서쪽이 해당 지역입니다. 이외에 서식지 면적을 근사하면 다음과 같습니다.concave_hulls %>% st_area() %>% sum() %>% units::set_units(km^2)결과: 17 925.6 km²입니다.
원문 URL
전체 글은 원문 페이지에서 이어서 읽을 수 있습니다.
- 작성자
- R-Blogger
- 출처
- R-Blogger
- 플랫폼
- R-Blogger
- 분류
- 블로그·해설
- 언어
- 한국어
- 발행일
- 2023-11-17