Acceso a los fenómenos de una fuente de datos tabular
Para acceder a los fenómenos de una fuente de datos tabular se
utiliza el método features. Este método devuelve un objeto que nos
permite iterar sobre el conjunto de datos de la capa. Sin embargo,
hay que tener en cuenta que el iterador reutiliza la instancia para
el nuevo valor, por lo que durante una iteración no debemos
guardarnos el valor de la instancia, si no obtener una copia de esta
mediante el método getCopy del fenómeno. El motivo para reutilizar
la instancia es que esta técnica aumenta la velocidad de ejecución y
crea muchas menos instancias de objetos, lo que mejora el
rendimiento de la máquina virtual de java.
La colección de fenómenos. La clase FeatureSet
El código para obtener los fenómenos de la capa activa sería
layer = currentLayer()
features = layer.features()
Los métodos más importantes que tiene el objeto featureSet son
- getCount(): devuelve el número de fenómenos que tiene la
fuente de datos
- update(feature): actualiza un fenómeno dentro de la
colección.
Veamos cómo recorrer los fenómenos de una capa con un ejemplo.
Supongamos que tenemos una capa activa cuyos fenómenos tienen una
propiedad ELEVACION, nosotros queremos obtener el objeto feature que
se corresponde con el valor máximo de este atributo.
Los pasos que se siguen en el ejemplo son (ejemplo 1):
- Obtenemos la capa activa
- Obtenemos el iterador del conjunto de fenómenos de la capa
- Inicializamos las variables
- Recorremos el conjunto de fenómenos mediante el iterador
- Comprobamos el valor del atributo ELEVACION
- Si es mayor que el que ya hemos almacenado guardamos el
fenómeno
layer = currentLayer()
features = layer.features()
fmax = 0.0
newFeature = None
for feature in features:
if feature.ELEVACION > fmax:
newFeature = feature.getCopy()
#
# resto de codigo
Recuerda que debes realizar una copia de la feature y no una
asiganción directa.
Manejo de la selección, la clase Selection
Podemos obtener un subconjunto concreto de fenómenos de una capa o
tabla aplicando un filtro sobre los atributos de los fenómenos. Para
ello tenemos que invocar al método 'features' de la capa usando la
condición que queremos que se aplique al conjunto de los datos para
obtener nuestro subconjunto.
Por ejemplo, el código de aplicar un filtro a nuestro conjunto de
datos podría ser (ejemplo 2):
layer = currentLayer()
expresion = "ID >= 50 AND ID < 100"
features = layer.features(expresion)
#
# resto de codigo
También puede darse la circunstancia de que queramos operar con un
conjunto de datos que ya tenemos seleccionados en la capa. En este
caso deberemos usar el método getSelection de la capa (ejemplo 3).
layer = currentLayer()
features = layer.getSelection()
#
#resto de codigo
Es posible, también, que queramos recorrer los fenómenos e ir
añadiendo algunos a la selección, para ello, lo primero que debemos
hacer es obtener el objeto 'selection' y añadir los fenómenos que
queramos mediante el método 'select' (ejemplo 4).
layer = currentLayer()
features = layer.features()
for feature in features:
featureCopy = feature.getCopy()
layer.getSelection().select(featureCopy)
#
# resto de codigo
Este ejemplo anterior, haría una selección de todos los fenómenos de
la capa, lo que es equivalente al método 'selectAll' (ejemplo 5).
layer = currentLayer()
features = layer.getSelection().selectAll()
Si queremos seleccionar los fenómenos que cumplan una determinada
condición podemos hacerlo de la siguiente manera. Este ejemplo añade
a la selección el fenómeno que tiene el valor más alto en el campo
ELEVATION (ejemplo 6).
layer = currentLayer()
features = layer.features()
fmax =0
featureCopy = None
for feature in features:
if feature.ELEVACION > fmax:
featureCopy = feature.getCopy()
if featureCopy:
layer.getSelection().select(featureCopy)
#
# resto de codigo
El objeto Feature
Representa un fenómeno de una fuente de datos tabular. Sus métodos
principales son:
- geometry(): Devuelve la geometría por defecto del fenómeno.
- getValues(): Devuelve un diccionario con el nombre y el valor
de las propiedades del fenómeno
- edit(): pone el fenómeno en modo edición.
- set(nombre, valor): Establece en la propiedad establecida
mediante el parámetro nombre el valor pasado como parámetro.
- nombre, string: Nombre de la propiedad del fenómeno
- valor, object: Valor que debe asignarse a la propiedad
Modificación de los atributos de un fenómeno
Los fenómenos no son editables en sí mismos. Para editar un fenómeno
es necesario invocar al método edit(), a continuación se realizan
los cambios que se quieran aplicar sobre el fenómeno.
Internamente la edición de una feature se realiza mediante una copia
de esta para evitar que se produzcan ambigüedades en el estado
interno del fenómeno.
El código para modificar un atributo del fenómeno sería (ejemplo 7)
fuente = currentTable()
features = fuente.features()
for feature in features:
feature.edit()
feature.set("NombreDelAtributo", valor)
fuente.update(feature)
fuente.commit()
El código para modificar una capa es el mismo llamando a la
función currentLayer.
Añadir un registro a la fuente de datos
Para añadir un registro o fenómeno nuevo a la fuente de datos
tabular debe usarse el método append de la instancia de la fuente de
datos.
table = currentTable()
table.append(values)
table.update()
table.commit()
- append(values): Crea un nuevo fenómeno y lo añade a la
colección de datos.
- values, dict: Añade en la propiedad key del fenómeno, el
valor correspondiente.
Si el objeto no está en estado de edición al usar
este método se cambiará el estado a modo edición.
Por ejemplo, supongamos que tenemos un dxf sin registros con un
campo "Id", de tipo entero y queremos añadir 10 registros nuevos
cuyo id se incremente en una unidad (ejemplo 8).
table = currentTable()
values = dict()
for i in range(1,11):
values["Id"] = i
table.append(values)
table.commit()