Análise da Representação Gráfica Georreferenciada (RGG) dos terrenos rústicos e mistos registados no BUPi
Análise da Representação Gráfica Georreferenciada (RGG) dos terrenos rústicos e mistos registados no BUPi avatar

Versão do conjunto de dados em análise: 26 de Julho 2024

O Balcão Único do Prédio (BUPi) é uma plataforma online que permite aos proprietários auto-declarar os limites geométricos das suas propriedades (i.e. terrenos), com o objetivo de facilitar a articulação do registo e do cadastro predial numa única plataforma. O BUPi tem por base a Lei n.º 78/2017, de 17 de agosto que prevê a criação de “um sistema de informação cadastral simplificada”. A informação geométrica pode ser declarada com base em levantamentos GPS/topográficos conduzidos pelos proprietários ou por profissionais contratados para o efeito. Em alternativa, a informação geométrica pode também ter por base a interpretação visual de imagens de fotografia aérea sobre a qual os polígonos são desenhados.

A inexistência de um cadastro unificado, com informação geométrica atualizada e de qualidade é amplamente reconhecido como um fator limitativo do planeamento territorial. Dados cadastrais são também dados de grande valor para muitas outras atividades, pelo que a sua disponibilização sem restrições e em formatos abertos é fundamental e facilmente enquadrável na Lei n.º 68/2021 de 26 de agosto que mais não é do que uma transposição da Diretiva sobre Dados Abertos e Dados de Elevado Valor da União Europeia.

