Se quiere hacer un análisis de segregación para una ley de mineral. El análisis consiste en ubicar los puntos que cumplan con un valor mayor que una concentración especificada y que los puntos vecinos también cumplan con la condición.
En el gráfico siguiente el punto azul cumple con la condición de tener una ley mayor que la especificada. Los puntos verdes también la cumplen, pero aparte son vecinos del punto azul. Si algún punto en la vecindad no cumpliera con la condición, ninguno de los puntos tendría un cambio de atributo.
Este análisis se hizo mediante el software SQLite para base de datos. Su resolución se muestra a continuación:
1. Crear base de datos y una tabla: tabla_segregacion
2. Importar csv con los datos de xcentre, ycentre, zcentre y la ley que queremos. Prestar atención al tipo de datos que se quiere utilizar. Todas las coordenadas pueden entrar como “Integer” mientras que la ley del mineral puede entrar como “Real” o “Float”.
3. Verificar que la importación fue exitosa mediante:
SELECT * FROM tabla_segregacion
4. Generar concatenada
Para esto tenemos que generar una columna:
ALTER TABLE tabla_segregacion ADD COLUMN concatenada INTEGER
Luego actualizamos el campo de la concatenada
UPDATE tabla_segregacion SET concatenada = xcentre||ycentre||zcentre
5. Generamos el query espacial, como habíamos dicho la ley de mineral tiene que ser mayor que 0.010 y se tiene que cumplir que los 3 vecinos más próximos también tienen que cumplir la condición.
Primero creamos la columna “criterio”.
ALTER TABLE tabla_segregacion ADD COLUMN criterio INTEGER
Ponemos valores de “criterio” a 0 como condición inicial.
UPDATE tabla_segregacion SET criterio = 0
6. Generamos una nueva tabla “segregacion_filter" con todos los valores donde se cumple la condición que la ley de mineral es mayor que 0.010.
CREATE TABLE segregacion_filter AS SELECT * FROM tabla_segregacion WHERE ley > 0.010;
7. Luego hacemos el query espacial para los valores donde se cumple que los tres vecinos en x, y y la diagonal también cumplen la condición:
UPDATE segregacion_filter SET criterio = 1 WHERE
(xcentre+10)||ycentre||zcentre IN ( SELECT concatenada FROM segregacion_filter ) AND
(xcentre+20)||ycentre||zcentre IN ( SELECT concatenada FROM segregacion_filter ) AND
(xcentre+30)||ycentre||zcentre IN ( SELECT concatenada FROM segregacion_filter ) AND
xcentre||(ycentre+10)||zcentre IN ( SELECT concatenada FROM segregacion_filter ) AND
(xcentre+10)||(ycentre+10)||zcentre IN ( SELECT concatenada FROM segregacion_filter ) AND
(xcentre+20)||(ycentre+10)||zcentre IN ( SELECT concatenada FROM segregacion_filter ) AND
(xcentre+30)||(ycentre+10)||zcentre IN ( SELECT concatenada FROM segregacion_filter ) AND
xcentre||(ycentre+20)||zcentre IN ( SELECT concatenada FROM segregacion_filter ) AND
(xcentre+10)||(ycentre+20)||zcentre IN ( SELECT concatenada FROM segregacion_filter ) AND
(xcentre+20)||(ycentre+20)||zcentre IN ( SELECT concatenada FROM segregacion_filter ) AND
(xcentre+30)||(ycentre+20)||zcentre IN ( SELECT concatenada FROM segregacion_filter ) AND
xcentre||(ycentre+30)||zcentre IN ( SELECT concatenada FROM segregacion_filter ) AND
(xcentre+10)||(ycentre+30)||zcentre IN ( SELECT concatenada FROM segregacion_filter ) AND
(xcentre+20)||(ycentre+30)||zcentre IN ( SELECT concatenada FROM segregacion_filter ) AND
(xcentre+30)||(ycentre+30)||zcentre IN ( SELECT concatenada FROM segregacion_filter )
8. Luego generamos una concatenada para seleccionar a los vecinos que también cumplan el criterio.
Para esto tenemos que generar una columna:
ALTER TABLE segregacion_filter ADD COLUMN cat_int INTEGER
Luego actualizamos el campo de la concatenada.
UPDATE segregacion_filter SET cat_int = xcentre||ycentre||zcentre||criterio
Luego verificamos que existe los vecinos.
UPDATE segregacion_filter SET criterio = 2 WHERE
xcentre-10)||ycentre||zcentre||1 IN (SELECT cat_int FROM segregacion_filter) OR
(xcentre-20)||ycentre||zcentre||1 IN (SELECT cat_int FROM segregacion_filter) OR
(xcentre-30)||ycentre||zcentre||1 IN (SELECT cat_int FROM segregacion_filter) OR
xcentre||(ycentre-10)||zcentre||1 IN (SELECT cat_int FROM segregacion_filter) OR
(xcentre-10)||(ycentre-10)||zcentre||1 IN (SELECT cat_int FROM segregacion_filter) OR
(xcentre-20)||(ycentre-10)||zcentre||1 IN (SELECT cat_int FROM segregacion_filter) OR
(xcentre-30)||(ycentre-10)||zcentre||1 IN (SELECT cat_int FROM segregacion_filter) OR
xcentre||(ycentre-20)||zcentre||1 IN (SELECT cat_int FROM segregacion_filter) OR
(xcentre-10)||(ycentre-20)||zcentre||1 IN (SELECT cat_int FROM segregacion_filter) OR
(xcentre-20)||(ycentre-20)||zcentre||1 IN (SELECT cat_int FROM segregacion_filter) OR
(xcentre-30)||(ycentre-20)||zcentre||1 IN (SELECT cat_int FROM segregacion_filter) OR
xcentre||(ycentre-30)||zcentre||1 IN (SELECT cat_int FROM segregacion_filter) OR
(xcentre-10)||(ycentre-30)||zcentre||1 IN (SELECT cat_int FROM segregacion_filter) OR
(xcentre-20)||(ycentre-30)||zcentre||1 IN (SELECT cat_int FROM segregacion_filter) OR
(xcentre-30)||(ycentre-30)||zcentre||1 IN (SELECT cat_int FROM segregacion_filter)