On 10/08/10 13:49, Nikos Alexandris wrote:
Markus M:

If a point is inside an area (the polygon composed of the area's
boundaries), the distance is 0 (zero):

This sentence makes me think that it is a priori known (based on something
else - related to topology?) when a point is inside an area. Why all the need
to measure distances then in order to count how many points are inside?

As you can see in the code referenced by Markus, there is a Vect_point_in_area(), so yes, it is possible to more directly check if points are in areas. It all depends on which modules were written using this function. At this stage all point-in-polygon attempts in GRASS are scripts using workarounds...

A centroid is always inside the area it belongs to, therefore the
distance of a point outside an area to the area's centroid is always
larger than the distance of that point to the area's boundaries.

What happens when the centroid (gravity center) falls outside of the
boundaries?

In GRASS, by definition a centroid is within the boundaries, and so does not necessarily represent center of gravity.

Point to boundary? Specifically, point to all-lines that compose a
boundary? Many distances? And then, keep the maximum?

If a point is outside an area, v.distance determines the shortest
distance to the area's boundaries (point to all-lines that compose a
boundary), IOW, keep the minimum not the maximum because v.distance
searches for the nearest feature.

All right. But, (repeating the same question): why is distance measuring
required at all? To compare it with what?

Well, v.distance was not meant as a point-in-polygon measurement tool, but as a distance measurement tool. v.what.vect just "abuses" it as such, using dmax=0.0. But currently, there is not dedicated point-in-polygon counting module...

Why are (supposedly) other tools faster in counting points within polygons?

see above...

So, maybe, if you have a dedicated programmer at hand, you could imagine a module with point-in-polygon algorithm, maybe giving the option of counting the points, aggregating some attribute values of the points, etc, using the Vect_point_in_area() function...

Should just be a matter of:

- opening a polygon and a point layer
- for each polygon
- loop through all points and if Vect_point_in_area() is true, aggregate the values of those that fall into the polygon
- put results into table of polygon map, new table or stdout

I imagine that here the use of bounding boxes and the spatial index might here, but that's Markus' specialty ;-)

Moritz


_______________________________________________
grass-dev mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/grass-dev

Reply via email to