Открытие шейп-файла в R? [закрыто]

64

Мне нужно открыть шейп-файл из ArcMap в R, чтобы использовать его для дальнейшего геостатистического анализа. Я преобразовал его в текстовый файл ASCII, но в R он распознается как data.frame. Функция координат не работает, как только x и y признаны не числовыми.

Не могли бы вы помочь с этим справиться?

Slava
источник
1
Что за шейп-файл? Я предполагаю очки, так как у него есть столбцы X и Y?
Симбамангу

Ответы:

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для столбца ID.

Если вы хотите использовать импортированный вами ASCII-файл, вам следует просто преобразовать текстовые (символьные) поля x и y в числа, например:

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

Edit 2015-01-18 : обратите внимание, что rgdal немного лучше, чем maptools (который я изначально предложил здесь), главным образом потому, что он автоматически читает и записывает информацию о проекции.

Примечания:

  • вложенные as.numeric(as.character())функции - если ваш текст ASCII был прочитан как фактор (вероятно), это гарантирует, что вы получите числовые значения вместо уровней фактора.
  • rgdalи sfимеют запутанные способы доступа к различным типам файлов и баз данных (например, для файла GPX, dsn - это имя файла, и слои отдельных компонентов, таких как путевые точки, трекпоинты и т. д.), необходимо тщательное чтение онлайн-примеров.
Simbamangu
источник
R должен анализировать числовые поля, поэтому я мог бы представить, что в x и y есть специальный символьный тип. Кроме того, при импорте, если не указано иное, символьные поля будут приводиться к фактору. Таким образом, простое замедление «as.numeric» не будет работать. Я бы также использовал «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

Я согласен с Симбамангу и расстроен с точки зрения сохранения шейп-файла, но хочу обратить ваше внимание именно на библиотеку rgdal. Следуйте по ссылке, предложенной gissolved для 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 для шейп-файла. Чтобы использовать rgdal для того же файла, вы просто напишите:

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

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

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

csfowler
источник
+1 для информации о пространственной привязке ... особенно для того, чтобы подчеркнуть, что проекции отсортированы
Симбамангу
@csfowler, я пытался использовать readOGR, но он не импортирует файл .prj. Есть идеи почему? Я тоже в UW, в отделе биологии.
Герман Тутрот
@ user4050, трудно узнать, не видя ваш код. Я предполагаю, что файл .prj находится в том же каталоге? и что вы использовали значение encoding = "ESRI Shapefile", чтобы убедиться, что rgdal знает, что это шейп-файл?
csfowler
17

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

Самуил
источник
17

Вы можете использовать sfбиблиотеку, чтобы открыть Shapefiles прямо в R. Это быстрее, чем rgdalбиблиотека, проверьте здесь: Простые возможности для R - Benchmarks . Для получения дополнительной информации о sfпакете проверьте домашнюю страницу проекта r -atial .

# 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 году.

Кристофер
источник
Можно ли это использовать для импорта из онлайн-источника? Я
я Дель Торо
@IDelToro Не напрямую. Вам нужно сначала загрузить его на жесткий диск, а затем загрузить его оттуда.
Кристофер
6

Еще одна альтернатива - использовать библиотеку fastshp, которая предлагает:

Подпрограммы для обработки больших шейп-файлов ESRI (.shp). Это включает в себя чтение, прореживание точек и сопоставление точек с содержащимися фигурами. Основная цель этого пакета - обеспечить скорость поддержки больших шейп-файлов (миллионы точек). Он на несколько порядков быстрее, чем некоторые другие пакеты с шейп-файлами.

Вот мой вопрос на SE о том, как использовать его с ggplot2:

Как я могу построить шейп-файл, загруженный через fastshp в ggplot2?

Радек
источник
1
Я нахожу это немного раздражающим, что функция read.shp не приводит к объекту sp. Учитывая, что пространственное сообщество R сходится в этом как фактическом стандарте для обработки пространственных объектов, я нахожу это несколько небрежным. При наличии достаточного объема ОЗУ и 64-битной ОС чтение больших данных не является большой проблемой. С 8GB RAM я прочитал 30M точек и 2.5M полигонов, используя rgdal без проблем. Вот некоторые указания по использованию sp-объектов с ggplot2: github.com/hadley/ggplot2/wiki/plotting-polygon-shapefiles
Джеффри Эванс,