Відкриття формфайлу в R? [зачинено]


64

Мені потрібно відкрити файл форми з ArcMap в R, щоб використовувати його для подальшого геостатистичного аналізу. Я перетворив його в текстовий файл ASCII, але в R він розпізнається як data.frame. Функція координат не працює, як тільки х і у визнаються нечисловими.

Не могли б ви допомогти впоратися з цим?


1
Який файл форми? Я припускаю очки, оскільки він має стовпчик X і Y?
Simbamangu

Відповіді:


54

Використовуйте безпосередньо файл форми. Ви можете це легко зробити за допомогою пакунків rgdalабо sfпакетів та прочитати фігуру в об'єкті. Для обох пакетів потрібно вказати dsn- джерело даних, яке у випадку файлу форм є каталогом , і layer- яке ім'я файлу форми, мінус розширення:

# Read SHAPEFILE.shp from the current working directory (".")

require(rgdal)
shape <- readOGR(dsn = ".", layer = "SHAPEFILE")

require(sf)
shape <- read_sf(dsn = ".", layer = "SHAPEFILE")

(Для rgdal, в OSX або Linux ви не можете використовувати «~» стенографії для домашнього каталогу в якості джерела даних ( dsn) каталогу - в іншому випадку ви отримаєте НЕ приносить користь «не може відкрити джерело даних» ПОВІДОМЛЕНЬ. sfПакетів не мають це обмеження, серед деяких інших переваг.)

Це дасть вам об’єкт, який представляє собою просторовий * DataFrame (точки, лінії чи багатокутники) - поля таблиці атрибутів потім вам доступні так само, як і звичайний кадр даних, тобто shape$IDдля стовпця ідентифікатора.

Якщо ви хочете використовувати імпортований файл ASCII, вам слід просто перетворити текстові (символьні) поля x і y у числа, наприклад:

shape$x <- as.numeric(as.character(shape$x))
shape$y <- as.numeric(as.character(shape$y))
coordinates(shape) <- ~x + y

Редагувати 2015-01-18 : зауважте, що rgdal трохи кращий, ніж maptools (що я спочатку запропонував тут), насамперед тому, що він читає та записує інформацію про проекцію автоматично.

