Как преобразовать образец набора данных из пакета «spatstat» R в шейп-файл - PullRequest
6 голосов
/ 26 апреля 2011

Я написал оценщик плотности ядра в Java, который принимает входные данные в форме шейп-файлов ESRI и выводит изображение GeoTIFF оценочной поверхности.Для тестирования этого модуля мне нужен пример шейп-файла, и по какой-то причине мне сказали извлечь его из данных примера, включенных в R. Проблема в том, что ни один из данных образца не является файлом формы ...

Я пытаюсь использовать функцию пакета shapefiles convert.to.shapefile(4) для преобразования набора данных bei, включенного в пакет spatstat в R, в файл shapefile.К сожалению, это оказывается сложнее, чем я думал.У кого-нибудь есть опыт в этом?Если вы будете так любезны, протяните мне руку, я буду вам очень признателен.

Спасибо, Райан

Ссылки: spatstat , шейп-файлы

Ответы [ 2 ]

6 голосов
/ 27 апреля 2011

Для пакетов Spatial в пакетах spatstat и maptools можно использовать функции конвертера.Шейп-файл состоит как минимум из точек (или линий или полигонов) и атрибутов для каждого объекта.

library(spatstat)
library(sp)
library(maptools)
data(bei)

Приведите bei к объекту Spatial, здесь только точки без атрибутов, поскольку на объекте ppp нет "отметок".

spPoints <- as(bei, "SpatialPoints")

Шейп-файлу требуется как минимум один столбец данных атрибутов, поэтому создайте фиктивный файл.

dummyData <- data.frame(dummy = rep(0, npoints(bei)))

Используя объект SpatialPoints и фиктивные данные, сгенерируйте SpatialPointsDataFrame.

spDF <- SpatialPointsDataFrame(spPoints, dummyData)

В этот момент вы должны определенно рассмотреть, что представляет собой система координат, используемая bei, и можете ли вы представить ее с помощью WKT CRS (известной текстовой системы координат координат).Вы можете присвоить это объекту Spatial в качестве другого аргумента для SpatialPointsDataFrame или после создания с помощью proj4string(spDF) <- CRS("+proj=etc...") (но это целая проблема, на которой мы могли бы написать страницы).

Загрузите пакет rgdal (это наиболее общий вариант, поскольку он поддерживает многие форматы и использует библиотеку GDAL, но может быть недоступен из-за системных зависимостей.

library(rgdal)

(Используйте writePolyShape в пакете maptools, если rgdal недоступно).

Синтаксис - это объект, а затем «имя источника данных» (здесь текущий каталог, это может быть полный путьв .shp или папку), затем слой (для шейп-файлов имя файла без расширения), а затем имя выходного драйвера.

writeOGR(obj = spDF, dsn = ".", layer = "bei", driver = "ESRI Shapefile")

Обратите внимание, что запись завершится неудачно, еслиФайл "bei.shp" уже существует, и поэтому его нужно будет сначала удалить unlink("bei.shp").

Список файлов, начинающихся с "bei":

list.files(pattern = "^bei")

[1] "bei.dbf" "bei.shp" "bei.shx"

Обратите внимание, что общегоКонвертер as.Spatial для ppp объектов, поскольку необходимо принять решение относительно того, является ли это точечным шаблоном с метками и т. д. - может быть интересно попробовать написать такой, который сообщает о том, были ли необходимы фиктивные данные, и т. д.вкл.

See следующие виньетки для получения дополнительной информации и деталей о различиях между этими представлениями данных:

library (sp);библиотека виньетки ("sp") (spatstat);виньетка ( "spatstat")

3 голосов
/ 27 апреля 2011

Общее решение:

  • преобразует классифицированные объекты "ppp" или "owin" в соответствующие классифицированные объекты из пакета sp
  • используйте функцию writeOGR() из пакета rgdal, чтобы записать Shapefile

Например, если мы рассмотрим набор данных hamster из spatstat:

require(spatstat)
require(maptools)
require(sp)
require(rgdal)
data(hamster)

сначала преобразуйте этот объект в SpatialPointsDataFrame объект:

ham.sp <- as.SpatialPointsDataFrame.ppp(hamster)

Это дает нам sp объект для работы с:

> str(ham.sp, max = 2)
Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
  ..@ data       :'data.frame': 303 obs. of  1 variable:
  ..@ coords.nrs : num(0) 
  ..@ coords     : num [1:303, 1:2] 6 10.8 25.8 26.8 32.5 ...
  .. ..- attr(*, "dimnames")=List of 2
  ..@ bbox       : num [1:2, 1:2] 0 0 250 250
  .. ..- attr(*, "dimnames")=List of 2
  ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slots

Этот объект имеет одну переменную в слоте @data:

> head(ham.sp@data)
     marks
1 dividing
2 dividing
3 dividing
4 dividing
5 dividing
6 dividing

Итак, скажем, теперь мы хотим записать эту переменную как шейп-файл ESRI, мы используем writeOGR()

writeOGR(ham.sp, "hamster", "marks", driver = "ESRI Shapefile")

Это создаст несколько marks.xxx файлов в каталоге hamster, созданных в текущем рабочем каталоге. Этот набор файлов является ShapeFile .

Одна из причин, по которой я не сделал вышеуказанного с набором данных bei, заключается в том, что он не содержит никаких данных, и поэтому мы не можем привести его к объекту SpatialPointsDataFrame. - это данные, которые мы могли бы использовать, в bei.extra (загруженные одновременно с bei), но эти дополнительные данные или на регулярной сетке. Таким образом, мы должны были бы

  • преобразовать bei.extra в SpatialGridDataFrame объект (скажем, bei.spg)
  • преобразовать bei в SpatialPoints объект (скажем, bei.sp)
  • overlay() bei.sp указывает на сетку bei.spg, получая значения из сетки для каждой из точек в bei
  • , который должен дать нам SpatialPointsDataFrame, который может быть записан с использованием writeOGR(), как указано выше

Как видите, это немного сложнее, просто чтобы дать вам шейп-файл. Будет ли достаточен пример данных hamster, который я покажу? Если нет, то завтра я могу выследить мой Биванд и др. и пройти через все шаги для bei.

...