No início de 2024, foi anunciado pela Estrutura de Missão para a Expansão do Sistema de Informação Cadastral Simplificado (eBUPi), que o ano de 2023 terminou com 2 milhões de propriedades identificadas. Na mesma notícia, foi dada nota da disponibilização da Representação Gráfica Georreferenciada das propriedades, na Plataforma aberta para dados públicos portugueses (https://dados.gov.pt), o que se regista como uma boa iniciativa por parte da eBUPi.

No entanto, ao longo dos últimos anos, têm sido várias as notícias que alertam para os problemas que podem estar a ser criados pelo BUPi, como por exemplo centenas de terrenos reclamados por mais do que um proprietário (JN). Assim, decidiu-se fazer uma análise aos dados do BUPi disponibilizados no https://dados.gov.pt.

Começou-se por descarregar os dados em formato Geopackage (GPKG) e examinar os detalhes técnicos através da ferramenta “ogrinfo” [1].

Esta primeira inspeção revela que os dados não possuem informação alfanumérica (atributos) relativa aos prédios, ao contrário do que é referido no anúncio da eBUPi. Na realidade, só existem dois atributos: um id interno, gerado automaticamente pelo formato GPKG (“fid“), e um atributo “area” em que não é claro se se trata da área levantada ou da área calculada já em ambiente SIG (não são necessariamente a mesma coisa);

É difícil de compreender a falta de alguns atributos indispensáveis, como o número matricial, ou o número e data do processo. Sem essa informação alfanumérica dos prédios, o conjunto de dados perde uma parte relevante da sua utilidade.

Questionada a eBUPi, a justificação foi de que se tratariam de dados protegidos pelo Regulamento Geral de Proteção de Dados (RGPD). Ainda no espaço de discussão oficial da plataforma dados.gov.pt, chamou-se à atenção para o facto desses mesmos atributos estarem disponíveis num conjunto de dados acessível através de um serviço REST, conforme se pode constatar na imagem seguinte:

Estas informações fundamentais não se encontram no conjunto de dados publicado na plataforma dados.gov.pt mas estavam publicadas noutra plataforma/serviço, que foi subitamente removido/desativado no dia 26 de Agosto de 2024.

Estranhamente, estes dados foram subitamente removidos.

De seguida, procedeu-se a uma série de inspeções geométricas.

Para o efeito, os dados foram importados para uma base de dados PostgreSQL/PostGIS com a ferramenta “ogr2ogr” [2], de forma a ter acesso a uma série de funções de SQL (Structured Query Language) espacial, que permitem avaliar vários aspetos do conjunto de dados utilizando as capacidades de uma base de dados relacional de classe Enterprise.

Após a importação, o conjunto de dados passa a ter uma coluna denominada “gid“, que é a chave primária da tabela, com valores numéricos inteiros que identificam de forma unívoca os polígonos/geometrias que representam os prédios (com os mesmos valores da coluna “fid” do GPKG original).

Desta forma, podem obter-se algumas métricas rápidas sobre o conjunto de dados do BUPi:

  • Número total de features / polígonos [3]: 2255870
  • Área total dos polígonos, em hectares [4]: 1419771.29
  • Número de features / polígonos com geometrias inválidas [5]: 0
  • Número de features / polígonos repetidos. Fazendo uma análise visual ao conjunto de dados, é fácil perceber que existem muitos casos de polígonos / prédios / features idênticos e repetidos (duas ou mais vezes), não se percebendo o motivo para tal acontecer:

De forma a quantificar a dimensão deste problema, aplicou-se uma query [6] que identifica todos estes casos de polígonos iguais sobrepostos, produzindo uma lista de resultados com o número de vezes que cada geometria se repete.

Assim, a query devolveu um total de 43776 resultados, mostrando polígonos / prédios idênticos repetidos de 2 até 130(!) vezes. Apresenta-se, de seguida, um excerto do resultado:

NÚmero de repetiçõesID’s dos polígonos / prédios
13075058|75059|75060|75061|75062|75063|75064|75065|75066|75067|75068|75069|75070|75071|75072|75073|75074|75075|75076|75077|75078|75079|75080|75081|75082|75032|75083|75084|75085|75086|75087|75088|75089|74968|74969|74970|74971|74972|74973|74974|74975|74976|74977|74978|74979|74980|74981|74982|74983|74984|74985|74986|74987|74988|74989|74990|74991|74992|74993|74994|74995|74996|74997|74998|74999|75000|75001|75002|75003|75004|75005|75006|75007|75008|75009|75010|75011|75012|75013|75014|75015|75016|75017|75018|75019|75020|75021|75022|75023|75024|75025|75026|75027|75028|75029|75030|75031|75033|75034|75035|75036|75037|75038|75039|75040|75041|75042|75043|75044|75045|75046|75047|75048|75049|75050|75051|75052|75053|75054|75055|75056|75057|75095|75090|75097|75091|75092|75096|75093|75094
591822583|1822578|1822585|1822580|1822581|1822582|1822579|1822584|1822618|1822586|1822587|1822588|1822589|1822590|1822591|1822602|1822603|1822604|1822605|1822606|1822607|1822608|1822609|1822610|1822611|1822612|1822613|1822614|1822615|1822616|1822617|1822619|1822620|1822621|1822622|1822623|1822624|1822625|1822626|1822627|1822628|1822629|1822630|1822631|1822632|1822633|1822634|1822635|1822636|1822592|1822593|1822594|1822595|1822596|1822597|1822598|1822599|1822600|1822601
44125905|125873|125874|125875|125876|125877|125878|125879|125880|125881|125882|125883|125884|125885|125886|125887|125888|125889|125890|125891|125892|125893|125894|125895|125896|125897|125898|125899|125900|125901|125902|125903|125904|125906|125907|125908|125909|125910|125911|125912|125913|125914|125915|125916
441722951|1722944|1722945|1722946|1722947|1722948|1722949|1722950|1722952|1722953|1722954|1722955|1722956|1722957|1722958|1722959|1722960|1722961|1722962|1722963|1722964|1722965|1722966|1722967|1722968|1722969|1722970|1722971|1722972|1722973|1722974|1722975|1722976|1722977|1722978|1722979|1722980|1722981|1722982|1722983|1722984|1722985|1722986|1722987
422162638|2162637|2162636|2162635|2162633|2162634|2162660|2162639|2162640|2162654|2162666|2162665|2162655|2162656|2162664|2162663|2162662|2162661|2162657|2162658|2162659|2162641|2162642|2162643|2162644|2162645|2162646|2162647|2162648|2162674|2162673|2162672|2162649|2162650|2162671|2162670|2162651|2162652|2162669|2162668|2162667|2162653
391351212|1351206|1351207|1351208|1351209|1351210|1351211|1351213|1351214|1351215|1351216|1351217|1351234|1351235|1351236|1351237|1351238|1351239|1351240|1351241|1351243|1351242|1351244|1351218|1351219|1351220|1351221|1351222|1351223|1351224|1351225|1351226|1351227|1351228|1351229|1351230|1351231|1351232|1351233
38132033|132037|132036|132035|132040|132039|132031|132032|132038|132034|132015|132016|132052|132051|132017|132018|132050|132049|132019|132020|132048|132047|132021|132022|132046|132023|132024|132045|132025|132026|132044|132043|132027|132028|132042|132041|132029|132030
351780724|1780715|1780716|1780717|1780718|1780719|1780720|1780721|1780722|1780723|1780725|1780726|1780727|1780728|1780729|1780730|1780731|1780732|1780733|1780734|1780735|1780736|1780737|1780738|1780739|1780740|1780741|1780742|1780743|1780744|1780745|1780746|1780747|1780748|1780749
35543297|543300|543299|543288|543310|543289|543309|543287|543311|543312|543290|543308|543286|543291|543307|543292|543285|543313|543314|543306|543293|543303|543302|543301|543305|543283|543294|543315|543281|543284|543298|543296|543304|543282|543295
3365979|65948|65949|65950|65951|65952|65953|65954|65955|65956|65957|65958|65959|65960|65961|65962|65963|65964|65965|65966|65967|65968|65969|65970|65971|65972|65973|65974|65975|65976|65977|65978|65980
311440740|1440729|1440730|1440731|1440732|1440733|1440734|1440735|1440736|1440737|1440738|1440739|1440741|1440742|1440743|1440744|1440745|1440746|1440747|1440748|1440749|1440750|1440751|1440752|1440753|1440754|1440755|1440756|1440757|1440758|1440759
301461309|1461310|1461311|1461312|1461313|1461314|1461315|1461316|1461317|1461318|1461319|1461320|1461321|1461322|1461323|1461324|1461325|1461326|1461327|1461328|1461329|1461330|1461331|1461332|1461333|1461334|1461335|1461336|1461337|1461338
30596506|596502|596503|596504|596505|596507|596508|596509|596510|596511|596512|596513|596514|596515|596516|596517|596518|596519|596520|596521|596522|596523|596524|596525|596526|596527|596528|596529|596530|596531

Como se pode observar, existe um polígono, correspondente a um prédio, que pertencerá a um dado proprietário, repetido 130 vezes, contando todas elas para o número total de prédios, e respetiva área, registados no BUPi.

O resultado completo desta análise de prédios repetidos, pode ser descarregado a partir do seguinte endereço:

Para se perceber a dimensão do problema, disponibiliza-se a tabela seguinte, com o número de polígonos / prédios repetidos, por número de repetições [7]:

Numero de repetiçõesNÚmero de POLÍGONOS
235751
34971
41532
5610
6333
7158
8120
968
1048
1137
1234
1316
1413
1512
1613
177
1812
195
207
214
221
231
242
252
261
273
282
302
311
331
352
381
391
421
442
591
1301

Ou seja, estão registados 35751 prédios em duplicado, 4971 em triplicado, e assim sucessivamente. Assumindo que os polígonos / prédios idênticos repetidos não fazem sentido numa base de dados cadastral, podemos então avaliar o número e a área global (em hectares) que estas geometrias repetidas representam:

A query [8] revela que:

  • Existem 60116 polígonos / prédios idênticos repetidos (2.66% do total de polígonos registados no BUPi);
  • A área ocupada pelos polígonos / prédios idênticos representa 255072 hectares (17.96% do total da área registada no BUPi).

Novamente assumindo que os polígonos / prédios idênticos e repetidos constituem um erro, pode facilmente criar-se [9] um novo conjunto de dados, removendo os duplicados. Aqui fica esse produto:

O número de features / polígonos e a área total (em hectares) desta nova camada são, respetivamente:

  • Número de features / polígonos: 2195754
  • Área total dos polígonos, em hectares: 1164698.60

Tendo agora por base esse conjunto de dados sem prédios repetidos, pode verificar-se se existem sobreposições parciais, isto é, se existem conflitos entre os limites dos prédios, algo sempre indesejável numa base de dados cadastral e que era noticiado pelo JN em junho de 2022.

Uma análise visual do conjunto de dados mostra uma panóplia desse tipo de situações:

Para um resultado quantitativo, pode avaliar-se [10] onde ocorre este tipo de sobreposições, que se traduz, muito simplesmente, em território ocupado, em simultâneo, por 2 polígonos diferentes, tal como referido pelo JN: “Há centenas de hectares de terrenos sobrepostos nos cadastros, porque várias pessoas reclamam a mesma área, na totalidade ou em parte, na altura em que fazem a georreferenciação no BUPi (…)“.

Assim:

  • Número de sobreposições: 752069 (34,25 %)
  • Área ocupada pelas sobreposições, em hectares: 27031.21 (2,32 %)

O número de sobreposições parciais é muito elevado: mais de 30% do total de polígonos / prédios têm limites sobrepostos. O número de sobreposições é preocupante visto que poderão originar no futuro morosos e dispendiosos litígios jurídicos.

A título de exemplo, é interessante comparar este conjunto de dados do BUPi, com outros similares, produzidos por outras entidades nacionais. O Instituto de Financiamento da Agricultura e Pescas (IFAP) publica o parcelário nacional (https://www.ifap.pt/isip/ows/), com os limites das parcelas de explorações agrícolas. A Direção-Geral do Território (DGT) publica um verdadeiro cadastro predial (https://snic.dgterritorio.gov.pt/visualizadorCadastro), com origem em operações executadas ao abrigo de dois regimes: cadastro geométrico da propriedade rústica e cadastro predial experimental.

É importante frisar que o conjunto de dados da DGT só recentemente (01/08/2024) passou a ser disponibilizado de forma aberta (licença Creative Commons 4), no visualizador da Carta Cadastral que integra o Sistema Nacional de Informação Cadastral (SNIC). Contudo, ainda não é possível fazer o descarregamento direto ou através de um serviço WFS. Segundo informação da DGT, a partir de setembro de 2024 esta situação deverá ser corrigida, mas até isso acontecer, este conjunto de dados apenas pode ser obtido através de uma API não documentada.

Com acesso mais ou menos facilitado, foi possível testar ambos os conjuntos de dados, do IFAP e da DGT, e fazer uma análise análoga à que foi executada sobre os dados do BUPi, procurando identificar polígonos / parcelas / prédios repetidos e/ou parcialmente sobrepostos. Os resultados são apresentados nos parágrafos seguintes.

Parcelário do IFAP (continente), com um total de 2098901 polígonos / parcelas, cobrindo 4089238.84 hectares de território:

  • 0 polígonos / parcelas duplicadas, com exceção de um conjunto de polígonos com área nula (MULTIPOLYGON(EMPTY)), sendo provavelmente resíduos de operações de geoprocessamento;
  • 232244 sobreposições, com uma área total de 563.6 hectares, perfazendo uma média de 0.0024 hectares por cada sobreposição, indicação de que se trata, na grande maioria, de problemas de arredondamento numérico do posicionamento dos vértices, mais do que erros de levantamento ou de metodologia.

Cadastro Predial da DGT (não inclui SiNERrGIC), com um total de 1253925 polígonos / prédios, cobrindo 3858993.65 hectares de território:

  • 0 polígonos / prédios duplicados;
  • 36 sobreposições, com uma área total de 4.3 hectares, perfazendo uma média de 0.119 hectares por cada sobreposição.

Tanto no caso do parcelário do IFAP, como no caso do cadastro predial da DGT, são disponibilizadas informações alfanuméricas (atributos) importantes e úteis, sem ir contra as diretivas do RGPD. Exemplos:

Resumo do BUPI

Pontos Positivos:

  • Licença Creative Commons 4;
  • Publicação no site dados.gov.pt;
  • Inexistência de geometrias inválidas.

Pontos Negativos:

  • Falta de publicação no Sistema Nacional de Informação Geográfica (SNIG);
  • Ausência de serviço WFS. Em https://dados.gov.pt/pt/datasets/representacao-grafica-georreferenciada/ os responsáveis do conjunto de dados explicam esta ausência com a dimensão dos mesmos, declarando, sem justificação técnica, que isso iria significar um desempenho pouco aceitável. Este facto não é, naturalmente, verdadeiro, pois existem diversos conjuntos de dados muito grandes e complexos, publicados em WFS. Utilizando tecnologia Open Source, não há qualquer limitação técnica que inviabilize a publicação de um dataset com mais de 2 milhões de polígonos via WFS e obter um serviço com desempenho eficiente. O servidor seguinte é um exemplo demostrativo disso: https://www.naturalgis.pt/cgi-bin/geocatalogo_wfs/mapserv?service=WFS&request=GetCapabilities&version=1.1.0
  • Qualidade alfanumérica. A falta de informação alfanumérica torna o conjunto de dados praticamente inútil;
  • Qualidade topológica. Um conjunto de dados como o das parcelas cadastrais nunca deveria ter problemas de sobreposições, mas no caso do BUPi identificaram-se 255072 hectares de polígonos / prédios duplicados e 27031 hectares, em 752069 sobreposições parciais, indicando uma baixa qualidade e confiabilidade, considerado o tipo de dados e a sua relevância.

#### Operações Realizadas ####

[1]

ogrinfo -so opendata-rgg-01072024.gpkg opendata-rgg-01072024
INFO: Open of `opendata-rgg-01072024.gpkg'
      using driver `GPKG' successful.

Layer name: opendata-rgg-01072024
Geometry: Multi Polygon
Feature Count: 2255870
Extent: (-94062.316000, -41320.713000) - (162060.682800, 276013.258500)
Layer SRS WKT:
PROJCRS["ETRS89 / Portugal TM06",
    BASEGEOGCRS["ETRS89",
        ENSEMBLE["European Terrestrial Reference System 1989 ensemble",
            MEMBER["European Terrestrial Reference Frame 1989"],
            MEMBER["European Terrestrial Reference Frame 1990"],
            MEMBER["European Terrestrial Reference Frame 1991"],
            MEMBER["European Terrestrial Reference Frame 1992"],
            MEMBER["European Terrestrial Reference Frame 1993"],
            MEMBER["European Terrestrial Reference Frame 1994"],
            MEMBER["European Terrestrial Reference Frame 1996"],
            MEMBER["European Terrestrial Reference Frame 1997"],
            MEMBER["European Terrestrial Reference Frame 2000"],
            MEMBER["European Terrestrial Reference Frame 2005"],
            MEMBER["European Terrestrial Reference Frame 2014"],
            ELLIPSOID["GRS 1980",6378137,298.257222101,
                LENGTHUNIT["metre",1]],
            ENSEMBLEACCURACY[0.1]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433]],
        ID["EPSG",4258]],
    CONVERSION["Portugual TM06",
        METHOD["Transverse Mercator",
            ID["EPSG",9807]],
        PARAMETER["Latitude of natural origin",39.6682583333333,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8801]],
        PARAMETER["Longitude of natural origin",-8.13310833333333,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8802]],
        PARAMETER["Scale factor at natural origin",1,
            SCALEUNIT["unity",1],
            ID["EPSG",8805]],
        PARAMETER["False easting",0,
            LENGTHUNIT["metre",1],
            ID["EPSG",8806]],
        PARAMETER["False northing",0,
            LENGTHUNIT["metre",1],
            ID["EPSG",8807]]],
    CS[Cartesian,2],
        AXIS["easting (X)",east,
            ORDER[1],
            LENGTHUNIT["metre",1]],
        AXIS["northing (Y)",north,
            ORDER[2],
            LENGTHUNIT["metre",1]],
    USAGE[
        SCOPE["Topographic mapping (medium scale)."],
        AREA["Portugal - mainland - onshore."],
        BBOX[36.95,-9.56,42.16,-6.19]],
    ID["EPSG",3763]]
