Проектування об'єктів sp в R


35

У мене є ряд форм-файлів у різних CRS (в основному WGS84 lat / lon), які я хотів би перетворити на загальну проекцію (ймовірно, Albers Equal Area Conic, але я можу попросити допомоги щодо вибору в іншому питанні, як тільки моя проблема стане кращою -визначений).

Я провів кілька місяців, займаючись просторовою статистикою в R, але це було 5 років тому. За все життя я не можу пригадати, як перетворити spоб'єкт (наприклад SpatialPolygonsDataFrame) з однієї проекції на іншу.

Приклад коду:

P4S.latlon <- CRS("+proj=longlat +datum=WGS84")
hrr.shp <- readShapePoly("HRR_Bdry"), verbose=TRUE, proj4string=P4S.latlon) 
# Shapefile available at 
#   http://www.dartmouthatlas.org/downloads/geography/hrr_bdry.zip 
#   but you must rename all the filenames to have the same 
#   capitalization for it to work in R

Тепер у мене є SpatialPolygonsDataFrameвідповідна інформація про проекцію, але я хотів би перетворити її на потрібну проекцію. Я пригадую, що для цього була якась неінтуїтивно названа функція, але я не можу пригадати, що це таке.

Зауважте, що я не хочу просто змінювати CRS, а змінювати координати на відповідність ("перепроектувати", "перетворити" тощо).

Редагувати

За винятком AK / HI, які дратують розміщення в Мексиці для цього формату файлів:

library(taRifx.geo)
hrr.shp <- 
  subset(hrr.shp, !(grepl( "AK-" , hrr.shp@data$HRRCITY ) |
                                     grepl( "HI-" , hrr.shp@data$HRRCITY )) )
proj4string(hrr.shp) <- P4S.latlon

Попередня відповідь щодо проектування за допомогою пакета proj4 тут . Я ще не пробував цього з SpatialPolygonsDataFrame.
Simbamangu

Насправді схоже, що proj4 не працює з просторовими об'єктами, але див. Відповідь нижче.
Simbamangu

2
Завжди існує просторовий перегляд завдань: cran.r-project.org/web/views/Spatial.html і мої примітки про просторові дані [безсоромний штекер]: maths.lancs.ac.uk/~rowlings/Teaching/UseR2012
Spacedman

Відповіді:


44

Ви можете використовувати spTransform()методи в rgdal - використовуючи свій приклад, ви можете перетворити об'єкт у NAD83 для Канзасу (26978):

library(rgdal)
library(maptools)

P4S.latlon <- CRS("+proj=longlat +datum=WGS84")
hrr.shp <- readShapePoly("HRR_Bdry", verbose=TRUE, proj4string=P4S.latlon)
plot(hrr.shp)

непроектований

hrr.shp.2 <- spTransform(hrr.shp, CRS("+init=epsg:26978"))
plot(hrr.shp.2)

прогнозується

Щоб зберегти його в новій проекції:

writePolyShape(hrr.shp.2, "HRR_Bdry_NAD83")

EDIT : Або відповідно до пропозиції @ Spacedman (який записує .prj файл із інформацією про CRS):

writeOGR(hrr.shp.2, dsn = getwd(), layer = "HRR_Bdry_NAD83", driver="ESRI Shapefile")

Якщо невідомо, з якого CRS запроектувати, зверніться до наступного повідомлення:

Якщо ви хочете визначити / призначити CRS, коли даних немає, зверніться до:


10
зауважте, що writePolyShape НЕ записує .prj файл! Ви повинні використовувати writeOGR від rgdal (і використовувати readOGR для читання формфайлів), якщо ви хочете записати та прочитати файл .prj, щоб встановити CRS ваших просторових об'єктів у R!
Спайдермен

Набагато краще (відредаговано відповідно) - дякую; не зрозумів, що створює .prj файл! До речі, дивовижна шпаргалка на вашій сторінці.
Simbamangu

1
Дивно, як проекція в Мексиці впливає на появу вбудов Аляски та Гаваїв :-).
whuber

@whuber - хм, так ... хтось відредагував мою публікацію, в якій не було фактичних карт, де відображалися ці досить невідповідні вставки ... ніколи не будувати їх, щоб побачити, що вони там.
Сімбамангу

@Simbamangu Вибачте, забув, що цей .shp файл досить неналежним чином містив вставки, коли я намагався бути корисним для додавання графіків!
Арі Б. Фрідман

8

З моменту введення пакету sf (ознайомтеся з віньєтками sf1 , sf2 , sf3 , sf4 та посібником з міграції тут ), ви можете використовувати st_transform()для повторного відтворення своїх векторних даних:

require(sf)

hrr_sf = st_read('HRR_Bdry.shp', stringsAsFactors = FALSE,
    crs = 4326) # has +proj=longlat +datum=WGS84
plot(hrr_sf)

hrr_sf2 = st_transform(hrr_sf, "+init=epsg:26978") # 1st option sp::CRS() not working/ needed
hrr_sf2 = st_transform(hrr_sf, 26978) # 2nd option - EPSG code as an integer
plot(hrr_sf2)

# don't think about doing this:
hrr_sf3 = st_read('HRR_Bdry.shp', stringsAsFactors = FALSE,
    crs = 26978)

# Output layer
st_write(hrr_sf2, dsn = getwd(), layer = "HRR_Bdry_NAD83", driver = "ESRI Shapefile")

sf замінить sp в майбутньому і завдяки своїй простоті та швидкості має ряд переваг порівняно з sp.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.