3.1.10. Glebas de Operações Contratadas com Recursos Públicos

Como parte dos microdados do Sicor disponibilizados publicamente, encontram-se as glebas associadas às operações de crédito contratadas com recursos públicos. As figuras mostradas na Tabela 3.10 são um recorte temporal (2022) e espacial (Minas Gerais e Triângulo Mineiro) dessas glebas.

Tabela 3.10 - Glebas das operações contratadas com recursos públicos do ano de 2022 localizadas no Estado de Minas Gerais.

fig:sicor:microdados:glebas:mapa-glebas-mg-2022

fig:sicor:microdados:glebas:mapa-glebas-triangulo-mg-2022

Esses microdados são disponibilizados no sítio do Banco Central em arquivos no formato CSV, particionados por ano, entre 2013 e 2024, como mostrado abaixo:

A estrutura desses arquivos pode ser vista na Tabela 3.11.

Tabela 3.11 - Estrutura dos arquivos contendo os limites das glebas de contratos com recursos públicos.

nome

tipo

descrição

PK, FK

ref_bacen

integer

Número mascarado de referência do contrato

PK, FK

nu_ordem

integer

Número da destinação/finalidade dentro do contrato

PK

nu_indice

integer

Identificador da gleba dentro da operação

gt_geometria

text

Geometria da gleba no formato Well-Know Text (WKT)

A coluna gt_geometria contem elementos geométricos descritos no formato WKT. As geometrias no Sicor são codificadas em coordenadas geográficas (LAT/LONG) no sistema geodésico de referência SIRGAS 2000.

Nota

Para mais detalhes sobre a notação WKT, consulte a Seção 1.7.1 - Representação WKT.

Dica

As geotecnologias que utilizam códigos EPSG para indicar sistemas de referência espacial (SRS) definem o código EPSG:4674 para coordenadas geográficas (LAT/LONG) no sistema geodésico de referência SIRGAS 2000.

Os arquivos listados acima foram carregados na tabela sicor_glebas_wkt do banco de dados PostgreSQL. A Figura 3.9 apresenta o relacionamento dessa tabela com a tabela de operações contratadas.

Diagrama Entidade-Relacionamento das glebas de contratações com recursos públicos (simplificado)

Figura 3.9 - Diagrama Entidade-Relacionamento das glebas de contratações com recursos públicos (simplificado).

No diagrama acima, as colunas ref_bacen e nu_ordem relacionam com as respectivas colunas da tabela sicor_operacao_basica_estado, ligando a geometria de uma gleba à operação de contratação de crédito (Seção 3.1.9 - Operações Contratadas com Recursos Públicos e Privados).

A organização dos dados nessa tabela de glebas permite que mais de uma geometria seja associada a uma mesma operação, por isso a coluna nu_indice faz parte da chave primária da tabela.

Dica

O comando SQL para definição dessa tabela no PostgreSQL é apresentado no Trecho de Código 3.7.

Trecho de Código 3.7 - Criação da tabela sicor_glebas_wkt.
--
-- Tabela: Glebas de operações em formato WKT.
--
CREATE TABLE sicor_glebas_wkt
(
  ref_bacen     INTEGER NOT NULL,
  nu_ordem      INTEGER NOT NULL,
  nu_indice     INTEGER NOT NULL,
  gt_geometria  TEXT NOT NULL
);

--
-- Definição de chave primária formada pelos campos ref_bacen, nu_ordem e nu_indice.
--
ALTER TABLE sicor_glebas_wkt ADD CONSTRAINT sicor_glebas_wkt_pkey  PRIMARY KEY (ref_bacen, nu_ordem, nu_indice);

--
-- Definição de integridade referencial entre as sicor_operacao_basica_estado e tabelas sicor_glebas_wkt
--
ALTER TABLE sicor_glebas_wkt ADD CONSTRAINT sicor_glebas_wkt_ref_bacen_fkey
    FOREIGN KEY(ref_bacen, nu_ordem) REFERENCES sicor_operacao_basica_estado(ref_bacen, nu_ordem)
        ON UPDATE CASCADE
        ON DELETE NO ACTION;

Dica

O PostgreSQL fornece um comando para uso via SQL chamado COPY que permite mover dados de arquivos para tabelas do banco de dados e vice-versa. Este comando permite lidar com arquivos texto, CSV e binários. Esse comando de importação e exportação de dados é usado pelo meta-comando \copy do aplicativo psql e pelo pgAdmin. Portanto, para carregar o arquivo CSV contendo as glebas do ano de 2022 para a tabela sicor_glebas_wkt podemos usar o seguinte comando:

\copy sicor_glebas_wkt FROM '/dados/sicor_glebas_wkt_2022.csv'
                       WITH (DELIMITER ';', FORMAT CSV, HEADER, ENCODING 'WIN1252');

Para mais detalhes sobre importação de dados, consulte a Seção 1.11.

