Last active
September 30, 2015 18:02
-
-
Save plablo09/797ec9c1779d74bae08f to your computer and use it in GitHub Desktop.
Usos de suelo (sql)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| --Tenemos dos tablas, una con los datos para las colonias (colonias_final) y otra con los nombres de las colonias (colonias_names). Lo que quiero hacer es pegarle los nombres de las colonias a los datos | |
| --Para hacer el spatial join voy a usar un punto al interior de las colonias porque las geomeetrías no coinciden perfectamente (no quiero usar st_centroid porque las geometrías de las colonias son caprichosas y el centroide puede caer fuera de la colonia). Para poder usar índices, voy a crear una tabla intermedia con los centroides de la capa con nombres | |
| --Creamos la tabla de centroides | |
| create table centro_col_nombres as select gid, nombre, st_PointOnSurface(geom) as geom | |
| from colonias_names; | |
| --Le ponemos índice | |
| create index sidx_centro_col_nombres_geom on centro_col_names USING GIST (geom); | |
| --Agregamos la columna para el nombre en la tabla de destino | |
| alter table colonias_final add column nombre text; | |
| --Le damos valor al nombre | |
| update colonias_final c set nombre = foo.nombre | |
| from | |
| (select d.id_colonia, n.nombre | |
| from colonias_final d | |
| join centro_col_nombres n | |
| on st_intersects(d.geom , n.geom)) as foo | |
| where foo.id_colonia = c.id_colonia | |
| --Ahora vamos a pegarle a cada manzana (tabla manzanas_zmvm) el id de la colonia a la que pertenece, otra vez vamos a usar st_Point_On_Surface para evitar problemas con las geometrías: | |
| --Creamos la tabla con los centroides de las manzanas y le creamos un índice espacial | |
| create table centro_manzanas as select gid, st_PointOnSurface(geom) as geom | |
| from manzanas_zmvm; | |
| create index sidx_centro_manzanas_geom on centro_manzanas USING GIST (geom); | |
| --Agregamos una columna para el id de la colonia a la tabla original de manzanas: | |
| alter table manzanas_zmvm add column id_colonia integer; | |
| --Populamos la columna con los ids de las colonias: | |
| update manzanas_zmvm mz set id_colonia = foo.id_colonia | |
| from | |
| (select m.gid, c.id_colonia from | |
| centro_manzanas m | |
| join colonias_final c | |
| on st_intersects(m.geom,c.geom)) as foo | |
| where mz.gid = foo.gid | |
| --Ahora vamos a crear una tabla de colonias con la geometría de las manzanas, aquí hay un par de trucos: ST_Multi es mucho más rápido que ST_Union pero si se usa sobre geometrías multi regresa colecciones, por eso usamos el st_dump: | |
| SELECT f.id_colonia, ST_Multi(ST_Collect(f.geom)) as geom | |
| FROM | |
| (SELECT gid, id_colonia, (ST_Dump(geom)).geom As geom | |
| FROM manzanas_zmvm) as f | |
| GROUP BY f.id_colonia | |
| --Ya sólo falta pegarle a esta nueva geometría de colonias los datos de la tabla colonias_final: | |
| create table colonias_multi as | |
| select d.id_colonia, d. poblacion, d.vivienda, d.servicios, d.comercio, d.ocio, d.entropia_c as entropia, d.nombre, m.geom | |
| from | |
| (SELECT f.id_colonia, ST_Multi(ST_Collect(f.geom)) as geom | |
| FROM | |
| (SELECT gid, id_colonia, (ST_Dump(geom)).geom As geom | |
| FROM manzanas_zmvm) as f | |
| GROUP BY f.id_colonia) as m | |
| join colonias_final d | |
| on d.id_colonia = m.id_colonia | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment