Изменение CRS объекта SF

У меня есть несколько дорог в качестве объекта sp:

class       : SpatialLinesDataFrame 
features    : 17360 
extent      : 490176.4, 567680.9, 148639.1, 212821  (xmin, xmax, ymin, ymax)
coord. ref. : +init=epsg:27700 +proj=tmerc +lat_0=49 +lon_0=-2     +k=0.9996012717 +x_0=400000 +y_0=-100000 +datum=OSGB36 +units=m +no_defs     +ellps=airy +towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894 
variables   : 4
names       :    osm_id, lanes,     type, width 
min values  :        73,     2, motorway,   6.3 
max values  : 587969162,     6,    trunk,  18.9

Я конвертирую их в объект SF следующим образом:

roads                   <- st_as_sf(roads, crs = 27700)

После преобразования SRID пуст, а строка proj4string (возможно) выглядит некорректно. Почему это? Могу я это исправить?

Simple feature collection with 17360 features and 4 fields
geometry type:  LINESTRING
dimension:      XY
bbox:           xmin: 490176.4 ymin: 148639.1 xmax: 567680.9 ymax: 212821
epsg (SRID):    NA
proj4string:    +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +towgs84=446.448,-125.157,542.06,0.1502,0.247,0.8421,-20.4894 +units=m +no_defs
First 10 features:
     osm_id lanes    type width                       geometry
73       73     2 primary   6.3 LINESTRING (526256 191950, ...
74       74     2 primary   6.3 LINESTRING (525236.4 190755...
75       75     2 primary   6.3 LINESTRING (526324.4 192518...
79       79     2 primary   6.3 LINESTRING (524912.4 190235...
482     482     2 primary   6.3 LINESTRING (527283.9 198571...
546     546     2 primary   6.3 LINESTRING (506089.1 205091...
1210   1210     2 primary   6.3 LINESTRING (526023.9 195013...
1213   1213     2 primary   6.3 LINESTRING (524861.1 196243...
1214   1214     2 primary   6.3 LINESTRING (524482.3 196798...
1698   1698     2 primary   6.3 LINESTRING (527335.3 195524...

Я думаю, мне нужно это исправить, потому что затем я хочу, чтобы мои данные st_transform () были в той же CRS, что и растр, и мне нужно выполнить некоторое извлечение значений.

crs(raster)
CRS arguments:
 +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs

Полагаю, я могу преобразовать свои «дороги» в правильную CRS, сделав что-то вроде этого? Но это не работает. Я получил ....

roads <- st_transform(roads, crs(raster))
'Error: cannot create a crs from an object of class CRS

Помощь приветствуется. Спасибо.


person TheRealJimShady    schedule 16.05.2018    source источник
comment
raster использует классы S4, поэтому вам нужно вызвать соответствующий слот, чтобы получить prj4string, который sf может понять. roads <- st_transform(roads, crs(raster)@projargs) должен помочь.   -  person TimSalabim    schedule 16.05.2018


Ответы (1)


Вы должны адаптировать аргументы st_transform следующим образом:

roads <- st_transform(roads, crs = 4326)

OR

roads <- st_transform(roads, crs = proj4string(raster))

ИЛИ, как сказал @TimSalabim:

roads <- st_transform(roads, crs = crs(raster)@projargs)

ИЛИ, как указал @ R'n'E:

roads <- st_transform(roads, crs = st_crs(raster))
person SeGa    schedule 16.05.2018
comment
Похоже, код нуждается в небольшом обновлении. Используется st_crs() из sf_0.6-3: roads <- st_transform(roads, crs = st_crs(raster)) - person aae; 12.04.2019