A representação WKT trata-se apenas de um texto e como tal, não permite realizar operações geométricas diretamente, como o cálculo de área e de perímetro. Logo, o formato WKT usado pelo Sicor na representação das glebas precisa ser transformado em um tipo de dado do PostgreSQL que permita realizar essas operações. O tipo PostGIS Geometry permite representar geometrias no Plano Cartesiano e pode ser construído a partir de um texto WKT através de uma operação de coerção de tipo, que consiste na transformação da string WKT em um objeto geométrico do PostGIS utilizando o operador de cast ::. Por exemplo, para converter um polígono representado em WKT para uma geometria do PostGIS do tipo polygon associado ao SRS 4674, podemos fazer:

SELECT 'POLYGON( (1 1, 2 3, 5 4, 5 1, 1 1), (3 2, 4 3, 4 2, 3 2) )'::geometry(POLYGON, 4674);

O resultado do comando acima é uma geometria no formato binário do PostGIS (EWKB) que é apresentado na forma de uma string codificada em hexadecimal (HEXEWKB):

                 geometry
----------------------------------------------------------------------------------------------
 0103000020421200000200000005000000000000000000F03F00000000...00000000000008400000000000000040
(1 row)

O tipo PostGIS Geometry suporta diversas operações, entre elas:

  • Entrada e Saída: ST_GeomFromText, ST_AsWKT, ST_AsGeoJSON.

  • Propriedades: ST_GeometryType, ST_IsSimple, ST_Envelope, ST_Zmflag.

  • Métricas: ST_Area, ST_Perimeter, ST_Distance.

  • Relacionamentos espaciais ou relacionamentos topológicos: ST_Contains, ST_Within, ST_Covers, ST_CoveredBy` , ``ST_Crosses, ST_Overlaps, ST_Equals, ST_Disjoint, ST_Intersects.

  • Conjunto: ST_Intersection, ST_Union ST_Difference, ST_SymDifference.

  • Construções geométricas: ST_Buffer, ST_Centroid, ST_PointOnSurface, ST_GeneratePoints, ST_MinimumBoundingCircle, ST_OrientedEnvelope.

Para ilustrar o uso do tipo PostGIS Geometry, vamos construir uma consulta SQL que compute o total de geometrias de cada tipo (Trecho de Código 3.8). Para isso, iremos transformar o texto WKT da coluna gt_geometria em um objeto geométrico e, em seguida, utilizar a função ST_GeometryType para determinar o seu tipo.

Trecho de Código 3.8 - Tipos geométricos das glebas.
  SELECT ST_GeometryType(gt_geometria::GEOMETRY) AS tipo_geometrico,
         COUNT(*) AS num_geometrias
    FROM sicor_glebas_wkt
GROUP BY tipo_geometrico
ORDER BY tipo_geometrico;

Saída:

 tipo_geometrico | num_geometrias
-----------------+----------------
 ST_MultiPolygon |          11159
 ST_Point        |           3940
 ST_Polygon      |        5801274
(3 rows)

Portanto, considerando todos os microdados de glebas[1], pode ser observado a existência de 5.816.381 geometrias divididas nos seguintes tipos:

  • Point: 3.940

  • Polygon: 5.801.274

  • MultiPolygon: 11.159

Para obter os tipos geométricos das glebas e o total desses tipos em cada ano, é necessário construir uma consulta incluindo a tabela sicor_operacao_basica_estado, que se relaciona com a tabela sicor_glebas_wkt e possui a coluna dt_emissao que contém o registro das datas de contratação dos financiamentos. Portanto, esta consulta precisa utilizar as tabelas sicor_glebas_wkt e sicor_operacao_basica_estado, relacionando os campos associados, ref_bacen e nu_ordem e deve usar o ano da data de contratação (dt_emissao) e o tipo geométrico (ST_GeometryType) para definir o agrupamento para a totalização dos tipos geométricos (Trecho de Código 3.9).

Trecho de Código 3.9 - Tipos geométricos das glebas.
  SELECT Extract(YEAR from contratos.dt_emissao) AS ano,
         ST_GeometryType(gt_geometria::GEOMETRY) AS tipo_geometrico,
         COUNT(*) AS num_geometrias
    FROM sicor_glebas_wkt AS glebas,
         sicor_operacao_basica_estado AS contratos
   WHERE glebas.ref_bacen = contratos.ref_bacen
     AND glebas.nu_ordem = contratos.nu_ordem
GROUP BY ano, tipo_geometrico
ORDER BY ano, tipo_geometrico;

A consulta acima irá retornar uma saída semelhante à mostrada abaixo:

 ano  | tipo_geometrico | num_geometrias
------+-----------------+----------------
 2013 | ST_MultiPolygon |             63
 2013 | ST_Polygon      |            584
 2014 | ST_MultiPolygon |            761
 2014 | ST_Polygon      |           1210
 2015 | ST_MultiPolygon |           6360
 2015 | ST_Polygon      |           2589
 2016 | ST_MultiPolygon |           3419
 2016 | ST_Polygon      |          87055
 2017 | ST_MultiPolygon |            387
 2017 | ST_Polygon      |         315406
 2018 | ST_MultiPolygon |             28
 2018 | ST_Point        |            182
 2018 | ST_Polygon      |         397443
 2019 | ST_MultiPolygon |             12
 2019 | ST_Point        |            539
 2019 | ST_Polygon      |         611944
 2020 | ST_MultiPolygon |             25
 2020 | ST_Point        |           3166
 2020 | ST_Polygon      |         889510
 2021 | ST_MultiPolygon |             29
 2021 | ST_Point        |             53
 2021 | ST_Polygon      |         991082
 2022 | ST_MultiPolygon |             39
 2022 | ST_Polygon      |        1073743
 2023 | ST_MultiPolygon |             36
 2023 | ST_Polygon      |        1131550
 2024 | ST_Polygon      |         299158
(27 rows)

Outra avaliação que podemos fazer sobre as geometrias das glebas diz respeito à dimensão de suas coordenadas, isto é, se temos geometrias 2D e 3D. A função ST_Zmflag do PostGIS retorna um código informando se a dimensão das coordenadas é 2D, 3D, 4D ou 3D-M (no caso de uma das dimensões estar associada a medidas). A consulta apresentada no Techo de Código 3.10 mostra como obter essa informação.

Trecho de Código 3.10 - Tipos geométricos das glebas.
  SELECT Extract(YEAR from contratos.dt_emissao) AS ano,
         CASE WHEN ST_Zmflag(gt_geometria::GEOMETRY) = 0 THEN '2D'
              WHEN ST_Zmflag(gt_geometria::GEOMETRY) = 1 THEN '3D-M'
              WHEN ST_Zmflag(gt_geometria::GEOMETRY) = 2 THEN '3D-Z'
              WHEN ST_Zmflag(gt_geometria::GEOMETRY) = 3 THEN '4D'
              ELSE 'ERRO'
         END AS dimensao,
         COUNT(*) AS num_geometrias
    FROM sicor_glebas_wkt AS glebas,
         sicor_operacao_basica_estado AS contratos
   WHERE glebas.ref_bacen = contratos.ref_bacen
     AND glebas.nu_ordem = contratos.nu_ordem
GROUP BY ano, dimensao
ORDER BY ano, dimensao;
 ano  | dimensao | num_geometrias
------+----------+----------------
 2013 | 2D       |            263
 2013 | 3D       |            384
 2014 | 2D       |            819
 2014 | 3D       |           1152
 2015 | 2D       |           6643
 2015 | 3D       |           2306
 2016 | 2D       |           3639
 2016 | 3D       |          86835
 2017 | 2D       |            518
 2017 | 3D       |         315275
 2018 | 2D       |             46
 2018 | 3D       |         397607
 2019 | 2D       |             30
 2019 | 3D       |         612465
 2020 | 2D       |             30
 2020 | 3D       |         892671
 2021 | 2D       |             41
 2021 | 3D       |         991123
 2022 | 2D       |             52
 2022 | 3D       |        1073730
 2023 | 2D       |             68
 2023 | 3D       |        1131518
 2024 | 3D       |         299158
(23 rows)

As geometrias são formadas em alguns casos por mais de uma parte, como pode ser observado no resultado da consulta mostrada no Techo de Código 3.11.

Trecho de Código 3.11 - Tipos geométricos das glebas.
  SELECT Extract(YEAR from contratos.dt_emissao) AS ano,
         ST_GeometryType(gt_geometria::geometry) AS tipo_geometrico,
         ST_NumGeometries(gt_geometria::geometry) AS num_partes,
         COUNT(*) AS num_geometrias
    FROM sicor_glebas_wkt AS glebas,
         sicor_operacao_basica_estado AS contratos
   WHERE glebas.ref_bacen = contratos.ref_bacen
     AND glebas.nu_ordem = contratos.nu_ordem
GROUP BY ano, tipo_geometrico, num_partes
ORDER BY ano, tipo_geometrico, num_partes;
 ano  | tipo_geometrico | num_partes | num_geometrias
------+-----------------+------------+----------------
 2013 | ST_MultiPolygon |          2 |             57
 2013 | ST_MultiPolygon |          3 |              5
 2013 | ST_MultiPolygon |          4 |              1
 2013 | ST_Polygon      |          1 |            584
 2014 | ST_MultiPolygon |          2 |            295
 2014 | ST_MultiPolygon |          3 |             77
 2014 | ST_MultiPolygon |          4 |             62
 ...
 2014 | ST_MultiPolygon |         42 |              1
 2014 | ST_MultiPolygon |         46 |              1
 2014 | ST_MultiPolygon |         50 |              1
 2014 | ST_MultiPolygon |         58 |              1
 ...
 2021 | ST_MultiPolygon |          2 |             27
 2021 | ST_MultiPolygon |          3 |              1
 2021 | ST_MultiPolygon |          4 |              1
 2021 | ST_Point        |          1 |             53
 2021 | ST_Polygon      |          1 |         991082
 2022 | ST_MultiPolygon |          2 |             35
 2022 | ST_MultiPolygon |          3 |              4
 2022 | ST_Polygon      |          1 |        1073743
 2023 | ST_MultiPolygon |          2 |             36
 2023 | ST_Polygon      |          1 |        1131550
 2024 | ST_Polygon      |          1 |         299158
(207 rows)