Count points in polygon/es

From GRASS-Wiki
Jump to navigation Jump to search

P: ¿Cómo puedo contar la cantidad de puntos que caen dentro de polígonos?

R: hay al menos dos opciones:

Solución basada en los atributos

Carga un atributo de los polígonos a los puntos, luego cuenta la cantidad de atributos iguales a través del agrupamiento con SQL.

Ejemplo: ¿Cuantos sitios arqueológicos tiene cada dueño de parcela?

 # Aŕea de Spearfish
 # (Nota: el controlador DBF no está soportado, use  SQLite, MySQL o PostgreSQL)
 g.copy vect=archsites,myarchsites
 v.db.addcol myarchsites col="owner varchar(25)"

Ahora transferimos el nombre del dueño a los sitios arqueológicos (puntos):

 v.what.vect myarchsites qvect=fields column=owner qcolumn=label
 # verification:
 v.db.select myarchsites

 d.mon wx0
 d.vect -c fields
 d.vect myarchsites icon=basic/diamond size=10

 # prueba
 echo "SELECT *,count(owner) FROM myarchsites GROUP BY owner" | db.select

 # subir al mapa de polígonos
 g.copy vect=fields,myfields
 v.db.addcol myfields col="numpoints integer"
 v.db.update myfields column=numpoints value="(SELECT count(owner) FROM myarchsites WHERE \
 myarchsites.owner=myfields.label GROUP BY owner);"
 # verificar:
 v.db.select myfields

La tabla resultante contiene la cantidadde puntos que cae dentro de cada polígono.

Problema: En este procedimiento se cuentan los atributos, no los elementos. Esto significa que si hay más de una categoría que enlace un mismo elemento a la tabla de atributos, se estarían contando elementos de más. También es posible que varios elementos se enlacen a una categoría y en este caso se estaría subestimando. El primer escenario puede ocurrir al usar v.edit para eliminar duplicados, por ejemplo Punto A y Punto B son ensamblados para producir el Punto C (elementos A y B son eliminados) y el elemento C hereda los atributos de A y B. Las dos categorías se enlazan a C. Para evitar estos problemas es necesario que haya una correspondencia 1:1 entre elementos y categorías, por lo que sería necesario hacer una nueva tabla. La nueva tabla (MyCats) puede ser usada como un filtro, por ejemplo:

 # prueba
 echo "SELECT *,count(owner) FROM myarchsites WHERE ""cat in (select * from MyCats)"" GROUP \
 BY owner" | db.select

Solución basada en la geometría

  • v.vect.stats cuenta la cantidad de puntos que caen dentro de un polígono y opcionalmente calcula estadísticas para atributos numéricos de los putos. v.vect.stats es un módulo C disponible desde GRASS 6.4.3 y superiores. v.vect.stats crea una columna para actualizar los datos automáticamente, de manera alternativa es posible actualizar una columna existente, dado que el tipo sea entero.
v.vect.stats points=mypoints areas=mypolygons count_column=pointcnt