현재 저는 선형 네트워크 (자동차 충돌)에서 포인트 패턴 이벤트가있는 프로젝트를 진행하고 있으며 spatstat
책의 17 장 "공간 포인트 패턴 : R을 사용한 방법론 및 응용"을 읽고 있습니다.
이 책의 저자 lpp
는 선형 네트워크에서 점 패턴을 분석하는 데 필요한 새로운 객체 클래스를 정의했다고 설명 합니다. 각 lpp
개체 의 골격은 개체이며 linnet
개체를 생성하는 여러 기능이 있습니다 linnet
. 내 응용 프로그램의 경우 관련 기능은 linnet
및 as.linnet
입니다. 이 함수 linnet
는 각 꼭지점의 공간적 위치와 가장자리로 연결된 꼭지점에 대한 정보로부터 선형 네트워크 객체를 생성하고, 지정된 거리 임계 값을 사용하여 네트워크의 연결성을 추론하는 객체 로 변환되는 객체에 as.linnet
함수를 적용 할 수 있습니다. .psp
linnet
제가이 질문을하는 이유 sf
는 LINESTRING
지오메트리가 있는 객체 에서 시작하는 linnet 객체를 효율적으로 만드는 방법을 모르기 때문 입니다. 내가 아는 한, sf
객체를 sp
객체 (즉, SpatialLines
객체)로 변환 할 수 있습니다. 그런 다음 sp
객체를 객체로 변환 psp
( as.psp
함수 사용 ) 한 다음 다음을 psp
사용하여 객체를 linnet 객체로 변환 할 수 있습니다 .as.psp.linnet
함수 (maptools 패키지에 정의 됨). 이 접근 방식의 주요 문제는 (패키지 작성자가 책에서 말했듯이) 해당하는 linnet이 네트워크에서 인공 교차를 생성하기 때문에 네트워크 데이터에서 고가 또는 지하가 발생할 때마다 추론 된 네트워크가 잘못되었다는 것입니다. 게다가 저자가 책에서 말했듯이 코드는 기하 급수적으로 느려집니다.
다음 코드는 지금까지 수행 한 작업의 단순화 된 버전이지만 객체에서 linnet 객체를 생성하는 더 쉽고 더 나은 방법이 있어야한다고 생각 sf
합니다. 이 linnet
함수를 사용 하지만 문제는 네트워크의 해당 정점에 대한 (희소 한) 인접 행렬 또는 네트워크 가장자리 사이의 링크 행렬을 만드는 방법을 모른다는 것입니다.
# packages
library(sf)
#> Linking to GEOS 3.6.1, GDAL 2.2.3, PROJ 4.9.3
library(spatstat)
#> Loading required package: spatstat.data
#> Loading required package: nlme
#> Loading required package: rpart
#>
#> spatstat 1.61-0 (nickname: 'Puppy zoomies')
#> For an introduction to spatstat, type 'beginner'
#>
#> Note: spatstat version 1.61-0 is out of date by more than 11 weeks; a newer version should be available.
library(maptools)
#> Loading required package: sp
#> Checking rgeos availability: TRUE
library(osmdata)
#> Data (c) OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright
# download data
iow_polygon <- getbb("Isle of Wight, South East, England", format_out = "sf_polygon", featuretype = "state") %>%
st_transform(crs = 27700)
iow_highways <- st_read("https://download.geofabrik.de/europe/great-britain/england/isle-of-wight-latest.osm.pbf", layer = "lines") %>%
st_transform(crs = 27700)
#> Reading layer `lines' from data source `https://download.geofabrik.de/europe/great-britain/england/isle-of-wight-latest.osm.pbf' using driver `OSM'
#> Simple feature collection with 44800 features and 9 fields
#> geometry type: LINESTRING
#> dimension: XY
#> bbox: xmin: -5.716262 ymin: 43.35489 xmax: 1.92832 ymax: 51.16517
#> epsg (SRID): 4326
#> proj4string: +proj=longlat +datum=WGS84 +no_defs
# subset the data otherwise the code takes ages
iow_highways <- iow_highways[iow_polygon, ] %>%
subset(grepl(pattern = c("primary|secondary|tertiary"), x = highway))
# transform as sp
iow_highways_sp <- as(iow_highways %>% st_geometry(), "Spatial")
# transform as psp
iow_highways_psp <- as.psp(iow_highways_sp)
# transform as linnet
iow_highways_linnet <- as.linnet.psp(iow_highways_psp, sparse = TRUE)
네트워크의 각 꼭지점의 좌표를 추출 할 수 있습니다.
stplanr::line2points(iow_highways)
#> Simple feature collection with 2814 features and 1 field
#> geometry type: POINT
#> dimension: XY
#> bbox: xmin: 430780.7 ymin: 75702.05 xmax: 464851.7 ymax: 96103.72
#> epsg (SRID): 27700
#> proj4string: +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +towgs84=446.448,-125.157,542.06,0.15,0.247,0.842,-20.489 +units=m +no_defs
#> First 10 features:
#> id geometry
#> 1 1 POINT (464851.7 87789.73)
#> 2 1 POINT (464435.4 88250.85)
#> 3 2 POINT (464390.9 87412.27)
#> 4 2 POINT (464851.7 87789.73)
#> 5 3 POINT (462574.6 88987.62)
#> 6 3 POINT (462334.6 88709.92)
#> 7 4 POINT (464066.9 87576.84)
#> 8 4 POINT (464390.9 87412.27)
#> 9 5 POINT (464420 88227.79)
#> 10 5 POINT (464398.7 88225.33)
하지만 인접 행렬을 만드는 방법을 모르겠습니다.
2019-12-02에 reprex 패키지 (v0.3.0)로 생성됨
로가는 psp
도중에 형식을 검토하는 이유를 잘 모르겠습니다 linnet
. 첫 번째 코드 청크의 마지막 두 줄을 다음과 같이 바꾸십시오.
iow_highways_linnet <- as.linnet.SpatialLines(iow_highways_sp)
이것은 정점을 공유하는 선 으로 SpatialLines
직접 변환 linnet
하고 융합합니다. 두 선이 교차점에 꼭지점이 없으면 지하도가 고가도로 융합 될 것이라고 생각하지 않습니다. 아래 예를 참조하십시오.
l1 <- sf::st_linestring(matrix(c(-1,1,-1,1,1,1,-1,-1), ncol = 2))
l2 <- sf::st_linestring(matrix(c(-1,-1,1,1,2,1,-1,-2), ncol = 2))
l_sf <- sf::st_sf(id = 1:2, geom = sf::st_sfc(l1,l2))
l_sp <- sf::as_Spatial(l_sf)
l <- maptools::as.linnet.SpatialLines(l_sp)
plot(l)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다