Agora que, de acordo com o modelo de dados Recart, a cartografia nacional é armazenada e homologada em PostgreSQL/PostGIS, o QGIS tornou-se o parceiro ideal para várias fases do seu processamento. Neste artigo, mostra-se como criar uma superfície 3D em PostGIS e como visualizá-la no QGIS. Algo útil para avaliar de uma forma geral o estado a informação tridimensional.
Para quem desconhece a história, importa referir que o QGIS surge (em Julho de 2002) da necessidade do seu criador, Gary Sherman, de ter um visualizador para dados geográficos guardados em PostGIS. Desde essa altura, a integração entre estes dois gigantes do open source para SIG nunca parou de melhorar e, neste momento, podemos dizer sem qualquer pudor que não haverá melhor visualizador e editor de dados em PostGIS que o QGIS.
No modelo de dados Recart, existem algumas tabelas cujas geometrias têm informação tridimensional, como as curvas de nível, os pontos cotados, os taludes, etc… Vamos ver como podemos usar essa informação para criar e visualizar um Modelo Digital de Terreno (MDT) no QGIS.
Desde que foi implementado no QGIS 3.0, o painel de visualização 3D do QGIS tem vindo a receber melhorias constantes, tornando-se mais útil a cada nova versão. Se a esse factor juntarmos as capacidades de processamento 3D do PostGIS… Bom, vamos ver o que se consegue fazer.
Note-se que há muito que o QGIS permite criar MDT raster através da ferramenta TIN Interpolation. Mas aqui o que se pretende é obter um resultado em formato vectorial directamente do PostGIS.
Desde a versão 2.1 o PostGIS tem uma função ST_DelaunayTriangles, para criar triângulos de Delaunay a partir dos vértices de geometrias. Como esta função funciona a 3D, os triângulos gerados de geometrias 3D são também eles 3D e podem ser visualizados no QGIS.
Usando o DBManager do QGIS, podemos correr uma query para obter os triângulos de delaunay de uma camada e carregá-los no QGIS. Vejamos um exemplo simples usando a camada das curvas de nível.
SELECT ST_collectionExtract(ST_DelaunayTriangles( ST_collect(geometria)),3) as geom
FROM curva_de_nivel
Explicando a Query passo a passo:
- Começa-se por usar a função st_collect em torno da coluna da geometria para unir todas as curvas de nível num só elemento.
- Usa-se depois ST_DelaunayTriangles em torno do resultado para obter uma geometry_collection com os triângulos 3D.
- Como o QGIS não aceita geometry_collections (pois a norma OGC de simple features, onde cada camada apenas pode ter um tipo de geometria), usa-se o ST_CollectionExtract para devolver o resultado como um multipolígono.
Depois de carregada no QGIS, temos de activar a renderização 3D da nova camada.
E num mapa 3D (View > New 3D Map View) já conseguiremos ver as curvas de nível representadas como uma superfície 3D.
Se quisermos melhorar o detalhe do MDT, podemos adicionar informação de outras tabelas, bastando para isso uni-las antes de as processarmos na query anterior.
WITH todas_camadas as (
SELECT geometria FROM curva_de_nivel
UNION ALL
SELECT geometria FROM ponto_cotado
UNION ALL
SELECT geometria FROM talude
UNION ALL
SELECT geometria FROM limite_rodovia
)
SELECT ST_collectionExtract(ST_DelaunayTriangles( ST_collect(geometria)),3) as geom
FROM todas_camadas
O modelo resultante mostra agora as estradas “decalcadas” no terreno.
O exemplo não é o mais expressivo, mas creio que dá para perceber o potencial. Com um simples comando SQL podemos criar e visualizar o modelo 3d dos nossos dados, o que nos permite encontrar, por exemplo, pontos cujo o Z=0.