Skip to content

2021_12 Actualización a DIVIPOLA 2020

Vladimir Támara Patiño edited this page Dec 20, 2021 · 10 revisions

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:

  1. 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
  2. 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 ).

1. Fuente de datos

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).

2. Preparación de datos

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.

2.1. Búsqueda de errores comunes

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

3. Importación a base de datos de sip sobre PostgreSQL

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.

4. Comparación de departamentos con los de sip

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
;

5. Comparación de municipios con los de sip

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

6. Comparación de centros poblados con los de sip

  • En sip se cuentan 7978
SELECT COUNT(DISTINCT codcp) FROM divipola_sip;
  • Divipola 2020 cuenta 7884
SELECT COUNT(DISTINCT codcp) FROM divipola_oficial_2020 ;

6.1 Centros poblados que se sacaron de DIVIPOLA 20202 respecto a los que tenía sip

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;

6.2 Centros poblados que se agregaron

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.

6.3 Diferencias en centro poblados con códigos comunes

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.

6.4 Cambio en tipo de centro poblado

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
;

7. Verificación de la migración

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.

8. Cambio a la semilla con datos básicos

Después de ejecutar la migración se hizo con:

cd test/dummy
bin/rails sip:vuelcabasicas
cp db/datos-basicas.sql ../../db/
Clone this wiki locally