Экспорт шейп-файла многоугольника в виде списка пар вершин XY - PullRequest
0 голосов
/ 17 октября 2019

Для непрерывного шейп-файла многоугольника мне нужен файл координат вершины многоугольника в формате, подобном следующему, в качестве входных данных для унаследованной программы:

polygon1name, AUTO
  -120.408750    34.591250
  -120.398313    34.591250
  -120.396250    34.593313
  -120.396250    34.593354
END
polygon2name, AUTO
  -120.423354    34.641250
  -120.423313    34.641250
  -120.421250    35.643313
  -120.421250    35.647521
END

Из примера файла похоже, что устаревшая программа ожидаетпары в порядке рисования против часовой стрелки. Вот пример с округами Северной Каролины в качестве примера. Я надеюсь на помощь в том, как экспортировать пары XY и включить , AUTO и END штук.

library(tidyverse) #for the %>% pipes and transmute()
library(sf) #for st_read()
library(rmapshaper) #for ms_simplify()

nc <- st_read(system.file("shape/nc.shp", package="sf")) %>%
      transmute(NAME, geometry) %>% #keeps just the county column for simplicity
      ms_simplify(keep = 0.01) #reduces the number of vertices for simplicity
plot(nc)

enter image description here

Есть идеи?

Спасибо.

1 Ответ

2 голосов
/ 17 октября 2019

Не уверен насчет порядка координат против часовой стрелки, но это отвечает части вашего вопроса в формате вывода.

#extract coordinates from sf
coord    <- st_coordinates(nc) %>% 
  as.data.frame() %>%
  group_by( L3 ) %>% 
  mutate(L4 = row_number() )

#extract data from sf
polygons <- st_drop_geometry(nc) %>% 
  mutate( NAME = as.character( NAME ) ) %>%
  rownames_to_column( var = "id" ) %>% 
  mutate( id = as.numeric(id) ) %>%
  #join coordinates
  left_join( coord, by = c("id" = "L3") )

#split polygons-dataframe to list
l <- split( polygons, f = polygons$id )

#extract text needed from each polygon
result <- lapply( l, function(x) {
  paste0 ( paste0( unique( x$NAME ), ", AUTO\n" ),
           paste0( "  ", x$X, "    ", x$Y, collapse = "\n" ),
           "\nEND" )
})

#unlist and write lines
writeLines( unlist(result) )

# Ashe, AUTO
# -81.4727554    36.2343559
# -81.7410736    36.3917847
# -81.6699982    36.5896492
# -81.3452988    36.5728645
# -81.2398911    36.3653641
# -81.4727554    36.2343559
# END
# Alleghany, AUTO
# -81.2398911    36.3653641
# -81.3452988    36.5728645
# -80.9034424    36.5652122
# -80.9563904    36.4037971
# -81.2398911    36.3653641
# END
# Surry, AUTO
# -80.4563446    36.2425575
# -80.874382    36.2338829

update

Длячасть против часовой стрелки: взгляните на аргумент check_ring_dir sf::st_read().

check_ring_dir
логический;если ИСТИНА, направления многоугольного кольца проверяются и при необходимости исправляются (если смотреть сверху: внешнее кольцо против часовой стрелки, отверстия по часовой стрелке)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...