-
-
Notifications
You must be signed in to change notification settings - Fork 8
2021_12 Actualización a DIVIPOLA 2020
Si ha desarrollado un motor o una aplicación sobre sip, para realizar esta actualización en la base de datos de su aplicación basta que actualice gemas y que corra migraciones:
bundle update; bundle
bin/rails db:migrate
En este documento, describimos a nivel técnico como se realizó la actualización del DIVIPOLA 2019 al DIVIPOLA 2020 en el motor sip --motor para Ruby on Rails que facilita el desarrollo de sistemas de información.
Si no está interesado en los detalles técnicos sino en los cambios del DIVIPOLA 2019 a DIVIPOLA 2020 puede consultar un resumen ejecutivo en
https://github.com/pasosdeJesus/sip/wiki/Resumen-ejecutivo-de-la-actualizaci%C3%B3n-a-DIVIPOLA-2020
En sip la actualización del DIVIPOLA se concreta en:
- Una migración que hace las modificaciones a la base de datos de aplicaciones y motores existentes basados en sip:https://github.com/pasosdeJesus/sip/blob/main/db/migrate/20211216125250_divipola2020.rb
- Cambio a la semilla con datos básicos que puede verse en esta contribución.
La edición 2020 del DIVIPOLA respecto al 2019 tuvo menos cambios y más simples que los de la edición 2019 respecto al 2018 (ver https://github.com/pasosdeJesus/sip/wiki/2020_08-Actualizaci%C3%B3n-a-DIVIPOLA-2019 ).
Dado que el geoportal DANE ha estado fuera de servicio a final de 2021, se empleó un DIVIPOLA de Agosto de 2020 suministrado por el DANE en respuesta a derecho de petición de Jul.2020 y disponible en https://gitlab.com/pasosdeJesus/division-politica/-/tree/main/Colombia/2020
Se trata de 33 departamentos, 1121 municipios y 7884 centros poblados (94 centros poblados menos que en el DIVIPOLA 2019).
Se trata de un listado de centros poblados, cada uno con código, departamento, municpio y tipo de centro poblado --son 1103 con tipo CM (Cabecera Municipal) y 6781 con tipo CP (Centro Poblado).
Ya el DANE nos aclaró, en respuesta a derecho de petición (ver https://github.com/pasosdeJesus/sip/blob/datos2020/geografia/respuesta_derecho_de_peticion_DIVIPOLA/20202400198471%20-%20CARLOS%20DURAN%20-%20Posibles%20errores%20en%20DIVIPOLA%20vigente%20y%202019.pdf), el uso de paréntesis y de guiónes en diversos nombres de centros poblados y municipios: los guiones suelen indicar nombres alternativos empleados por moradores y los paréntesis puede contener nombres antiguos o referencias para distinguir la ubicación de otras. Lo consignamos aquí porque no hemos visto una publicación del DANE donde se aclare esto.
La hoja de centros poblados se convirtió a CSV, se eliminaron filas sin datos y se renombraron las columnas a: cod_departamento
, departamento
, cod_municipio
, municipio
, cod_centropoblado
, centropoblado
y tipo_centropoblado
. Notamos que la conversión (con LibreOffice 7) dejó como enteros (sin los ceros iniciales) las columnas con código.
Buscamos errores análogos a unos reportados anteriormente (ver http://bit.ly/2OwFi9M y https://gitlab.com/pasosdeJesus/division-politica/-/blob/main/Colombia/2019/correcciones/Derecho_de_peticion_correcciones_DIVIPOLA_2019.pdf), pero evidenciamos que ya fueron corregidos:
- Espacios faltantes o sobrantes antes y después de paréntesis. Sin problema.
- Espacios faltantes o sobrantes antes y después de guion. Sin problema.
- Consistencia plural.
[^A-Z]EL [ A-Z]*S[^A-Z]
,[^A-Z]LA [^,]*S[^A-Z]
,[^A-Z]LAS [^,]*[^S],
[^A-Z]LOS [^,]*[^S],
. - Punto final sobrante. Sin problema
El CSV resultante se ha dejado en https://gitlab.com/pasosdeJesus/division-politica/-/blob/main/Colombia/2020/DIVIPOLA_DANE_2020_08.csv
El CSV se importó a una base de datos de sip así:
CREATE TABLE divipola_oficial_2020 (
coddep integer,
departamento VARCHAR(512) COLLATE es_co_utf_8,
codmun integer,
municipio VARCHAR(512) COLLATE es_co_utf_8,
codcp integer,
centropoblado VARCHAR(512) COLLATE es_co_utf_8,
tipocp VARCHAR(6)
);
COPY divipola_oficial_2020 FROM '/tmp/DIVIPOLA_DANE_2020_08.csv' DELIMITER ',' CSV HEADER;
Que da una cuenta de 7884 registros.
Se hizo la vista:
CREATE OR REPLACE VIEW divipola_sip AS (SELECT
sip_departamento.id_deplocal AS coddep,
sip_departamento.nombre AS departamento,
sip_departamento.id_deplocal*1000+sip_municipio.id_munlocal AS codmun,
sip_municipio.nombre AS municipio,
sip_departamento.id_deplocal*1000000 +
sip_municipio.id_munlocal*1000+sip_clase.id_clalocal AS codcp,
sip_clase.nombre AS centropoblado,
sip_clase.id_tclase AS tipocp,
sip_clase.id AS sip_idcp
FROM
sip_departamento
JOIN sip_municipio ON sip_municipio.id_departamento=sip_departamento.id
JOIN sip_clase ON sip_clase.id_municipio=sip_municipio.id
WHERE
sip_departamento.id_pais=170
AND sip_clase.fechadeshabilitacion IS NULL
ORDER BY 2, 4, 6 );
Esta daba una cuenta de 7978 registros correspondientes a los vigentes en 2019.
En ambos se contaron 33 departamentos:
SELECT COUNT(DISTINCT coddep) FROM divipola_oficial_2020;
SELECT COUNT(DISTINCT coddep) FROM divipola_sip;
Se constató que los códigos eran iguales:
SELECT s.coddep FROM divipola_sip AS s
WHERE s.coddep NOT IN (SELECT DISTINCT coddep FROM divipola_oficial_2020 as d);
SELECT d.coddep FROM divipola_oficial_2019_corregido AS d
WHERE d.coddep NOT IN (SELECT DISTINCT coddep FROM divipola_sip as s);
Se compararon nombres y resultaron todos iguales:
SELECT DISTINCT s.coddep,s.departamento,d.departamento FROM divipola_sip AS s
JOIN divipola_oficial_2020 as d
ON s.coddep=d.coddep
WHERE s.departamento<>d.departamento
;
Se contaron 1121 municipios en ambos:
SELECT COUNT(DISTINCT codmun) FROM divipola_oficial_2020 ;
SELECT COUNT(DISTINCT codmun) FROM divipola_sip;
Se compararon códigos sin encontrar diferencias:
SELECT DISTINCT s.codmun FROM divipola_sip AS s
WHERE s.codmun NOT IN (
SELECT DISTINCT codmun
FROM divipola_oficial_2020 as d
);
SELECT DISTINCT d.codmun FROM divipola_oficial_2020 AS d
WHERE d.codmun NOT IN (
SELECT DISTINCT codmun
FROM divipola_sip as s
);
Se buscaron diferencias en nombres
SELECT DISTINCT s.codmun,s.municipio,d.municipio FROM divipola_sip AS s
JOIN divipola_oficial_2020 as d
ON s.codmun=d.codmun
WHERE s.municipio<>d.municipio
;
Se encontraron diferencias en 2 nombres. Se propone dejar en sip el nombre que aparece en DIVIPOLA2020:
codmun | sip 2020 | divipola 2020 | sip 2021 |
---|---|---|---|
70823 | SAN JOSÉ DE TOLUVIEJO (TOLÚ VIEJO) | SAN JOSÉ DE TOLUVIEJO | SAN JOSÉ DE TOLUVIEJO |
13468 | SANTA CRUZ DE MOMPÓX | SANTA CRUZ DE MOMPOX | SANTA CRUZ DE MOMPOX |
- En sip se cuentan 7978
SELECT COUNT(DISTINCT codcp) FROM divipola_sip;
- Divipola 2020 cuenta 7884
SELECT COUNT(DISTINCT codcp) FROM divipola_oficial_2020 ;
Ubicamos los que están en sip pero no en DIVIPOLA 2020:
SELECT s.codcp, s.centropoblado FROM divipola_sip AS s
WHERE s.codcp NOT IN (
SELECT DISTINCT codcp
FROM divipola_oficial_2020 as d
) ORDER BY 1;
Dan 98 registros:
codcp | departamento | municipio | centropoblado |
---|---|---|---|
5266022 | ANTIOQUIA | ENVIGADO | PARCELACIÓN TORRE LUNERA |
5315011 | ANTIOQUIA | GUADALUPE | PUENTE ACACÍAS |
5543005 | ANTIOQUIA | PEQUE | TOLDAS |
5615038 | ANTIOQUIA | RIONEGRO | PARCELACIÓN CONJUNTO CAMPESTRE LLANO GRANDE |
5615040 | ANTIOQUIA | RIONEGRO | PARCELACION LAS BRUMAS |
5615041 | ANTIOQUIA | RIONEGRO | PARCELACIÓN LLANOS DE NORMANDÍA |
5615042 | ANTIOQUIA | RIONEGRO | PARCELACION NORMANDIA |
5615044 | ANTIOQUIA | RIONEGRO | PARCELACIÓN SIERRA ALTA |
5667001 | ANTIOQUIA | SAN RAFAEL | SAN JULIÁN |
5893020 | ANTIOQUIA | YONDÓ | LA RINCONADA |
8549004 | ATLÁNTICO | PIOJÓ | PUNTA ASTILLEROS |
8606006 | ATLÁNTICO | REPELÓN | EL PORVENIR (LAS COMPUERTAS) |
8832014 | ATLÁNTICO | TUBARÁ | PUERTO CAIMÁN |
13654010 | BOLÍVAR | SAN JACINTO | CASA DE PIEDRA |
13655002 | BOLÍVAR | SAN JACINTO DEL CAUCA | BERMÚDEZ |
13673010 | BOLÍVAR | SANTA CATALINA | PALMARITO |
15507011 | BOYACÁ | OTANCHE | MIRADOR |
17442007 | CALDAS | MARMATO | LA GARRUCHA |
17495001 | CALDAS | NORCASIA | KILÓMETRO 40 |
17513014 | CALDAS | PÁCORA | SAN LORENZO |
17513015 | CALDAS | PÁCORA | FILO BONITO |
18753030 | CAQUETÁ | SAN VICENTE DEL CAGUÁN | LA CHORRERA |
18756009 | CAQUETÁ | SOLANO | PEÑA ROJA DEL CAGUAN |
18756010 | CAQUETÁ | SOLANO | LA MANÁ |
18785006 | CAQUETÁ | SOLITA | KILÓMETRO 36 |
19418015 | CAUCA | LÓPEZ DE MICAY | SAN ISIDRO |
19418016 | CAUCA | LÓPEZ DE MICAY | SAN PEDRO DE NAYA |
19418033 | CAUCA | LÓPEZ DE MICAY | BOCA GRANDE |
19418037 | CAUCA | LÓPEZ DE MICAY | CASAS VIEJAS |
20175026 | CESAR | CHIMICHAGUA | DARDANELOS DOS |
20175042 | CESAR | CHIMICHAGUA | PAJARITO |
23162031 | CÓRDOBA | CERETÉ | CONDOMINIO LAGOS DE SANTA RITA |
23672014 | CÓRDOBA | SAN ANTERO | EL TRIBUTO |
23675017 | CÓRDOBA | SAN BERNARDO DEL VIENTO | BARCELONA |
23807034 | CÓRDOBA | TIERRALTA | BONITO VIENTO |
25040005 | CUNDINAMARCA | ANOLAIMA | BOQUERÓN DE ILO |
25181001 | CUNDINAMARCA | CHOACHÍ | ALTO DEL PALO |
25183001 | CUNDINAMARCA | CHOCONTÁ | EL SISGA |
25293002 | CUNDINAMARCA | GACHALÁ | MONTECRISTO |
25297008 | CUNDINAMARCA | GACHETÁ | LOS LÓPEZ |
25815008 | CUNDINAMARCA | TOCAIMA | SAN CARLOS |
25899023 | CUNDINAMARCA | ZIPAQUIRÁ | SAN GABRIEL |
27025002 | CHOCÓ | ALTO BAUDÓ | AMPARRADO |
27150005 | CHOCÓ | CARMEN DEL DARIÉN | TURRIQUITADÓ |
27425016 | CHOCÓ | MEDIO ATRATO | SAN FRANCISCO DE TAUCHIGADO |
27430031 | CHOCÓ | MEDIO BAUDÓ | PUERTO CÓRDOBA |
27615034 | CHOCÓ | RIOSUCIO | CAMPO ALEGRE |
27745020 | CHOCÓ | SIPÍ | PLAYA RICA |
41001006 | HUILA | NEIVA | ÓRGANOS |
41001035 | HUILA | NEIVA | SANTA BARBARA |
44001037 | LA GUAJIRA | RIOHACHA | LA GLORIA |
44090009 | LA GUAJIRA | DIBULLA | RÍO NEGRO |
44430010 | LA GUAJIRA | MAICAO | MARAÑAMANA |
44847024 | LA GUAJIRA | URIBIA | TAGUAYRA |
44847026 | LA GUAJIRA | URIBIA | COMUNIDAD ETDANA |
44847030 | LA GUAJIRA | URIBIA | PASADENA |
47570008 | MAGDALENA | PUEBLOVIEJO | ISLA DE CATAQUITA |
50330003 | META | MESETAS | BRISAS DEL DUDA |
50350006 | META | LA MACARENA | LA CATALINA |
50350009 | META | LA MACARENA | ALTO MORROCOY (NUEVO HORIZONTE) |
50686002 | META | SAN JUANITO | LA CANDELARIA |
52696016 | NARIÑO | SANTA BÁRBARA | LAS MARÍAS |
52835064 | NARIÑO | SAN ANDRÉS DE TUMACO | PAPAYAL LA PLAYA |
52835132 | NARIÑO | SAN ANDRÉS DE TUMACO | MILAGROS |
52835165 | NARIÑO | SAN ANDRÉS DE TUMACO | VUELTA DEL GALLO |
52835192 | NARIÑO | SAN ANDRÉS DE TUMACO | IMBILI EL GUABO |
52835195 | NARIÑO | SAN ANDRÉS DE TUMACO | INGUAPI DEL GUAYABO |
52835215 | NARIÑO | SAN ANDRÉS DE TUMACO | SAN FRANCISCO |
52835225 | NARIÑO | SAN ANDRÉS DE TUMACO | TRUJILLO |
54206001 | NORTE DE SANTANDER | CONVENCIÓN | BALCONES |
54206014 | NORTE DE SANTANDER | CONVENCIÓN | HONDURAS LA MOTILONA |
54223005 | NORTE DE SANTANDER | CUCUTILLA | SAN MIGUEL |
63548001 | QUINDÍO | PIJAO | BARRAGÁN |
66170012 | RISARALDA | DOSQUEBRADAS | GAITÁN |
66170013 | RISARALDA | DOSQUEBRADAS | LA DIVISA |
70204004 | SUCRE | COLOSÓ | EL CERRO |
70508032 | SUCRE | OVEJAS | ALMAGRA SECTOR LAS PASAS |
70678006 | SUCRE | SAN BENITO ABAD | LOS ÁNGELES |
70708022 | SUCRE | SAN MARCOS | CUATRO BOCAS |
70717010 | SUCRE | SAN PEDRO | RANCHO LARGO |
73001026 | TOLIMA | IBAGUÉ | CHARCO RICO |
76109052 | VALLE DEL CAUCA | BUENAVENTURA | CALLE LARGA |
76109072 | VALLE DEL CAUCA | BUENAVENTURA | SAN JOAQUÍN |
76109101 | VALLE DEL CAUCA | BUENAVENTURA | LAS PALMAS |
76109105 | VALLE DEL CAUCA | BUENAVENTURA | PITAL |
76109114 | VALLE DEL CAUCA | BUENAVENTURA | CALLE LARGA - RIO MAYORQUIN |
76364035 | VALLE DEL CAUCA | JAMUNDÍ | LA CÁRCEL |
76563019 | VALLE DEL CAUCA | PRADERA | SAN ISIDRO |
81065003 | ARAUCA | ARAUQUITA | LOS ANGELITOS |
81736015 | ARAUCA | SARAVENA | PUERTO SALCEDO |
81736016 | ARAUCA | SARAVENA | QUESQUALITO |
85010011 | CASANARE | AGUAZUL | TURUA |
85430002 | CASANARE | TRINIDAD | GUAMAL |
91540016 | AMAZONAS | PUERTO NARIÑO | SANTAREN |
95001041 | GUAVIARE | SAN JOSÉ DEL GUAVIARE | TIENDA NUEVA |
97001001 | VAUPÉS | MITÚ | BOCAS DE QUERARÍ |
97001003 | VAUPÉS | MITÚ | MACUANA |
97001004 | VAUPÉS | MITÚ | TRINIDAD DEL TIQUIÉ |
Para actualizar información se realiza la consulta:
SELECT 'UPDATE sip_clase SET observaciones=completa_obs(observaciones, ''No está en DIVIPOLA 2020.''),' ||
' fechadeshabilitacion=''2021-12-16'' ' ||
' WHERE id=''' || sip_idcp || '''; -- ' || s.codcp || ' ' || s.centropoblado
FROM divipola_sip AS s
WHERE s.codcp NOT IN (
SELECT DISTINCT codcp
FROM divipola_oficial_2020 as d
) ORDER BY s.codcp;
Con \copy este resultado se envía a un archivo en el sistema de archivo para posteriormente agregarlo a la migración.
\COPY (SELECT ...) TO '/tmp/deshabilita.sql';
Note que se usa la función completa_obs
cuya definición es:
CREATE OR REPLACE FUNCTION completa_obs(obs VARCHAR,
nuevaobs VARCHAR) RETURNS VARCHAR AS $$
BEGIN
RETURN CASE WHEN obs IS NULL THEN nuevaobs
WHEN obs='' THEN nuevaobs
WHEN RIGHT(obs, 1)='.' THEN obs || ' ' || nuevaobs
ELSE obs || '. ' || nuevaobs
END;
END; $$
LANGUAGE PLPGSQL;
Examinando los nuevos de DIVIPOLA 2020:
SELECT d.codcp, d.centropoblado FROM divipola_oficial_2020 AS d
WHERE d.codcp NOT IN (
SELECT DISTINCT codcp
FROM divipola_sip as s
) ORDER BY codcp;
Encontramos 4:
coddep | Departamento | codmun | Municipio | codcp | Centro Poblado |
---|---|---|---|---|---|
19 | CAUCA | 142 | CALOTO | 19142051 | MORALES |
23 | CÓRDOBA | 586 | PURÍSIMA DE LA CONCEPCIÓN | 23586007 | CERROPETRONA |
52 | NARIÑO | 224 | CUASPUD CARLOSAMA | 52224001 | MACAS |
95 | GUAVIARE | 1 | SAN JOSÉ DEL GUAVIARE | 95001046 | LA CATALINA |
De estos, ya estaban en sip MORALES Y MACAS con códigos internos 2197 y 8117. Sus códigos DIVIPOLA son los mismos y según el comentario fueron deshabilitados por el DIVIPOLA 2018.
Se encuentran 5 diferencias
SELECT s.sip_idcp, s.codcp, s.centropoblado, d.centropoblado FROM
divipola_sip AS s JOIN divipola_oficial_2020 AS d
ON s.codcp=d.codcp
WHERE s.centropoblado != d.centropoblado
ORDER BY s.codcp
;
Código | sip2020 | Divipola2020 |
---|---|---|
5129006 | LA PRIMAVERA | LA PRIMAVERA SANTA CRUZ |
13468000 | SANTA CRUZ DE MOMPÓX, DISTRITO ESPECIAL, TURÍSTICO, CULTURAL E HISTÓRICO | SANTA CRUZ DE MOMPOX, DISTRITO ESPECIAL, TURÍSTICO, CULTURAL E HISTÓRICO |
68081000 | BARRANCABERMEJA | BARRANCABERMEJA, DISTRITO ESPECIAL, PORTUARIO, BIODIVERSO, INDUSTRIAL Y TURÍSTICO |
76109102 | LOS LIMONES | LIMONES |
94343005 | PUERTO ZANCUDO* | PUERTO ZANCUDO |
Se revisaron y se actualizan en sip.
No se encuentran diferencias:
SELECT s.sip_idcp, s.codcp, s.tipocp, d.tipocp FROM
divipola_sip AS s JOIN divipola_oficial_2019_corregido AS d
ON s.codcp=d.codcp
WHERE s.tipocp != UPPER(d.tipocp)
ORDER BY s.codcp
;
Se aplica la migración completa y se vuelven a ejecutar las comparaciones de este documento para asegurar (1) que la cantidad de departamentos, municipios y centros poblados es la misma, (2) que no hay cambio en los códigos y (3) que los cambios en nombres son intencionales, (4) que no hay diferencia en los tipos de centro poblados.
Después de ejecutar la migración se hizo con:
cd test/dummy
bin/rails sip:vuelcabasicas
cp db/datos-basicas.sql ../../db/
Desarrollado por Pasos de Jesús. Dominio público de acuerdo a legislación colombiana. Agradecemos financiación para personalizaciones de dominio público a diversas organizaciones, ver https://github.com/pasosdeJesus/sivel2/blob/master/CREDITOS.md
- Validación de etiquetas de Colombia y sus departamentos entre OSM de Sep.2022 y DIVIPOLA 2022
- Actualización a DIVIPOLA 2022-07 y Resumen ejecutivo de la actualización a DIVIPOLA 2022-07
- Actualización a DIVIPOLA 2021 y Resumen ejecutivo de la actualización a DIVIPOLA 2021
- Actualización a Rails 7
- Actualización a DIVIPOLA 2020 y Resumen ejecutivo de la actualización a DIVIPOLA 2020
- Extensiones para Chomium útiles para desarrollo
- Actualización de sip 2.0b11 a 2.0b12
- Actualización de sip 2.0b10 a 2.0b11
- Actualización de Rails 6.0 a Rails 6.1
- Resumen ejecutivo de la actualización a DIVIPOLA 2019
- Actualización a DIVIPOLA 2019
- Actualización-de-sip-2.0b6-a-sip-2.0b7
- Pasando de sprockets a webpacker con Rails 6
- Actualización a Rails 6 en 6 pasos
- Actualización a DIVIPOLA 2018
- Actualización de Rails 5.1 a Rails 5.2
- Actualizando a Rails 5
- Actualización a PostgreSQL posterior a 10.2