Data axis to CRS axis mapping: 1,2
FID Column = fid
Geometry Column = geom
area: Real (0.0)

[2]

ogr2ogr -f PostgreSQL PG:"host=localhost dbname=geocatalogo user=*** password=*** active_schema=catalogo" opendata-rgg-01072024.gpkg opendata-rgg-01072024 -nln catalogo.ebupi -lco FID=gid -overwrite

[3]

geocatalogo=# SELECT count(*) FROM catalogo.ebupi;
  count
---------
 2255870
(1 row)

[4]

geocatalogo=# SELECT sum(ST_Area(geom))/10000 AS area FROM catalogo.ebupi;        
area
--------------------
1419771.2919224324
(1 row)

[5]

geocatalogo=# SELECT count(*) FROM catalogo.ebupi WHERE ST_IsValid(geom) IS FALSE;
 count
-------
     0
(1 row)

[6]

WITH repeated_polygons AS (
    SELECT 
        ARRAY_AGG(gid) AS id_list,    
        COUNT(*) AS count,            
        geom                          
    FROM 
        catalogo.ebupi
    GROUP BY 
        geom
    HAVING 
        COUNT(*) > 1                  
)

SELECT 
    ROW_NUMBER() OVER () AS id,         
    count,                              
    ARRAY_TO_STRING(id_list, '|') AS id_list,
    geom AS geom
