8. Acceso a objectos en gvSIG¶
8.1. Funciones current¶
Son aquellas funciones que nos ayudan a acceder de una forma rápida a partes de gvSIG que estén en ejecución o cargadas en ese momento. Tales pueden ser como la Vista que tenemos abierta o la capa que tenemos selecciona en esa Vista.
Estas funciones se encuentran dentro de la librería gvsig
y son:
- currentProject()¶
Devuelve el proyecto actual de gvSIG
- currentDocument()¶
Devuelve el documento actual (Vista o Tabla)
- currentView()¶
Devuelve la Vista activa o None. Si no hay Vista activa devuelve un error de RuntimeException
- currentLayer()¶
Devuelve la capa activa en la Vista
Por ejemplo, teniendo un Proyecto con una Vista abierta y una capa cargada y seleccionada en esta Vista, ejecutando:
import gvsig
def main(*args):
project = gvsig.currentProject()
print "project: ", type(project)
print "project.name: ", project.name
view = gvsig.currentView()
print "view: ", type(view)
print "view.name: ", view.name
layer = gvsig.currentLayer()
print "layer: ", type(layer)
print "layer.name: ", layer.name
Dando como resultado en la consola algo similar a:
Running script acceso.
project: <type 'org.gvsig.app.project.DefaultProject'>
project.name: Sin título
view: <type 'org.gvsig.app.project.documents.view.DefaultViewDocument'>
view.name: Sin título
layer: <type 'org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect'>
layer.name: points_layer-57ab8d7e99c
Script acceso terminated.
8.2. Proyecto¶
La clase Project ( DefaultProject ) se encarga de la gestión de los documentos que tengamos en gvSIG. Este se encarga de las Vistas, Tablas, Mapas, Gráficas y otros que pueden venir desde otras extensiones como el de Series de mapas.
Para acceder a esta clase podemos usar currentProject()
, nos devolverá la instancia del proyecto que se encuentra actualmente abierto en gvSIG.
Por ejemplo, podemos obtener su nombre y la proyección establecida en el proyecto:
# encoding: utf-8
from gvsig import *
def main(*args):
project = currentProject()
name = project.getName()
prjcode = project.getProjectionCode()
prj = project.getProjection()
print "Project Name: ", name
print "Projection Code: ", prjcode, type(prjcode)
print "Projection: ", prj, type(prj)
Muestra por consola:
Project Name: Sin título
Projection Code: EPSG:4326 <type 'unicode'>
Projection: EPSG:4326 <type 'org.gvsig.crs.Crs'>
En este caso, getProjection() es un método implementado en la API de gvSIG, y getProjectionCode() es un método inyectado en la API de gvSIG desde las librerías de Jython desarrolladas.
8.3. Documento Vista¶
El documento Vista ( DefaultViewDocument ) contendrá las capas de nuestro proyecto, en el podremos visualizarlas y editarlas.
Para acceder a las Vistas creadas en un Proyecto, podremos usar dos funciones: currentView()
o currentDocument()
para acceder a la Vista activa, o currentProject().getView(«Nombre») para acceder a una determinada Vista:
# encoding: utf-8
from gvsig import *
def main(*args):
project = currentProject()
# Acceso a vista con nombre "Vista1"
view1 = currentProject().getView("Vista1")
Una Vista pueden contener diferentes capas o servicios cargados. Un Proyecto puede contener varias vistas. Por ejemplo, con el siguiente script listaremos todas las Vistas que se encuentren en nuestro proyecto:
from gvsig import *
def main(*args):
project = currentProject()
views = project().getViews()
for view in views:
print view
También podemos realizar otras operaciones. Por ejemplo, podemos crear una Vista nueva en nuestro Proyecto y cambiarle la proyección que tiene:
from gvsig import *
def main(*args):
project = currentProject()
# Creamos nueva vista
view = project.createView("Nueva Vista")
print "Vista nueva: ", view.getName()
print "Proyeccion de la Vista: ", view.getProjectionCode()
# Nos ayudamos de una funcion para obtener el crs object
# correspondiente a un codigo crs
newcrs = getCRS("EPSG:32630")
view.setProjection(newcrs)
print "Nueva proyeccion de la Vista: ", view.getProjectionCode()
En el caso de que ya exista una Vista con ese nombre, se añadirá a él un indice. Si volvemos a ejecutar el script anterior, el nombre de la nueva vista será: «Nueva Vista - 1».
Si tenemos la Vista anteriormente creada abierta en gvSIG, podemos acceder directamente a esa Vista abierta cuando ejecutamos nuestro script mediante currentView()
. Por ejemplo:
from gvsig import *
def main(*args):
view = currentView()
print "Nombre de la Vista: ", view.getName()
Podemos centrar la vista en el punto que queramos:
from gvsig import *
from gvsig.geom import *
def main(*args):
view = currentView()
encuadre = createEnvelope([10,10],[20,20])
view.getMapContext().getViewPort().setEnvelope(encuadre)
view.centerView(createEnvelope([20,20],[50,50]))
8.4. Documento Tabla¶
Otro tipo de documentos que tenemos en nuestro proyecto son las Tablas ( DefaultFeatureStore ). Estas tablas pueden hacer referencia tanto a tablas añadidas a gvSIG como a tablas de atributos de las capas u otras que aparezcan en este gestor.
De la misma forma que los documentos vista, podemos utilizar la función currentTable()
o currentDocument()
o project.getTable(«Name»).
8.5. Capas¶
Cualquier capa o servicio añadido a nuestras Vistas serán accesibles mediante Scripting.
Por ejemplo, una operación básica en herramientas que creemos, sería la creación de una capa vectorial y añadirla a una Vista nueva:
from gvsig import *
from gvsig.geom import *
def main(*args):
# Creamos esquema para la capa
ft = createFeatureType()
ft.append("GEOMETRY", "GEOMETRY")
# Establecemos el tipo del geometria.
# Usamos constantes POINT y D2 que se encuentran
# dentro de la libreria gvsig.geom
ft.get("GEOMETRY").setGeometryType(POINT, D2)
# Creamos la capa nueva con el nuevo esquema
# La funcion se encarga de establecer un path temporal
shp = createShape(ft)
# Agregamos la capa a nuesta vista nueva
# Se creara con el nombre de View 001 por defecto
newview = currentProject().createView()
newview.addLayer(shp)
Tenemos la opción de iterar sobre todas las capas que tenga una Vista:
from gvsig import *
from gvsig.geom import *
def main(*args):
view = currentView()
layers = view.getLayers()
# Acceder iterando las capas
print "\nIterando: "
for layer in layers:
print "\tCapa: ", layer.getName(),
print " Tipo: ", layer.getTypeVectorLayer().getFullName()
# Acceder mediante indices
print "\nMediante indices: "
for i in range(0, len(layers)):
print "\tCapa: ", layers[i].getName(),
print " Tipo: ", layers[i].getTypeVectorLayer().getFullName()
Si tenemos una Vista con tres capas, el resultado por consola será similar al siguiente:
Iterando:
Capa: tmpshp-57ae45dd1765 Tipo: Point:2D
Capa: tmpshp-57ae45f712b6 Tipo: MultiCurve:2D
Capa: tmpshp-57ae45fe1112 Tipo: MultiSurface:3DM
Mediante indices:
Capa: tmpshp-57ae45dd1765 Tipo: Point:2D
Capa: tmpshp-57ae45f712b6 Tipo: MultiCurve:2D
Capa: tmpshp-57ae45fe1112 Tipo: MultiSurface:3DM
Si quieres acceder a capas ya existentes en la Vista podrías hacerlo mediante currentView().getLayer("Nombre")
, si la tenemos seleccionada en la tabla de contenidos (TOC) mediante currentLayer()
Otros métodos que podemos usar sobre una capa añadida son los de .setVisible(True)
para modificar su visibilidad en la Vista, o `` layer.setActive(True)`` para modificar su selección dentro de la Tabla de Contenidos.
8.6. Grupo de entidades: FeatureSet¶
Para obtener las entidades de una capa o tabla, podemos hacer una petición mediante layer.features()
, la cual hace una petición al store de la capa, y nos devuelve un featureSet ( DefaultFeatureSet ) con el filtrado o orden que le asignemos. Este featureSet nos permite iterar sobre las entidades de la capa.
Después, por ejemplo, podemos acceder a estas entidades y a sus valores mediante el método getValues()
sobre cada feature
, el cual devuelve un diccionario que podemos imprimir:
from gvsig import *
from gvsig.geom import *
def main(*args):
layer = currentLayer()
features = layer.features()
print "Numero entidades: ", features.getSize()
for feature in features:
print feature.getValues()
Por consola el resultado en este caso sería:
Numero entidades: 7
{u'NAME': u'Feature1', u'ID': 1L, u'GEOMETRY': POINT (1.0 2.0)}
{u'NAME': u'Feature2', u'ID': 2L, u'GEOMETRY': POINT (5.0 3.0)}
{u'NAME': u'Feature2', u'ID': 3L, u'GEOMETRY': POINT (3.0 3.0)}
{u'NAME': u'Feature2', u'ID': 4L, u'GEOMETRY': POINT (2.0 1.0)}
{u'NAME': u'Feature3', u'ID': 5L, u'GEOMETRY': POINT (2.0 6.0)}
{u'NAME': u'Feature3', u'ID': 6L, u'GEOMETRY': POINT (6.0 2.0)}
{u'NAME': u'Feature3', u'ID': 7L, u'GEOMETRY': POINT (2.0 7.0)}
Más información en el apartado de «Consulta de entidades»
8.7. Entidad¶
Antes hemos visto que podemos acceder a los valores de cada entidad ( DefaultFeature ) con getValues()
, pero también podemos acceder directamente mediante feature.FIELD
o feature.get(«Field»). Por ejemplo:
from gvsig import *
from gvsig.geom import *
def main(*args):
layer = currentLayer()
features = layer.features()
for feature in features:
print "ID: ", feature.ID, " NAME: ", feature.get("NAME")
La salida por consola será:
ID: 1 NAME: Feature1
ID: 2 NAME: Feature2
ID: 3 NAME: Feature2
ID: 4 NAME: Feature2
ID: 5 NAME: Feature3
ID: 6 NAME: Feature3
ID: 7 NAME: Feature3
8.7.1. Selección¶
Otro tipo de featureSet es el DefaultFeatureSelection. Hace referencia a los objetos que tengamos seleccionados en la capa.
Un ejemplo de su uso, teniendo 3 entidades seleccionadas:
from gvsig import *
from gvsig.geom import *
def main(*args):
layer = currentLayer()
#features = layer.features()
selection = layer.getSelection()
for feature in selection:
print "ID: ", feature.ID, " NAME: ", feature.get("NAME")
Dando como resultado:
ID: 1 NAME: Feature1
ID: 2 NAME: Feature2
ID: 3 NAME: Feature2
Disponemos de dos métodos especiales para esta clase como son el .selectAll()
para seleccionar todas las entidades de esa capa o .deselectAll()
para deseleccionar todos ellos.
Por ejemplo, añadiremos a la selección ciertas entidades que cumplan un criterio:
from gvsig import *
from gvsig.geom import *
def main(*args):
layer = currentLayer()
#Entidades de la capa
features = layer.features()
#Seleccion de entidades
selection = layer.getSelection()
selection.deselectAll()
for feature in features:
if feature.ID < 3:
# Agregamos entidades a la seleccion
selection.select(feature)
Si quisiéramos eliminar entidades de la selección, podríamos usar el método .deselect(feature)
Por otra parte, también podríamos crear una selección o varias desde Scripting:
from gvsig import *
def main(*args):
# Create a new selection
layer = currentLayer()
features = layer.features()
newselection = layer.getDataStore().createSelection()
for f in features:
if f.ID!=10:
newselection.select(f)
layer.getDataStore().setSelection(newselection)