Exportar a VEC, IFC, GeoMedia y PostGIS

Cuatro módulos con particularidades propias: VEC e IFC crean archivos nuevos, mientras que GeoMedia y PostGIS añaden geometrías a una base de datos que ya existe y ya tiene las capas.

VEC e IFC

import digi21.io.ifc as ifc
import digi21.io.vec as vec
from digi21.base import Line, Polygon

with vec.create("parcelas.vec") as writer:
    writer.add(Line(["LINDE"], [(500000, 4400000, 650), (500100, 4400000, 652), (500100, 4400080, 655)]))
for geometry in vec.open("parcelas.vec"):
    print(type(geometry).__name__, [c.code for c in geometry.codes], len(geometry), "vértices")

# Una cara de muro (normal horizontal) y una de forjado (normal vertical). Los códigos de una geometría no se
# repiten, así que las componentes iguales de la normal se escriben distintas: "0" y "0.0".
muro = Polygon(["LIMEXT", "1", "0", "0.0"], [(10, 0, 0), (10, 5, 0), (10, 5, 3), (10, 0, 3), (10, 0, 0)])
forjado = Polygon(["LIMEXT", "0", "0.0", "1"], [(0, 0, 0), (10, 0, 0), (10, 5, 0), (0, 5, 0), (0, 0, 0)])

with ifc.create("edificio.ifc") as writer:
    writer.add(muro)
    writer.add(forjado)
    print(writer.add(Line(["LINDE"], [(0, 0, 0), (10, 0, 0)])), writer.warnings)

for geometry in ifc.open("edificio.ifc"):
    print(type(geometry).__name__, [c.code for c in geometry.codes], len(geometry), "líneas")
Line ['0'] 3 vértices
False ['IFC only stores faces whose codes are LIMEXT followed by the x, y and z components of their normal.']
messageCallback not set. Lost message: Detected IFC version: IFC4X1
Complex ['IfcWall'] 2 líneas
Complex ['IfcSlab'] 2 líneas
  • VEC: sin un elemento iovec:transform en la tabla de códigos, el exportador asigna una capa a cada código, y al releer el código es el número de esa capa ('0'). El exportador escribe en un archivo temporal y sustituye el destino al cerrar; si no puede, close lanza RuntimeError.
  • IFC: solo se escriben caras con el código LIMEXT seguido de las componentes de su normal. Con la z de la normal por debajo de 0,1 la cara es un muro (IfcWall); si no, un forjado (IfcSlab). Las dos se extruyen 0,3 m. Al releer, cada una es un complejo con las aristas del sólido. La línea messageCallback not set… la escribe la biblioteca de IFC al leer el archivo.

GeoMedia

digi21.io.geomedia abre un almacén GeoMedia en Access (.mdb) que ya tiene sus clases de entidad en la tabla GFeatures, y le añade las geometrías. El exportador no sabe crear el almacén ni sus capas: los archivos semilla de GeoMedia no tienen capas y no sirven como destino.

import digi21.base as base
import digi21.io.geomedia as geomedia

digitab = base.DigiTab.load("modelo.tab.xml")
with geomedia.create("almacen.mdb", digitab) as writer:
    writer.add(base.Line(["LAP030"], [(-6.97, 38.88, 200.0), (-6.96, 38.88, 201.0), (-6.96, 38.89, 202.0)]))
print(writer.written, writer.warnings)
1 []

Cada código necesita un elemento ioGeomedia:transform con su clase de entidad, y la geometría tiene que ser del tipo de esa clase: LAP030 es una clase de líneas del modelo MGCP. El sistema de coordenadas es el de la tabla GCoordSystem del almacén. Hace falta el proveedor Microsoft Access Database Engine. El ejemplo se ha ejecutado contra una copia de un almacén real que no se puede publicar (11.514 geometrías; al releer hay 11.515). La página de digi21.io.geomedia tiene más ejemplos con ese almacén.

PostGIS

En digi21.io.postgis la ruta es el archivo de conexión .pg. Si se pasa database, create lo escribe con los datos de la conexión:

import digi21.base as base
import digi21.io.postgis as postgis

digitab = base.DigiTab.load("modelo.tab.xml")
with postgis.create("conexion.pg", digitab, server="servidor", port=5432,
                    user="usuario", password="contraseña", database="cartografia") as writer:
    writer.add(base.Line(["LINDE"], [(500000, 4400000, 650), (500100, 4400000, 652)]))
print(writer.written, writer.warnings)

for geometry in postgis.open("conexion.pg", digitab):
    ...

El exportador no crea tablas: cada código necesita un elemento ioPostGis:transform cuya tabla exista en la base de datos con una columna de geometría. El archivo de conexión guarda la contraseña en texto, igual que la aplicación. Este ejemplo no se ha ejecutado: no había un servidor PostGIS disponible.

Véase también