Count points in polygon/es
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