digi21.io.geomedia

Módulo: digi21.io

Lee almacenes GeoMedia en Access (.mdb) y les añade geometrías. El exportador no crea el almacén ni sus clases de entidad.

import digi21.io.geomedia as geomedia

Necesita el proveedor Microsoft Access Database Engine (Microsoft.ACE.OLEDB.12.0) de 64 bits.

open

open(path, digitab=None) -> DrawingFile
Argumento Tipo Descripción
path str Ruta del almacén .mdb.
digitab DigiTab Tabla de códigos (opcional) con el ioGeomedia:transform de cada código. Si no se indica, se usa una vacía.

Devuelve un DrawingFile con las geometrías de todas las clases de entidad. DrawingFile.crs es el sistema de coordenadas de la tabla GCoordSystem del almacén. Si path no existe, lanza FileNotFoundError.

create

create(path, digitab=None, crs="") -> DrawingWriter
Parámetro Tipo Por defecto Descripción
path str — Ruta de un almacén GeoMedia en Access que ya existe y tiene sus clases de entidad en la tabla GFeatures. Se conservan las geometrías que ya tiene.
digitab DigiTab None Tabla de códigos. Imprescindible: cada código necesita su elemento ioGeomedia:transform con su clase de entidad.
crs str "" Opcional. El sistema es el de la tabla GCoordSystem del almacén; si crs no coincide, warnings lo avisa.

El formato no tiene parámetros en la orden PARAMETROS_IMPORTACION.

Requisito de la tabla de códigos: cada código que se escribe necesita un elemento ioGeomedia:transform cuyo atributo table es la clase de entidad del almacén:

<code name="040645" description="Árbol puntual" type="0" …>
  <io>
    <ioGeomedia:transform table="040645" textHeight="1.000000" />

Qué hace el exportador:

  • Añade cada geometría a la clase de entidad de su código. Una geometría de otro tipo que su clase (una línea abierta en una clase de áreas) se rechaza: add devuelve False y warnings lo indica.

Excepciones de create: FileNotFoundError si path no existe; RuntimeError si el almacén no tiene clases de entidad (como los archivos semilla de GeoMedia).

Ejemplos

Los ejemplos de esta página se han ejecutado con Python 3.12 contra una copia de un almacén GeoMedia real, que no se publica: una hoja del modelo MGCP con 11.514 geometrías en ETRS89 geográficas, y su tabla de códigos modelo.tab.xml. La salida que se muestra es la real. En MGCP los códigos que empiezan por A son áreas, por L líneas y por P puntos.

Leer y contar por tipo

import collections

import digi21.io.geomedia as geomedia
from digi21.base import DigiTab

digitab = DigiTab.load("modelo.tab.xml")
dibujo = geomedia.open("almacen.mdb", digitab)
print(dibujo.crs[:22])

conteo = collections.Counter()
for geometry in dibujo:
    conteo[type(geometry).__name__] += 1
print(dict(conteo))
COMPD_CS["ETRS89 + Sis
{'Line': 4546, 'Polygon': 20, 'Point': 6948}

Convertir el almacén a BinDouble

import digi21.io.bindouble as bind
import digi21.io.geomedia as geomedia
from digi21.base import DigiTab

digitab = DigiTab.load("modelo.tab.xml")
origen = geomedia.open("almacen.mdb", digitab)
with bind.create("almacen.bind", digitab, crs=origen.crs) as writer:
    for geometry in origen:
        writer.add(geometry)

print(writer.written, "escritas,", writer.rejected, "rechazadas")
11514 escritas, 0 rechazadas

Añadir geometrías al almacén

import digi21.io.geomedia as geomedia
from digi21.base import DigiTab, Line

digitab = DigiTab.load("modelo.tab.xml")
antes = sum(1 for _ in geomedia.open("almacen.mdb", digitab))

# Coordenadas en el sistema del almacén (aquí, ETRS89 geográficas: longitud y latitud en grados).
with geomedia.create("almacen.mdb", digitab) as writer:
    print(writer.add(Line(["LAP030"], [(-6.97, 38.88, 200.0), (-6.96, 38.88, 201.0), (-6.96, 38.89, 202.0)])))
    print(writer.add(Line(["AAL015"], [(-6.97, 38.88, 200.0), (-6.96, 38.88, 201.0), (-6.96, 38.89, 202.0)])))

despues = sum(1 for _ in geomedia.open("almacen.mdb", digitab))
print(writer.written, "escrita,", writer.rejected, "rechazada;", antes, "->", despues, "geometrías")
print(writer.warnings)
True
False
1 escrita, 1 rechazada; 11514 -> 11515 geometrías
['The format cannot store a line with the code AAL015.']

LAP030 es una clase de líneas y acepta la línea. AAL015 es una clase de áreas y rechaza una línea abierta.

El almacén tiene que existir

import digi21.io.geomedia as geomedia

try:
    geomedia.create("no-existe.mdb")
except FileNotFoundError as error:
    print(error)
No such file: 'no-existe.mdb'. The engine cannot create a GeoMedia warehouse: path must be an existing Access database with its feature classes in GFeatures.

Véase también