8. Trabalhando com camadas: FLayer

Trabalhando com camadas FLayer

createShape(definition[, filename=None, geometryType=None, CRS=None, prefixname="tmpshp"])

Creates a new shape layer. If geometryType is None, will take geometry type from the definition. If parameter geometryType and the geometry type inside the definition are different, raises an error.

param definition:

Layer schema :type definition: DefaultFeatureType

param str filename:

Full path

param geometryType:
type geometryType:

GeometryType

param str CRS:

CRS Code :param str prefixname: first part of the temp name

A interface FLayer vem implementada em várias camadas de uso comum como são as camadas vetoriais ou raster.

8.1. Camadas vetoriais: FLyrVect

Uma das operações mais importante é o trabalho com camadas vetoriais FLyrVect. Procuramos simplificar o máximo possível o trabalho com elas, sobre todo para um novo desenvolvedor(programador).

Já vimos anteriormente a geração de esquemas que podem ser usados em camadas vetoriais. A única condição destes esquemas é que tenham um campo GEOMETRY com um tipo definido de geometria.

8.1.1. Criar camada vetorial

Para a criação de camadas procuramos simplificar o máximo a função :py:func:createShape(definition). O único parâmetro obrigatório será o esquema da camada com seu campo geometria.

Por exemplo, o mínimo necessário para criar uma camada é:

from gvsig import *
from gvsig.geom import *

def main(*args):

        schema = createFeatureType() # DefaultFeatureType

        schema.append("GEOMETRY", "GEOMETRY")
        schema.get("GEOMETRY").setGeometryType(POINT, D2)
        shape = createShape(schema)

Desta forma, se a rota ou o nome do arquivo não é importante para nós, algo muito comum na hora de criar camadas para resultados de geoprocessos ou similares, a função se encarregará de atribuir uma rota em uma pasta temporária e um nome aleatório (baseado em códigos de tempo).

Outra forma seria usar diretamente a função createLayer():

layer = createLayer(schema=schema,
                    servertype="FilesystemExplorer",
                    layertype="Shape",
                    shpFile="/home/osc/temp/test1.shp",
                    CRS="EPSG:25830",
                    geometryType=geom.POINT
                    )

Assim no script anterior podemos adicionar as línhas:

print "Nome: ", shape.getName()
print "Rota: ", shape.getDataStore().getFullName()

Que dará como resultado o nome e rota da camada, similar a:

Nome:  tmpshp-57afa1381035
Rota:  C:\Users\Oscar\AppData\Local\Temp\tmp-andami\tmpshp-57afa1381035.shp

Se for necessário criar várias camadas e precisar diferenciá-las, podemos estabelecer o parâmetro prefixname o qual modificará a primeira parte do nome, mas seguirá criando todo o resto de rota temporária e assegurando-nos que será um nome único:

from gvsig import *
from gvsig.geom import *

def main(*args):

        schema = createFeatureType() # DefaultFeatureType

        schema.append("GEOMETRY", "GEOMETRY")
        schema.get("GEOMETRY").setGeometryType(POINT, D2)
        shape1 = createShape(schema, prefixname="resultado")
        shape2 = createShape(schema, prefixname="erros")
        shape3 = createShape(schema, prefixname="pontos")

        print "Nome: ", shape1.getName(), "\tRota: ", shape1.getDataStore().getFullName()
        print "Nome: ", shape2.getName(), "\tRota: ", shape2.getDataStore().getFullName()
        print "Nome: ", shape3.getName(), "\tRota: ", shape3.getDataStore().getFullName()

No console nos mostra:

Nome:  resultado-57afa4f612c9   Rota:  C:\Users\Oscar\AppData\Local\Temp\tmp-andami\resultado-57afa4f612c9.shp
Nome:  erros-57afa4f613a6       Rota:  C:\Users\Oscar\AppData\Local\Temp\tmp-andami\erros-57afa4f613a6.shp
Nome:  pontos-57afa4f61446      Rota:  C:\Users\Oscar\AppData\Local\Temp\tmp-andami\pontos-57afa4f61446.shp

8.1.2. Modificar esquema de uma camada

O seguinte script modificará o esquema de una camada. Para isto teremos que criar um novo esquema baseado na camada anterior, mediante createFeatureType(layer_schema), realizar as modificações e atualizar a camada:

from gvsig import *
from gvsig import geom

def main(*args):
        """Updating schema of existent layer"""

        layer = currentLayer()

        schema = layer.getSchema()
        newschema = createSchema(schema)
        newschema.append("ID2", "STRING")

        layer.edit()
        layer.update(newschema)
        layer.commit()

