Управление таблицей атрибутов шейп-файла с помощью R
Я написал это вопрос по обмену стеком ГИС, но он не видит много трафика.
Я пользователь ГИС, который использует R для статистики в течение нескольких лет, и я рад видеть много новых возможностей ГИС (растровые, шейп-файлы, rgdal и т. д.).
Я сделал много манипуляций с базой данных и таблицами в R, поэтому возможность добавлять и удалять атрибуты из шейп-файлов является мощным потенциалом.
Я надеюсь, что я просто отсутствует что там, но я не могу найти хороший метод для добавления или удаления атрибутов из таблицы атрибутов шейп-файла.
может ли кто-нибудь из Overflow ответить на мой пост ГИС? Или мне можно посоветовать, как получить таблицу атрибутов списка в фрейм данных и обратно, чтобы заменить текущую таблицу атрибутов?
изменить прогресс
некоторый прогресс с момента моего первоначального сообщения:
это выяснение того,как взять мою таблицу атрибутов appart (.ДБФ), добавить материал, и теперь я пытаюсь собрать его обратно, чтобы заменить оригинальный dbf.
>libary(raster); library(rgdal); library(shapefiles)
>shp<-shapefile(Shape) # D.C. area airport polygons
>summary(shp) #Shapefile properties
Object of class SpatialPointsDataFrame
Coordinates:
min max
coords.x1 281314.2 337904.7
coords.x2 4288867.0 4313507.0
Is projected: TRUE
proj4string :
[+proj=utm +zone=18 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0]
Number of points: 4
Data attributes:
ObjectID LOCID NAME FIELD STATE STATE_FIPS ACAIS TOT_ENP TYPE
Min. :134.0 Length:4 Length:4 Length:4 Length:4 Length:4 Length:4 Min. : 271 Length:4
1st Qu.:242.8 Class :character Class :character Class :character Class :character Class :character Class :character 1st Qu.: 3876 Class :character
Median :339.0 Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character Median :3409113 Mode :character
Mean :310.0 Mean :3717251
3rd Qu.:406.2 3rd Qu.:7122488
Max. :428.0
>shp.AT<-read.dbf(gsub(".shp", ".dbf", Shape), header=TRUE) #Read in the attribute table from the .dbf
> shp.AT # First object in the dbf looks like an attribute table!
$dbf
ObjectID LOCID NAME FIELD STATE STATE_FIPS ACAIS TOT_ENP TYPE
1 134 ADW Andrews AFB <NA> Maryland 24 Y 5078 Military
2 279 DCA Washington National <NA> Virginia 51 Y 6813148 <NA>
3 399 HEF Manassas Regional Harry P Davis Field Virginia 51 Y 271 Regional
4 428 IAD Washington Dulles International <NA> Virginia 51 Y 8050506 International
$header
$header$file.version
[1] 3
$header$file.year
[1] 113
$header$file.month
[1] 4
$header$file.day
[1] 12
$header$num.records
[1] 4
$header$header.length
[1] 321
$header$record.length
[1] 148
$header$fields
NAME TYPE LENGTH DECIMAL
1 ObjectID N 10 0
2 LOCID C 5 0
3 NAME C 45 0
4 FIELD C 30 0
5 STATE C 24 0
6 STATE_FIPS C 2 0
7 ACAIS C 1 0
8 TOT_ENP N 11 0
9 TYPE C 20 0
>shp.tab<-as.data.frame(shp.AT[1]) # Grab the first object of the .dbf as a data.frame
> shp.tab # First list object
dbf.ObjectID dbf.LOCID dbf.NAME dbf.FIELD dbf.STATE dbf.STATE_FIPS dbf.ACAIS dbf.TOT_ENP dbf.TYPE
1 134 ADW Andrews AFB <NA> Maryland 24 Y 5078 Military
2 279 DCA Washington National <NA> Virginia 51 Y 6813148 <NA>
3 399 HEF Manassas Regional Harry P Davis Field Virginia 51 Y 271 Regional
4 428 IAD Washington Dulles International <NA> Virginia 51 Y 8050506 International
> shp.tab$NewAT<-1:nrow(shp.tab) # Add my new attribute
> shp.tab # Added my new attribute, now to get this back into my shapefile
dbf.ObjectID dbf.LOCID dbf.NAME dbf.FIELD dbf.STATE dbf.STATE_FIPS dbf.ACAIS dbf.TOT_ENP dbf.TYPE NewAT
1 134 ADW Andrews AFB <NA> Maryland 24 Y 5078 Military 1
2 279 DCA Washington National <NA> Virginia 51 Y 6813148 <NA> 2
3 399 HEF Manassas Regional Harry P Davis Field Virginia 51 Y 271 Regional 3
4 428 IAD Washington Dulles International <NA> Virginia 51 Y 8050506 International 4
>write.dbf(shp.tab, gsub(".shp", ".dbf", Shape)) # Knew this wouldn't work, but demonstrate attempt to write this object as .dbf.
ERROR:
invalid subscript type 'list'
> shp.AT[1]<-shp.tab # Try replacing the old Object[1] with my new table containing the new attribute.
> shp.AT # The table portion fo the shp.AT is gone. No attributes.
$dbf
[1] 134 279 399 428
$header
$header$file.version
[1] 3
$header$file.year
[1] 113
$header$file.month
[1] 4
$header$file.day
[1] 12
$header$num.records
[1] 4
>write.dbf(shp.AT, gsub(".shp", ".dbf", Shape)) # If I go ahead and overwrite anyway...
мои атрибуты исчезли и заменены таблицей атрибутов, содержащей одно поле "dataframe". Я повторить сценарий еще раз прочитать таблицу атрибутов.
> shp.tab
dataframe
1 134
2 279
3 399
4 428
Итак, я думаю, что я близок. Может ли кто-нибудь помочь мне вернуть это в таблицу атрибутов шейп-файла? Или есть способ получше?
спасибо
1 ответов
Я не уверен, что полностью понимаю, что вы пытаетесь сделать. Похоже, вы просто хотите добавить новый столбец в таблицу атрибутов? Если это правильно, то просто относитесь к нему как к любому фрейму данных.
library(rgdal)
dsn <- system.file("vectors", package = "rgdal")
shp<-readOGR(dsn = dsn, layer = 'cities')
shp$NewAT<-1:nrow(shp)
это отлично работает с шейп-файлом, который у меня есть в моей системе. Обычно я полагаюсь на rgdal для чтения в моих шейп-файлах, используя функцию readOGR (). Я уверен, что функция shapefile (), которую вы вызывали, также вызывает rgdal.
изменить добавить воспроизводимый набор данных.