Note that there are some explanatory texts on larger screens.

plurals
  1. POManipulate shapefile attribute table using R
    primarykey
    data
    text
    <p>I've posted this <a href="https://gis.stackexchange.com/questions/64174/how-to-add-a-field-to-a-shapefile-using-r">question on the GIS stack exchange</a>, but it's not seeing much traffic.</p> <p>I'm a GIS user who's been using R for stats for a few years, and I'm excited to see a lot of new GIS capabilities being released (raster, shapefiles, rgdal, etc).</p> <p>I've done a lot of database and table manipulation in R, so being able to add and remove attributes from shapefiles is a powerful potential. </p> <p>I'm hoping I'm just missing what's out there, but I can't seem to find a good method for adding or removing attributes from a shapefile attribute table.</p> <p>Can anyone from Overflow respond to my GIS post? Or can I be advised how to get my list attribute table into a dataframe and back to replace the current attribute table?</p> <h2>Edit progress</h2> <p>Some progress since my original post:</p> <p>This is getting at figuring out how to take my attribute table appart (.dbf), add stuff, and now I'm trying to put it back together to replace the original dbf.</p> <pre><code>&gt;libary(raster); library(rgdal); library(shapefiles) &gt;shp&lt;-shapefile(Shape) # D.C. area airport polygons &gt;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 &gt;shp.AT&lt;-read.dbf(gsub(".shp", ".dbf", Shape), header=TRUE) #Read in the attribute table from the .dbf &gt; 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 &lt;NA&gt; Maryland 24 Y 5078 Military 2 279 DCA Washington National &lt;NA&gt; Virginia 51 Y 6813148 &lt;NA&gt; 3 399 HEF Manassas Regional Harry P Davis Field Virginia 51 Y 271 Regional 4 428 IAD Washington Dulles International &lt;NA&gt; 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 &gt;shp.tab&lt;-as.data.frame(shp.AT[1]) # Grab the first object of the .dbf as a data.frame &gt; 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 &lt;NA&gt; Maryland 24 Y 5078 Military 2 279 DCA Washington National &lt;NA&gt; Virginia 51 Y 6813148 &lt;NA&gt; 3 399 HEF Manassas Regional Harry P Davis Field Virginia 51 Y 271 Regional 4 428 IAD Washington Dulles International &lt;NA&gt; Virginia 51 Y 8050506 International &gt; shp.tab$NewAT&lt;-1:nrow(shp.tab) # Add my new attribute &gt; 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 &lt;NA&gt; Maryland 24 Y 5078 Military 1 2 279 DCA Washington National &lt;NA&gt; Virginia 51 Y 6813148 &lt;NA&gt; 2 3 399 HEF Manassas Regional Harry P Davis Field Virginia 51 Y 271 Regional 3 4 428 IAD Washington Dulles International &lt;NA&gt; Virginia 51 Y 8050506 International 4 &gt;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' &gt; shp.AT[1]&lt;-shp.tab # Try replacing the old Object[1] with my new table containing the new attribute. &gt; 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 &gt;write.dbf(shp.AT, gsub(".shp", ".dbf", Shape)) # If I go ahead and overwrite anyway... </code></pre> <p>My attributes are gone and replaced with an attribute table that contains a single field "dataframe". I recurse the script to again read the attribute table.</p> <pre><code>&gt; shp.tab dataframe 1 134 2 279 3 399 4 428 </code></pre> <p>So, I think I'm close. Can anyone help me get this back into the shapefile attribute table? Or, is there a way better method?</p> <p>Thanks</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload