9

我已经在 GIS stack exchange 上发布了这个问题,但没有看到太多流量。

我是一名 GIS 用户,多年来一直使用 R 进行统计,我很高兴看到许多新的 GIS 功能正在发布(光栅、shapefile、rgdal 等)。

我已经在 R 中完成了很多数据库和表操作,因此能够从 shapefile 添加和删除属性是一个强大的潜力。

我希望我只是错过了那里的东西,但我似乎找不到从 shapefile 属性表中添加或删除属性的好方法。

Overflow 的任何人都可以回复我的 GIS 帖子吗?或者我可以被告知如何将我的列表属性表放入数据框并返回以替换当前的属性表?

编辑进度

自从我的原始帖子以来取得了一些进展:

这是在弄清楚如何获取我的属性表 appart (.dbf),添加东西,现在我正试图将它放回原处以替换原始 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...

我的属性不见了,取而代之的是一个包含单个字段“数据框”的属性表。我递归脚本以再次读取属性表。

> shp.tab
  dataframe
1       134
2       279
3       399
4       428

所以,我想我很接近了。谁能帮我把它恢复到 shapefile 属性表中?或者,有没有更好的方法?

谢谢

4

3 回答 3

5

我不确定我完全理解你想要做什么。看起来您只是想在属性表中添加一个新列?如果这是正确的,那么就像任何数据框一样对待它。

library(rgdal)
dsn <- system.file("vectors", package = "rgdal")
shp<-readOGR(dsn = dsn, layer = 'cities')
shp$NewAT<-1:nrow(shp)

这与我系统上的 shapefile 完美配合。我通常依靠 rgdal 使用 readOGR() 函数读取我的 shapefile。我相当确定您调用的 shapefile() 函数也调用了 rgdal。

编辑以添加可重现的数据集。

于 2013-06-22T21:13:03.643 回答
1

几年来,我一直在使用 R 进行 GIS,通常与 QGIS 结合使用。对于操作属性表,我通常将我的形状保存为 CSV,几何保存为 WKT(您将在 QGIS 保存对话框中找到选项)。在下一步中,我在 R 中读取所有 csv(shapes) 并进行统计、加入等。最后我将它们写回 HDD 并将它们加载回 QGIS(无需导入对话框,只需拖放)并保存它们作为 shapefile。

HTH,乔

于 2020-04-01T07:37:23.450 回答
1

我使用sf库和tidygraph来处理 shapefile。

library(sf)
Links_Layer <- sf::st_read("D:\\Sample\\Folder", layer = "shapefile", quiet = TRUE)

Links_Layer <- Links_Layer  %>% mutate(Attribute_B = Attribute_A^2)

sf::st_write(Links_Layer, "D:\\Sample\\Folder\\updated_shapefile.shp")

于 2021-03-05T15:28:00.463 回答