Генерация образцов в SF MULTIPOLYGON в R - PullRequest
1 голос
/ 18 января 2020

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

library(osmdata)
bb <- getbb(place_name= "Shetland")
osm_box <- opq(bbox = bb) %>% 
  add_osm_feature(key = "natural", value = "coastline") %>%
  osmdata_sf()

И затем я создаю sf функцию MULTIPOLYGON:

library(sf)
coast <- osm_box$osm_lines %>% 
   st_union() %>% 
   st_line_merge() %>% 
   st_cast("MULTIPOLYGON") %>%
   st_transform(27700)

Это, похоже, нормально. Теперь, когда я пытаюсь сгенерировать мои точки выборки:

coast %>% st_sample(1000, type= "hexagonal")

, я получаю один объект типа POINT вместо того, что я ожидаю, 1000 объектов POINT, расположенных внутри МНОГОПОЛИГОНА.

Geometry set for 1 feature 
geometry type:  POINT
dimension:      XY
bbox:           xmin: 396882.7 ymin: 1138217 xmax: 396882.7 ymax: 1138217
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
POINT (396882.7 1138217)

Есть идеи?!

ОБНОВЛЕНИЕ

Ну, похоже, это работает:

# Generate a polygon of the coast line
coast <- osm_box$osm_lines %>% st_union() %>% 
  st_line_merge() %>% 
  st_polygonize() %>%
  st_transform(27700)

# Generate 100 regular spaced samples within the polygon
samples <- st_sample(coast, 100, type= "regular", exact=F)

Geometry set for 100 features 
geometry type:  POINT
dimension:      XY
bbox:           xmin: 396861.1 ymin: 1109326 xmax: 466072.5 ymax: 1217457
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 5 geometries:
POINT (429729.3 1177035)
POINT (446778.1 1153826)
POINT (448614.3 1193497)
POINT (431511.4 1186704)
POINT (457445.3 1203824)

Я не совсем уверен, почему первый часть кода не работает, как ожидалось. Будь хорошим, чтобы знать. Функция st_polygonize(), казалось, имела значение.

...