Este documento describe el proceso para importar el dataset INEGI DCAH 2025, que contiene los límites poligonales oficiales de colonias y otros asentamientos humanos en México.
Estas geometrías se utilizan para construir el Boundaries Layer 6, donde se calcula el Nivel Socioeconómico AMAI (NSE) para cada colonia.
Directorios sugeridos
Working : D:\AXSI\INEGI\DCAH_2025
Download: D:\AXSI\INEGI\DCAH_2025\Download
Fuente: INEGI — Delimitación de colonias y otros asentamientos humanos (DCAH)
Edición: 2025
Cobertura: 2025‑01‑01 a 2025‑12‑31
Datum: ITRF2008, Elipsoide GRS80
Tipo de archivo: SHP (530.26 MB)
URL de descarga: https://www.inegi.org.mx/programas/dcah/#descargas
La página se ve así:
Cartografía geoestadística histórica de México
=> https://www.inegi.org.mx/app/biblioteca/ficha.html?upc=794551131954
Información Topográfica a escala 1:50,000 y sus actualizaciones
=> https://www.inegi.org.mx/programas/topografia/50000/#descargas
Hacer clic en Consultar o Buscar para mostrar las ediciones disponibles.
Directorio: D:\INEGI\DCAH_2025\Download
Nombre del archivo: 794551163078_s.zip (edición 2025)
Dentro encontrarás varios ZIP por estado y uno llamado: 00_integrado.zip, que contiene datos de todos los estados.
Extrae los archivos en negritas:
El dataset incluye:
| Campo | Descripción |
|---|---|
| CVEGEO | Código cvegeo de 13 dígitos EEMMMLLLLAAAA (EE estado, MMM municipio, LLLL localidad, AAAA colonia) |
| CVE_ENT | Código de estado |
| CVE_MUN | Código de municipio |
| CVE_LOC | Código de localidad |
| CVE_ASEN | Código de asentamiento |
| CP | Código postal |
| FECHA_ACT | Última actualización MM/YYYY |
| INSTITUCIO | Nombre de la institución fuente |
| NOM_ASEN | Nombre de la colonia |
| TIPO | Tipo de asentamiento (Fraccionamiento, Colonia, etc.) |
| geom | Polígono de la colonia |
Verifica que NOM_ASEN sea legible (acentos).
El dataset original viene en Windows‑1252, pero QGIS puede cargarlo como UTF‑8.
Si es necesario, ajusta la codificación en:
Propiedades de la capa → Fuente → Windows‑1252
Revisa los acentos en la tabla de atributos.
Directorio: D:\AXSI\INEGI\DCAH_2025
Nombre del archivo: Boundaries_INEGI_DCAH_2025.shp
CRS: EPSG:4023
Codificación: UTF‑8
Después de exportar:
Exporta la capa Boundaries_INEGI_DCAH_2025 a CSV con geometrías WKT:
Guardar → OK
Edita Boundaries_INEGI_DCAH_2025.csv con EditPad Pro o Notepad++:
" que aparezcan dentro de las geometrías"MULTIPOLYGON ((( ... )))")Guarda el archivo asegurando:
| Campo | Descripción |
|---|---|
| WKT | Polígono de la colonia |
| CVEGEO | Código cvegeo de 13 dígitos |
| CVE_ENT | Código de estado |
| CVE_MUN | Código de municipio |
| CVE_LOC | Código de localidad |
| CVE_ASEN | Código de asentamiento |
| CP | Código postal |
| FECHA_ACT | Última actualización MM/YYYY |
| INSTITUCIO | Nombre de la institución |
| NOM_ASEN | Nombre de la colonia |
| TIPO | Tipo de asentamiento (Fraccionamiento, Colonia, etc.) |
-----------------------------------
-- 3.4 — Subir geometrías CSV a SQL
-----------------------------------
-----------------------------
-- 3.4.1 Crear tabla staging
-----------------------------
DROP TABLE IF EXISTS INEGI_DCAH_Staging;
GO
CREATE TABLE INEGI_DCAH_Staging (
WKT varchar(MAX) NOT NULL,
CVEGEO varchar(16) NOT NULL,
CVE_ENT varchar(2) NULL,
CVE_MUN varchar(3) NOT NULL,
CVE_LOC varchar(4) NOT NULL,
CVE_ASEN varchar(4) NOT NULL,
CP varchar(5) NOT NULL,
FECHA_ACT varchar(10) NULL,
INSTITICIO nvarchar(500) NULL,
NOM_ASEN nvarchar(115) NOT NULL,
TIPO nvarchar(100) NOT NULL
);
GO
--------------------
-- 3.4.2 Bulk Insert
--------------------
BULK INSERT INEGI_DCAH_Staging
FROM 'D:\AXSI\INEGI\DCAH_2025\Boundaries_INEGI_DCAH_2025.csv'
WITH (
FIRSTROW = 2,
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n',
CODEPAGE = '65001', -- UTF-8
TABLOCK
);
GO
(79775 rows affected)
SELECT TOP (5) WKT, GVEGEO, CVE_ENT, CVE_MUN, CVE_LOC, CVE_ASEN, CP, FECHA_ACT, INSTITICIO, NOM_ASEN, TIPO
FROM dbo.INEGI_DCAH_Staging
| WKT | GVEGEO | CVE_ENT | CVE_MUN | CVE_LOC | CVE_ASEN | CP | FECHA_ACT | INSTITICIO | NOM_ASEN | TIPO |
|---|---|---|---|---|---|---|---|---|---|---|
| MULTIPOLYGON | 0503300010076 | 05 | 033 | 0001 | 0076 | 27810 | 11/2022 | AYUNTAMIENTO | VILLAS DEL AMÉRICA | FRACCIONAMIENTO |
| MULTIPOLYGON | 0503300010077 | 05 | 033 | 0001 | 0077 | 27810 | 11/2022 | AYUNTAMIENTO | NINGUNO | COLONIA |
| MULTIPOLYGON | 0503300010079 | 05 | 033 | 0001 | 0079 | 00000 | 11/2022 | AYUNTAMIENTO | LOS NOGALES | FRACCIONAMIENTO |
| MULTIPOLYGON | 0503300010081 | 05 | 033 | 0001 | 0081 | 00000 | 11/2022 | AYUNTAMIENTO | SAN JOSÉ | COLONIA |
| MULTIPOLYGON | 0503300010084 | 05 | 033 | 0001 | 0084 | 00000 | 11/2022 | AYUNTAMIENTO | EJIDAL VALPARAISO | COLONIA |
CREATE TABLE [dbo].[Boundaries](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[CVEGEO] [varchar](16) NULL,
[Layer] [int] NOT NULL,
[ISO] [nvarchar](2) NULL,
[Country] [nvarchar](25) NULL,
[State] [nvarchar](85) NULL,
[Municipality] [nvarchar](85) NULL,
[City] [nvarchar](110) NULL,
[Neighborhood] [nvarchar](115) NULL,
[Category] [nvarchar](85) NULL,
[PostalCode] [varchar](5) NULL,
[Population] [int] NULL,
[Dwelings] [int] NULL,
[Occupied_Dwelings] [int] NULL,
[Type] [varchar](10) NULL,
[AreaM2] [float] NULL,
[geog] [geography] NULL,
[geom] [geometry] NULL,
[minLat] [decimal](12, 6) NULL,
[maxLat] [decimal](12, 6) NULL,
[minLon] [decimal](12, 6) NULL,
[maxLon] [decimal](12, 6) NULL,
[IDS_PROM] [numeric](6, 3) NULL,
[NSE] [varchar](5) NULL,
[NSE_LABEL] [varchar](15) NULL,
[NSE_AB_PCT] [numeric](5, 2) NULL,
[NSE_CPLUS_PCT] [numeric](5, 2) NULL,
[NSE_C_PCT] [numeric](5, 2) NULL,
[NSE_DPLUS_PCT] [numeric](5, 2) NULL,
[NSE_DE_PCT] [numeric](5, 2) NULL,
[NSE_AB] [int] NULL,
[NSE_CPLUS] [int] NULL,
[NSE_C] [int] NULL,
[NSE_DPLUS] [int] NULL,
[NSE_DE] [int] NULL,
[NSE_TOTAL] [int] NULL,
[NSE_SCORE] [numeric](6, 3) NULL,
[LastUpdate] [varchar](10) NULL,
[Source] [nvarchar](400) NULL
CONSTRAINT [PK_Boundaries] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[Boundaries] ADD CONSTRAINT [DF_Boundaries_Layer] DEFAULT ((6)) FOR [Layer]
GO
ALTER TABLE [dbo].[Boundaries] ADD CONSTRAINT [DF_Boundaries_ISO] DEFAULT ('MX') FOR [ISO]
GO
ALTER TABLE [dbo].[Boundaries] ADD CONSTRAINT [DF_Boundaries_Country] DEFAULT ('México') FOR [Country]
GO
------------------------------------------------------------
-- 3.6 — Copy DCAH Staging Data into Boundaries (Layer = 6)
------------------------------------------------------------
INSERT INTO dbo.Boundaries (
CVEGEO,
Layer,
Neighborhood,
Category,
PostalCode,
geom,
LastUpdate,
Source
)
SELECT
CVEGEO, -- Unique geographic key
6 AS Layer, -- Neighborhood layer
NOM_ASEN AS Neighborhood, -- Neighborhood name (Colonia)
TIPO AS Category, -- Settlement type
CP AS PostalCode, -- Postal code
geometry::STGeomFromText(WKT, 4326), -- Convert WKT to geometry (EPSG:4326)
RIGHT(FECHA_ACT, 4) + '-' + LEFT(FECHA_ACT, 2) AS LastUpdate, -- Convert MM/YYYY → YYYY-MM
INSTITICIO AS Source -- Data source
FROM dbo.INEGI_DCAH_Staging;
GO
(79775 registros)
DROP TABLE IF EXISTS dbo.INEGI_DCAH_Staging;
Las geometrías WKT importadas deben revisarse para verificar su validez.
Las geometrías inválidas se reparan utilizando MakeValid().
----------------------------------
-- 3.8.0 Validar geometrías importadas
----------------------------------
SELECT ID, CVEGEO
FROM dbo.Boundaries
WHERE geom.STIsValid() = 0;
ID CVEGEO
None
Si el valor es distinto de None, ejecutar el siguiente proceso;
de lo contrario, continuar con el paso 8.9.
-------------------------------------------------
-- 3.8.1 Reparar geometrías inválidas (MakeValid)
-------------------------------------------------
UPDATE dbo.Boundaries
SET geom = geom.MakeValid()
WHERE geom.STIsValid() = 0;
La columna geog almacena la misma geometría en el tipo geography de SQL Server (EPSG:4326).
Esto permite realizar cálculos de distancia y operaciones geodésicas.
UPDATE dbo.Boundaries
SET geog = geography::STGeomFromText(geom.STAsText(), 4326);
(79775 registros)
Validación:
SELECT ID, CVEGEO
FROM dbo.Boundaries
WHERE geog IS NULL;
ID CVEGEO
None
Los valores del bounding box se derivan del envelope de la geometría geom.
UPDATE dbo.Boundaries
SET
minLat = geom.STEnvelope().STPointN(1).STY,
minLon = geom.STEnvelope().STPointN(1).STX,
maxLat = geom.STEnvelope().STPointN(3).STY,
maxLon = geom.STEnvelope().STPointN(3).STX;
(79775 rows affected)
Validación:
SELECT TOP 20 CVEGEO, minLat, maxLat, minLon, maxLon
FROM dbo.Boundaries;
You should see valid numeric values.
Los índices espaciales mejoran significativamente el rendimiento en consultas de intersección, contención y proximidad.
------------------------------------------
-- 3.11.1 Índice espacial para geom (geometry)
------------------------------------------
CREATE SPATIAL INDEX SIDX_Boundaries_geom
ON dbo.Boundaries_TEMP(geom)
WITH (BOUNDING_BOX = (-180, -90, 180, 90));
--------------------------------------------
-- 3.11.2 Índice espacial para geog (geography)
--------------------------------------------
CREATE SPATIAL INDEX SIDX_Boundaries_geog
ON dbo.Boundaries_TEMP(geog);
Commands completed successfully.
Resultado:
Un dataset completo y validado a nivel colonia, listo para el cálculo de NSE, mapeo y uso en la API.