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()