[GRASS5] How to get point counts?

I'm working on a little script that will do Local Density Analysis for
archaeology, and have run into an odd problem for a high-end GIS like GRASS.

I am having considerable difficulty in getting the count of points within a
given distance of another point. That is, for each point, I'd like to get
the number of points (in either the same or, better, another map layer)
within 100m, 200m, 300m, etc.

I first wrote my script using v.neighbors--reading the documentation rather
than trying it out (I know, bad idea)--followed by r.sum. It seemed perfect,
but it turns out that v.neighbors doesn't do what it seems it ought to do
given the documentation. When have time to figure out exactly what it IS
doing, I will see if I can clarify the docs.

R.neighbors is too restrictive in its window size (only 3-25) and the window
size is in grid units rather than in ground units (making my task
additionally complicated).

Creating a raster buffer with bands at the set of distances I need, followed
by r.statistics seemed like a good idea. But again, the actual behavior of
r.statistics does not seem to match quite what the docs imply--though the
docs also need to be updated a lot. Again, if I can be sure of what
r.statistics is doing I can try to update the docs.

Perhaps v.distance might be a place to start. However, I was trying to test
it on the Spearfish dataset to understand its behavior and stymied by the
lack of a dbf attribute file for any of the point data AND GRASS's apparent
inability to construct one from scratch (it seems like v.in.db will add
fields to an existing table but won't make one if it doesn't exist).
However, I'm still not sure what distances will end up being put into the
selected distance field if I choose the flag to calculate all distances
within a threshold. And I'm still left with a question about how to count
points within a set distance unless GRASS supports count(*) in its SQL
subset (it doesn't say that it does, but perhaps someone knows for sure).

As far as I can see, there are no distance functions in r.mapcalc.

Right now, I'm looking at doing a series of buffers, making each a mask and
running r.sum for each mask. This seems klunky but doable.

I am hoping that there is some kind of solution to this that I am missing.
Any suggestions? Thanks in advance.

Michael
____________________
C. Michael Barton, Professor of Anthropology
School of Human Evolution and Social Change
PO Box 872402
Arizona State University
Tempe, AZ 85287-2402
USA

Phone: 480-965-6262
Fax: 480-965-7671
www: <www.public.asu.edu/~cmbarton>

Michael,

What about creating a circle vector (centered at the point of interest), convert it to a raster which you then use as a mask; then use R to do your statistics on the layer of interest?

Tom

Michael Barton wrote:

I'm working on a little script that will do Local Density Analysis for
archaeology, and have run into an odd problem for a high-end GIS like GRASS.

I am having considerable difficulty in getting the count of points within a
given distance of another point. That is, for each point, I'd like to get
the number of points (in either the same or, better, another map layer)
within 100m, 200m, 300m, etc.

I first wrote my script using v.neighbors--reading the documentation rather
than trying it out (I know, bad idea)--followed by r.sum. It seemed perfect,
but it turns out that v.neighbors doesn't do what it seems it ought to do
given the documentation. When have time to figure out exactly what it IS
doing, I will see if I can clarify the docs.

R.neighbors is too restrictive in its window size (only 3-25) and the window
size is in grid units rather than in ground units (making my task
additionally complicated).

Creating a raster buffer with bands at the set of distances I need, followed
by r.statistics seemed like a good idea. But again, the actual behavior of
r.statistics does not seem to match quite what the docs imply--though the
docs also need to be updated a lot. Again, if I can be sure of what
r.statistics is doing I can try to update the docs.

Perhaps v.distance might be a place to start. However, I was trying to test
it on the Spearfish dataset to understand its behavior and stymied by the
lack of a dbf attribute file for any of the point data AND GRASS's apparent
inability to construct one from scratch (it seems like v.in.db will add
fields to an existing table but won't make one if it doesn't exist).
However, I'm still not sure what distances will end up being put into the
selected distance field if I choose the flag to calculate all distances
within a threshold. And I'm still left with a question about how to count
points within a set distance unless GRASS supports count(*) in its SQL
subset (it doesn't say that it does, but perhaps someone knows for sure).

As far as I can see, there are no distance functions in r.mapcalc.

Right now, I'm looking at doing a series of buffers, making each a mask and
running r.sum for each mask. This seems klunky but doable.

I am hoping that there is some kind of solution to this that I am missing.
Any suggestions? Thanks in advance.

Michael
____________________
C. Michael Barton, Professor of Anthropology
School of Human Evolution and Social Change
PO Box 872402
Arizona State University
Tempe, AZ 85287-2402
USA

Phone: 480-965-6262
Fax: 480-965-7671
www: <www.public.asu.edu/~cmbarton>

_______________________________________________
grass5 mailing list
grass5@grass.itc.it
http://grass.itc.it/mailman/listinfo/grass5

--
Thomas E Adams
National Weather Service
Ohio River Forecast Center
1901 South State Route 134
Wilmington, OH 45177

EMAIL: thomas.adams@noaa.gov

VOICE: 937-383-0528
FAX: 937-383-0033

Thanks Tom,

But this is the same as doing a raster buffer (r.buffer), which saves a
couple of steps (i.e., creating a vector circle and converting it to
raster). If I can get the count of points, I've already programmed the LDA
algorithm in a shell script--as it's very simple. This makes it directly
useable in GRASS without needing R.

Michael

On 12/28/04 10:39 AM, "Thomas Adams" <Thomas.Adams@noaa.gov> wrote:

Michael,

What about creating a circle vector (centered at the point of interest),
convert it to a raster which you then use as a mask; then use R to do
your statistics on the layer of interest?

Tom

Michael Barton wrote:

I'm working on a little script that will do Local Density Analysis for
archaeology, and have run into an odd problem for a high-end GIS like GRASS.

I am having considerable difficulty in getting the count of points within a
given distance of another point. That is, for each point, I'd like to get
the number of points (in either the same or, better, another map layer)
within 100m, 200m, 300m, etc.

I first wrote my script using v.neighbors--reading the documentation rather
than trying it out (I know, bad idea)--followed by r.sum. It seemed perfect,
but it turns out that v.neighbors doesn't do what it seems it ought to do
given the documentation. When have time to figure out exactly what it IS
doing, I will see if I can clarify the docs.

R.neighbors is too restrictive in its window size (only 3-25) and the window
size is in grid units rather than in ground units (making my task
additionally complicated).

Creating a raster buffer with bands at the set of distances I need, followed
by r.statistics seemed like a good idea. But again, the actual behavior of
r.statistics does not seem to match quite what the docs imply--though the
docs also need to be updated a lot. Again, if I can be sure of what
r.statistics is doing I can try to update the docs.

Perhaps v.distance might be a place to start. However, I was trying to test
it on the Spearfish dataset to understand its behavior and stymied by the
lack of a dbf attribute file for any of the point data AND GRASS's apparent
inability to construct one from scratch (it seems like v.in.db will add
fields to an existing table but won't make one if it doesn't exist).
However, I'm still not sure what distances will end up being put into the
selected distance field if I choose the flag to calculate all distances
within a threshold. And I'm still left with a question about how to count
points within a set distance unless GRASS supports count(*) in its SQL
subset (it doesn't say that it does, but perhaps someone knows for sure).

As far as I can see, there are no distance functions in r.mapcalc.

Right now, I'm looking at doing a series of buffers, making each a mask and
running r.sum for each mask. This seems klunky but doable.

I am hoping that there is some kind of solution to this that I am missing.
Any suggestions? Thanks in advance.

Michael
____________________
C. Michael Barton, Professor of Anthropology
School of Human Evolution and Social Change
PO Box 872402
Arizona State University
Tempe, AZ 85287-2402
USA

Phone: 480-965-6262
Fax: 480-965-7671
www: <www.public.asu.edu/~cmbarton>

_______________________________________________
grass5 mailing list
grass5@grass.itc.it
http://grass.itc.it/mailman/listinfo/grass5

______________________________
Michael Barton, Professor of Anthropology
School of Human, Evolution and Social Change
Arizona State University
Tempe, AZ 85287-2402
USA

voice: 480-965-6262; fax: 480-965-7671
www: http://www.public.asu.edu/~cmbarton