FROM 
    repeated_polygons
	ORDER BY count DESC;

[7]

WITH polygon_repetitions AS (
    SELECT 
        COUNT(*) AS repetition_count
    FROM 
        catalogo.ebupi
    GROUP BY 
        geom
    HAVING 
        COUNT(*) > 1                
)

SELECT 
    repetition_count,               
    COUNT(*) AS num_polygons       
FROM 
    polygon_repetitions
GROUP BY 
    repetition_count
ORDER BY 
    repetition_count;

[8]

WITH repeated_polygons AS (
    SELECT 
        ARRAY_AGG(gid) AS id_list,          
        COUNT(*) AS count,                  
        ST_Area(geom) AS area,              
        geom                                
    FROM 
        catalogo.ebupi
    GROUP BY 
        geom
    HAVING 
        COUNT(*) > 1                        
)

SELECT 
    SUM(count - 1) AS total_extra_polygons,   
    SUM((count - 1) * area)/10000 AS total_extra_area
FROM 
    repeated_polygons;

[9]

CREATE TABLE catalogo.ebupi_no_duplicates AS
WITH ranked_polygons AS (
    SELECT 
        gid,                         
        geom,                        
        ROW_NUMBER() OVER (
            PARTITION BY geom        
            ORDER BY gid ASC         
        ) AS rank                    
    FROM 
        catalogo.ebupi
)

