Нет ничего плохого в наличии двух геометрий во фрейме данных sf, но только одна из них может быть геометрией, если она используется с функциями, которые принимают неявную геометрию, например, st_centroid(foo)
, которая получает центроиды заданной геометрии.
Для других геометрий вы можете работать с этим именованным столбцом, например st_centroid(foo$source_geom)
.
Для фрейма данных nc
с двумя геометриями многоугольника вы можете сначала вычислить линию между центроидами объединение точек, чтобы сделать MULTIPOINT, а затем приведение их к LINESTRING. Например, для первой строки:
> st_cast(st_union(c(st_centroid(nc$source_geom[1]), st_centroid(nc$dest_geom[1]))),"LINESTRING")
Geometry set for 1 feature
geometry type: LINESTRING
dimension: XY
bbox: xmin: -81.49826 ymin: 36.42228 xmax: -77.41056 ymax: 36.4314
epsg (SRID): NA
proj4string: NA
LINESTRING (-81.49826 36.4314, -77.41056 36.42228)
Вы должны сделать это построчно, иначе вы в конечном итоге будете работать со всем вектором геометрии.
Полный пример. Сделайте library(spdep)
и example(poly2nb)
, чтобы получить nc.sids
.
Сначала разбейте его на два столбца и 5 случайных строк:
> nc = nc.sids[,c("NAME","FIPS")]
> nc = nc[sample(1:nrow(nc.sids),5),]
> nc
Simple feature collection with 5 features and 2 fields
geometry type: MULTIPOLYGON
dimension: XY
bbox: xmin: -83.73952 ymin: 34.36442 xmax: -78.16968 ymax: 36.54607
epsg (SRID): NA
proj4string: NA
NAME FIPS geometry
82 Cumberland 37051 MULTIPOLYGON (((-78.49929 3...
96 Bladen 37017 MULTIPOLYGON (((-78.2615 34...
13 Granville 37077 MULTIPOLYGON (((-78.74912 3...
78 Macon 37113 MULTIPOLYGON (((-83.10629 3...
14 Person 37145 MULTIPOLYGON (((-78.8068 36...
Допустим, функция 1 переходит к функции 2, 2 к 3 и т. Д. c. Создайте новый столбец геометрии:
> nc$dest_geom = nc$geometry[c(2,3,4,5,1)]
Теперь сделайте линию, соединяющую центроиды:
> nc$join_geom = st_sfc(sapply(1:nrow(nc),function(i)st_cast(st_union(c(st_centroid(nc$geometry[i]), st_centroid(nc$dest_geom[i]))),"LINESTRING")))
Участок:
> plot(nc$geom)
> plot(nc$join_geom,add=TRUE,lty=2)