O QGIS há muito tempo que lê ficheiros DXF ASCII, aproveitando sempre os melhoramentos que a biblioteca OGR vai trazendo com as novas versões.
Estando a planear introduzir o QGIS na empresa de forma generalizada, tive que revisitar esta função, dado que ler CAD é uma função essencial para muitos utilizadores.
Update 2013-06-05: O problema já foi resolvido. A versão de desenvolvimento já permite abrir ficheiros dxf e escolher que tipo de geometria queremos carregar. Realmente, trabalhar assim é uma maravilha.
Sucede que, não sei bem a partir de que momento, o QGIS perdeu aqui alguma funcionalidade. Se por um lado consegue ler ficheiros DXF modernos, o facto é que junta todos os vectores num único layer sem simbologia:
Um ficheiro DXF lido no QGIS – um único layer sem simbologia
O truque para corrigir esta situação, e que funcionou em tempos, era definir uma query para limitar o tipo de geometria a um único tipo: pontos, linhas ou polígonos. Desta forma, já o QGIS conseguiria aplicar uma simbologia e mostrar os vectores do dxf no mapa.
Acontece que, nas versões mais recentes, o QGIS crasha ao definir uma query para um dxf… uma questão em aberto que podemos acompanhar no ticket respectivo – uma das vantagens de trabalhar com open source.
Não querendo desistir ou aguardar que a versão 2.0 seja lançada, podemos usar a seguinte solução que passa pela utilização de ficheiros virtuais do OGR e da sua implementação SQL que permite filtrar o tipo de geometria através de um campo virtual designado OGR_GEOMETRY.
Assim, criamos um ficheiro VRT que aplica um filtro ao tipo de geometria. Por exemplo, para o tipo Linhas criamos um ficheiro chamado dxf_linhas.vrt com este conteúdo:
<OGRVRTDataSource>
<OGRVRTLayer name="dxf_linhas">
<SrcDataSource relativeToVRT="1">T34834D01-01-R0.dxf</SrcDataSource>
<GeometryType>wkbLineString</GeometryType>
<LayerSRS>EPSG:27493</LayerSRS>
<SrcSQL>SELECT * FROM entities WHERE OGR_GEOMETRY='LINESTRING'</SrcSQL>
</OGRVRTLayer>
</OGRVRTDataSource>
O essencial deste ficheiro é:
- o nome do ficheiro original (T34834D01-01-R0.dxf); o ficheiro vrt deve estar na mesma pasta que este dxf;
- o tipo de geometria do tema (wkbLineString);
- o sistema de coordenadas que, embora não seja necessário, aproveitamos para definir;
- o filtro que selecciona o tipo de geometria que queremos (OGR_GEOMETRY=’LINESTRING’)
Se no QGIS carregarmos este ficheiro vrt ele surge perfeito no mapa e podemos simbolizá-lo por layer ou outro campo, e até excluir vectores que não interessem:
DXF carregado no QGIS usando um ficheiro .VRT
Para Polígonos o ficheiro vrt seria:
<OGRVRTDataSource>
<OGRVRTLayer name="dxf_poligonos">
<SrcDataSource relativeToVRT="1">T34834D01-01-R0.dxf</SrcDataSource>
<GeometryType>wkbPolygon</GeometryType>
<LayerSRS>EPSG:27493</LayerSRS>
<SrcSQL>SELECT * FROM entities WHERE OGR_GEOMETRY='POLYGON'</SrcSQL>
</OGRVRTLayer>
</OGRVRTDataSource>
E para Pontos:
<OGRVRTDataSource>
<OGRVRTLayer name="dxf_pontos">
<SrcDataSource relativeToVRT="1">T34834D01-01-R0.dxf</SrcDataSource>
<GeometryType>wkbPoint</GeometryType>
<LayerSRS>EPSG:27493</LayerSRS>
<SrcSQL>SELECT * FROM entities WHERE OGR_GEOMETRY='POINT'</SrcSQL>
</OGRVRTLayer>
</OGRVRTDataSource>
E agora é só esperar que o QGIS 2.0 chegue!
Bom mesmo era um plugin que automatizasse este processo… ora aqui está uma ideia!
Para terminar, apenas para referência futura: o conversor de dwg->dxf que uso actualmente é o Teigha File Converter, porque é gratuito, relativamente compacto, e permite converter pastas com dwg’s de uma só vez. (não é open source, apenas “free as in free beer”)
Olá Duarte, muito boa esta dica.
Obrigado pela tua partilha 🙂
Abraço,
Nelson
Este commit
https://github.com/qgis/Quantum-GIS/commit/af0f61e699d89c4db9ee8f618c032b75e6211d33
deverá resolver este problema. Por favor façam um test e confirmem.
Ciao!
Pois é, meu problema com o formato DXF é que não consegui visualizar como fazer a transformação Affine para georreferenciamento dos vetores. Costumo editar mapas no Corel Draw e exportar os vetores em DXF, preservando a grade de coordenadas para facilitar o georreferenciamento posterior. No ArcGIS consigo fazer, mas no QGIS não.
O formato vrt pode conter transformações afins, com o tag , e também consegue calcular a transformação a partir de uma lista de pontos de control ou groundpoints (gp)… mas nunca vi um exemplo aplicado a vectores… talvez os gurus da lista do gdal/ogr consigam ajudar?
Abraço
Verdade, Duarte. Talvez eu tenha que postar no GIS Stack Exchange, mas já vi alguns posts sobre esse assunto no fórum. Nenhum exemplo prático tinha, infelizmente.
Grade abraço!