SELECT 
    gid,                             
    geom                              
FROM 
    ranked_polygons
WHERE 
    rank = 1;                         


ALTER TABLE catalogo.ebupi_no_duplicates
ADD CONSTRAINT ebupi_no_duplicates_pkey PRIMARY KEY (gid);

CREATE INDEX ebupi_no_duplicates_geom_idx
ON catalogo.ebupi_no_duplicates
USING GIST (geom);

[10]

CREATE TABLE catalogo.ebupi_partial_overlaps AS
WITH bbox_filtered AS (
    SELECT 
        a.gid AS gid_polygon1,
        b.gid AS gid_polygon2,
        a.geom AS geom1,
        b.geom AS geom2
    FROM 
        catalogo.ebupi_no_duplicates a,
        catalogo.ebupi_no_duplicates b
    WHERE 
        a.gid < b.gid  
        AND a.geom && b.geom  
)
SELECT 
    row_number() over() AS gid,
    gid_polygon1, 
    gid_polygon2, 
    ST_Area(ST_Intersection(geom1, geom2))/10000 AS area_hectares,
    ST_Multi(ST_Intersection(geom1, geom2)) AS geom
FROM 
    bbox_filtered
WHERE 
    ST_Intersects(geom1, geom2)  
    AND (ST_GeometryType(ST_Intersection(geom1, geom2)) = 'ST_Polygon'
    OR ST_GeometryType(ST_Intersection(geom1, geom2)) = 'ST_MultiPolygon');


ALTER TABLE catalogo.ebupi_partial_overlaps
ADD CONSTRAINT ebupi_partial_overlaps_pkey PRIMARY KEY (gid);

CREATE INDEX ebupi_partial_overlaps_geom_idx
ON catalogo.ebupi_partial_overlaps
USING GIST (geom);

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *