[GRASS-dev] [GRASS GIS] #401: v.distance enhanced to report
multiple categories
GRASS GIS
trac at osgeo.org
Mon Dec 15 10:51:55 EST 2008
#401: v.distance enhanced to report multiple categories
-------------------------+--------------------------------------------------
Reporter: wilsonadam | Owner: grass-dev at lists.osgeo.org
Type: enhancement | Status: new
Priority: major | Milestone: 6.3.1
Component: Vector | Version: 6.3.0 RCs
Keywords: v.distance | Platform: Linux
Cpu: x86-64 |
-------------------------+--------------------------------------------------
Summary: I would like to request that the v.distance function be updated
(with a flag?) to allow reporting of multiple categories in one layer.
Example of why this is important:
I am working with historical forest fire data and want to extract
histories for different points. I start with a shapefile that contains
many (1000s) of polygons, many of which overlap in x-y space but vary over
time (time information is in the attribute table). I could separate this
into separate shapefiles (one for each year) prior to importing to GRASS,
but this would result in almost 100 different layers and I would rather
avoid it. When I import it into grass using v.in.ogr, it is topologically
cleaned and the result is a layer of (intersected) polygons, many of which
have multiple categories that link to the attribute table. For example, a
single polygon could have burned in multiple years, so it is linked to
multiple rows in the attribute table. These multiple categories are
visible with "v.category -g input=fire option=print" which results in
something like this:
2452
2452/2540
2452/2526/2540/2543
2540/2575
2406/2420/2517/2563/2581/2584
Where each row is a unique polygon and the different elements are the
various categories (rows in the attribute table) that are linked to it.
So far so good. But what I want to do is extract the fire history for a
number of points, but v.distance only reports the last category for each
polygon (which in my case is usually only the most recent fire) and
reports "WARNING: more cats of to_layer." So there seems to be a hidden
ID value for each polygon (which would correspond to the invisible row
number in the output above) but I cannot seem to access it directly. If I
could, then it would be possible to v.distance to that ID, then use the
output above to link a given point to several fire records.
If v.distance was updated to include multiple categories in the same
layer, I would be able to do this easily. This has been proposed before:
http://www.mail-archive.com/grass-user@lists.osgeo.org/msg02056.html. I
would like to encourage this revision (though maybe with a -m flag so you
could turn this feature on if wanted). It would ideally (for me) return a
table with multiple records for each point, each with a different category
from the polygon layer. For example, something like this:
point | fireyear
1 1950
1 1975
1 2002
2 1960
2 1972
3 1954
For reference, I have been able to do this quite easily with a loop in R
with the following code:
(though this is specific to my dataset, some changes will be needed).
################### This code intersects a set of points with any number
of polygons (which may be overlapping)
library(sp);library(rgdal)
fires=readOGR("/media/Data/Work/Regional/CFR/FireAnalysis/FireData/fires_15072008","all_fires_07_08")
#read in shapefile with overlapping polygons
d=as.data.frame(cbind(slot(fires,"data")[1,],point=1)) #use first row as
template, add "point" as placeholder to be filled later
nfires=nrow(slot(fires,"data")) #get the number of polygons
for(i in 1:nfires) { #loop through each polygon one at a time
d2=overlay(fires[i,],points) #do overlay of all points for each fire
polygon (this may result in lots of NAs)
d2$point=as.factor((1:nrow(d2))+100) #add point ID - my point IDs start
at 101 and go up, you will have to adjust this
d=rbind(d,d2) #bind this polygon's overlay to the previous one
print(paste(i," out of ",nfires)) #print progress
}
d=d[-1,] #remove first line - used to start dataframe
d=d[!is.na(d$FIREREFERE),] #get rid of all the NAs using a field that is
always populated
d2=merge(d,slot(points,"data"),by.x="point",by.y="Locality_n",all.x=T)
#merge with point data to get point attributes for each point
#########################################
--
Ticket URL: <http://trac.osgeo.org/grass/ticket/401>
GRASS GIS <http://grass.osgeo.org>
More information about the grass-dev
mailing list