Как сохранить простой объект с несколькими геометриями?

#r #geometry #gis #sf

Вопрос:

Я хотел бы организовать свои данные в виде простого объектного объекта, используя sf пакет в R, содержащий несколько геометрических столбцов, например многоугольник, его центр тяжести и буфер, которые имеют одинаковые атрибуты.

У меня возникли трудности с сохранением такого объекта на диске. Например, это то, что я получаю, если пытаюсь сохранить его в виде шейп-файла с st_write() :

 Error in clean_columns(as.data.frame(obj), factorsAsCharacter) : 
  list columns are only allowed with raw vector contents

Warning:
1: In abbreviate_shapefile_names(obj) :
  Field names abbreviated for ESRI Shapefile driver
2: In clean_columns(as.data.frame(obj), factorsAsCharacter) :
  Dropping column(s) nghbrhd,landscp of class(es) sfc_POLYGON;sfc,sfc_POLYGON;sfc
 

Конечно, я мог бы разделить его на несколько объектов, каждый из которых имеет одну геометрию и все атрибуты, но я нахожу это более запутанным и подверженным ошибкам, чем наличие всех данных в одном файле.

Как я могу (лучше всего) сохранить такой объект?

Комментарии:

1. Вам просто нужно прочитать/записать данные из R?

2. да, я работаю только в R

3. Если вы работаете только в R, вы пробовали saveRDS() ?

Ответ №1:

При сохранении объектов с помощью sf::st_write() вы должны учитывать контекст вашего выходного объекта; два популярных формата файлов — шейп — файл ESRI / *.shp и геопакет OGC / *.gpkg-специально разрешают только одну геометрию для каждого сохраненного шейп-файла.

Это особенность, а не ошибка формата выходного файла.

Если ваш рабочий процесс требует сохранения объектов с несколькими геометриями, рассмотрите либо конкретный формат R saveRDS() , либо, если требуется обмен с другими пространственными инструментами, один из форматов, допускающих несколько геометрий для каждого объекта — база данных PostgreSQL / PostGIS-это то, что я бы использовал в такой ситуации.

Комментарии:

1. Да, я отчасти осознавал, что шейп-файл не сможет понять несколько геометрий. saveRDS() сработало просто отлично, спасибо!