8.1.3. Operação com entidades

Una vez criada a nova camada ou acessada uma já existente com currentLayer() ou view.getLayer("Name"), podemos acessar as suas entidades mediante o método .features(), tal como explicamos no guia de Acesso a dados.

Em seguida o que faremos é adicionar dados a esta camada vetorial. Para isto colocamos a camada em modo de edição mediante layer.edit() e agregamos as entidades com layer.append(args):

from gvsig import *
from gvsig.geom import *

def main(*args):

        schema = createFeatureType() # DefaultFeatureType

        schema.append("ID", "INTEGER", 5)
        schema.append("NOME", "STRING", 10)
        schema.append("GEOMETRY", "GEOMETRY")
        schema.get("GEOMETRY").setGeometryType(POINT, D2)

        shape = createShape(schema, prefixname="resultado")


        print "Nome: ", shape.getName(), "\tRota: ", shape.getDataStore().getFullName()

        shape.edit()
        # Incluir dados na camada
        shape.append(ID=1, NOME="Valencia", GEOMETRY=createPoint2D(10, 10))
        # Dicionário
        shape.append({"ID": 2, "NOME": "Paris", "GEOMETRY":createPoint2D(15, 15)})
        shape.commit()

        currentView().addLayer(shape)

Outro exemplo adicionando entidades, usando a partir do Java:

import gvsig
reload(gvsig)
from gvsig import *
from gvsig import geom

from org.gvsig.fmap.dal.feature import FeatureStore
def main(*args):

        # Criar nova camada
        schema = createSchema()
        schema.append("ID", "INTEGER")
        schema.append("NOME", "STRING", 10)
        schema.append("GEOMETRY", "GEOMETRY")
        schema.get('GEOMETRY').setGeometryType(geom.POINT,geom.D2)

        camada = createShape(schema, prefixname="Camada_ponto")

        # Inserir com newfeature
        store = camada.getFeatureStore()

        newfeature = store.createNewFeature()
        newfeature.set("ID",1)
        newfeature.set("NOME","Feature1")
        newfeature.set("GEOMETRY", geom.createPoint(geom.D2, 1,2))

        camada.edit(FeatureStore.MODE_APPEND) #somente para camadas recém criadas
        store.insert(newfeature)
        camada.commit()

        # Inserir com append
        camada.edit()
        camada.append(ID=2,NOME='Feature2',GEOMETRY=geom.createPoint(geom.D2, 5, 3))

        camada.append({'ID':3,'NOME':'Feature2','GEOMETRY':geom.createPoint(geom.D2, 3, 3)})
        camada.append({'ID':4,'NOME':'Feature2','GEOMETRY':geom.createPoint(geom.D2, 2, 1)})
        camada.append({'ID':5,'NOME':'Feature3','GEOMETRY':geom.createPoint(geom.D2, 2, 6)})
        camada.append({'ID':6,'NOME':'Feature3','GEOMETRY':geom.createPoint(geom.D2, 6, 2)})
        camada.append({'ID':7,'NOME':'Feature3','GEOMETRY':geom.createPoint(geom.D2, 2, 7)})
        camada.commit()

        # Adicionar camada na vista
        currentView().addLayer(camada)

        print u"Informações das entidades"
        for l in camada.features():
                print l

Se ao final do script anterior adicionamos as seguintes linhas, veremos um exemplo para eliminar entidades:

features = layer.features("ID < 6") #DefaultFeatureSet

layer.edit()
print type(layer)
print features, type(features)
for i in features:
        features.delete(i)

layer.commit()

Para modificar os valores das entidades da nossa camada:

layer.edit()

for i in features:
        print i
        c = i.getEditable()
        c.set("NOME", "Modified_4")
        features.update(c)

layer.commit()

É possível realizar copias de entidades (features) e depois modifica-las na sua camada original.

Exemplo: Extraímos certas entidades de una camada que tenha um Campo1 do tipo Long. Copiamos estas entidades para uma lista. Depois, modificamos estas entidades e voltemos a modificar sobre a camada inicial:

from gvsig import *

def main(*args):
    layer = currentLayer()
    features = layer.features('Campo1>2',sortBy="Campo1",asc=True)
    lista = []
    for f in features:
        print f
        copia = f.getCopy()
        print type(copia)
        lista.append(copia)

    print len(lista)
    layer.edit()
    for i in lista:
        value = i.get('Campo1')+0.01
        i = i.getEditable()
        i.set('Campo1', value)
        print "new value", i.get('Campo1'), type(i)
        featureSet = layer.features()
        layer.features().update(i)
    layer.commit()