Примітки:

  • вкладені as.numeric(as.character())функції - якщо ваш текст ASCII читався як фактор (ймовірно), це гарантує отримання цифрових значень замість рівнів факторів.
  • rgdalі sfмають заплутані способи доступу до різних типів файлів і баз даних (наприклад, для файлу GPX, dsn є ім'ям файлу, і розшаровує окремі компоненти, такі як шляхові точки, точки сліду тощо), і потрібно уважне читання онлайн-прикладів.

R слід проаналізувати числові поля, тож я міг би уявити, що в x і y є спеціальний тип символів. Крім того, при імпорті, якщо не вказано інше, поля символів будуть приведені у фактор. Таким чином, просте уповільнення з "числом" не працюватиме. Я б також використовував "readORG" в "rgdal", а не maptools.
Джефрі Еванс

@ Джеффрі, readOGR, безумовно, кращий шлях - дивіться деякі дискусії щодо пізніх питань R тут на gis.SE. Хороша точка щодо факторного примусу; оновиться з вкладеними, as.characterщоб подолати проблему.
Сімбамангу

Ви можете використовувати ~, але вам доведеться викликати path.expand у каталозі, наприклад, readOGR (dsn = path.expand ("~ / Downloads / cb_2016_us_zcta510_500k /"), layer = "cb_2016_us_zcta510_500k")
hd1

3
Якось мені все ж потрібне було уточнення цієї фактично правильної відповіді: dsn="directory where the shapefile, projection file, etc are located" layer="name of the file without .shp extention"
Ufos

Хочу зазначити, що dsnаргумент не повинен містити косої косої риси --- напр., dsn = "C:/Users/Downloads/"Повинен бути dsn = "C:/Users/Downloads". Сподіваюсь, це вирішує чиїсь розлади ...
Кім

21

Я погоджуюся з Simbamangu і вирішується з точки зору збереження форм-файлів, але хочу спрямувати вашу увагу спеціально на бібліотеку rgdal. Перейдіть за посиланням, запропонованим gisssol для NCEAS, і виконайте вказівки щодо rgdal. Встановити на деяких машинах може бути складно, але це може істотно покращити результати, коли справа стосується прогнозів.

Бібліотека maptools є чудовою і дозволяє визначити проекцію для формату файлу, який ви читаєте, але для цього вам потрібно знати, як вказати цю проекцію у форматі proj4. приклад може виглядати приблизно так:

project2<-"+proj=eqdc +lat_0=0 +lon_0=0 +lat_1=33 +lat_2=45 +x_0=0 +y_0=0 +ellps=GRS80    
   +datum=NAD83 +units=m +no_defs" #USA Contiguous Equidistant Conic Projection
data.shape<-readShapePoly("./MyMap.shp",IDvar="FIPS",proj4string=CRS(project2))
plot(data.shape)

Якщо ви хочете пройти цей маршрут, то я рекомендую http://spatialreference.org як місце, щоб визначити, як виглядає ваша проекція у форматі proj4. Якщо вам це здасться клопотом, rgdal полегшить його, прочитавши файл .prj формату ESRI формату (файл, який містить визначення проекції ESRI для shapefile. Щоб використовувати rgdal у тому ж файлі, ви просто напишіть:

library(rgdal)
data.shape<-readOGR(dsn="C:/Directory_Containing_Shapefile",layer="MyMap")
plot(data.shape)

Ви можете, можливо, кататися на ковзанах, не роблячи цього, якщо ви просто працюєте з одним файлом форми, але як тільки ви почнете переглядати декілька джерел даних або накладати на Google Maps, підтримка хорошої форми проекцій стає важливою.

Для деяких корисних ознайомлень з просторовими даними в R, включаючи купу матеріалів про імпорт та роботу з точковими візерунками, у мене є старі матеріали курсу в Інтернеті за адресою https://csde.washington.edu/workshop/point-patterns-and-raster -поверхні / (більше семінарів можна знайти тут ), які можуть допомогти вам побачити, як ці методи порівнюються на практиці.


+1 для просторової довідкової інформації ... особливо для підкреслення збереження розроблених проекцій!
Сімбамангу

@csfowler, я намагався використовувати readOGR, але він не імпортує файл .prj. Будь-яка ідея чому? Я теж на UW, на кафедрі біології.
Зуб Герман

@ user4050, важко знати, не бачачи свого коду. Я припускаю, що в одному каталозі є файл .prj? і що ви використовували значення encoding = "ESRI Shapefile", щоб переконатися, що rgdal знає, що це файл форми?
csfowler

17

Я думаю, ви не повинні перетворювати файл форми в ASCII, а натомість використовувати файл файлу безпосередньо з одним з просторових розширень. Тут ви можете знайти три способи зчитування (запису) файлу форми http://www.nceas.ucsb.edu/scicomp/usecases/ReadWriteESRIShapeFiles . R-просторовий проект, ймовірно, також зацікавить вас http://cran.r-project.org/web/packages/sp/index.html .


17

Ви можете використовувати sfбібліотеку для відкриття Shapefiles безпосередньо в R. Це швидше, ніж rgdalбібліотека, перевірте тут: Прості функції для R - Тести . Для отримання додаткової інформації про sfпакунок перевірте домашню сторінку проекту r-просторову .

# Load library
library('sf')

# Load shapefile
shapename <- read_sf('~/path/to/file.shp')

11

Просте рішення 2017 року - це shapefile()функція в rasterбібліотеці.

#Load library
library(raster)

#Load shapefile
shp <- shapefile("myshapefile")

ОНОВЛЕННЯ: Це все ще хороший варіант у 2019 році.


Чи можна це використовувати для імпорту з інтернет-джерела? I
I Del Toro

@IDelToro Не безпосередньо. Спочатку потрібно завантажити його на свій жорсткий диск, а потім завантажити звідти.
Крістофер

6

Ще однією альтернативою є використання бібліотеки fastshp, яка пропонує:

Рутини для роботи з великими файлами форм ESRI (.shp). Сюди входить читання, проріджування очок та відповідність точок вмісту фігур. Основна мета цього пакета - забезпечити швидкість для підтримки великих форматів (мільйони очок). Це на кілька порядків швидше, ніж деякі інші пакети формфайлу.

Ось моє запитання щодо SE про те, як використовувати його з ggplot2:

Як я можу побудувати графік форми, завантажений через fastshp в ggplot2?


1
Мені трохи прикро, що функція read.shp не призводить до появи об'єкта sp. Враховуючи, що просторова R-спільнота на цьому сходиться як стандарт фактичного поводження з просторовими об'єктами, я вважаю це дещо неохайним. Враховуючи достатню кількість оперативної пам’яті та 64-бітну ОС, читання великих даних не є великою проблемою. З 8 Гб оперативної пам’яті я прочитав 30М очок та 2,5М полігонів, використовуючи rgdal без проблем. Ось певний напрямок щодо використання об'єктів sp з ggplot2: github.com/hadley/ggplot2/wiki/plotting-polygon-shapefiles
Джефрі Еванс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.