[QGIS-pt] acção que faz zoom a registo noutro layer

Duarte Carreira dncarreira gmail.com
Quinta-Feira, 15 de Maio de 2014 - 04:43:55 PDT


Ok, então aqui fica a solução que encontrei.

1) Fazer módulo Python e gravá-lo na pasta do projecto qgis
2) Definir acção Python que importa o script e executa a função nesse script

O script que criei foi este (gravado na pasta do projecto, com o nome que
usamos depois na acção - p.e. accoes.py):

# -*- coding: UTF-8 -*-
from qgis.core import *
import qgis.utils

def zoomToPredioSelec( NUMPRED ):
  canvas = qgis.utils.iface.mapCanvas()
  layerMap = QgsMapLayerRegistry.instance().mapLayers()
  vl_id = -1
  for name, layer in layerMap.iteritems():
      if(layer.name() == 'cadastro_geometrico'):
          vl_id=layer.id()
  vl = layerMap[vl_id]
  sFilterExp = u'"NUMPRED" = \'%s\'' % NUMPRED
  it = vl.getFeatures( QgsFeatureRequest().setFilterExpression ( sFilterExp
) )
  vl.setSelectedFeatures( [ f.id() for f in it ] )

  canvas.zoomScale(15000)
  qgis.utils.iface.setActiveLayer(vl)
  qgis.utils.iface.actionPanToSelected().trigger()
  canvas.refresh()


Este script é para ser usado a partir de uma acção definida numa tabela
alfanumérica que tem o campo NUMPRED.
O user ao clicar sobre um registo com o botão direito consegue despoletar a
acção, com o valor desse campo. Resulta assim que é selecionado o prédio no
layer de cadastro e centrado nesse prédio à escala 1:15000.

A acção é definida com este código Python:
import accoes; accoes.zoomToPredioSelec('[% "NUMPRE" %]')

A vantagem de ter o código num ficheiro é que as acções python só aceitam
código numa única linha, o que complica muito quando o código tem já tem
algumas linhas e com indentação ainda pior fica. Assim é mais fácil. Também
permite ter no mesmo ficheiro código para várias acções.

Até à próxima.
Duarte


> From: Duarte Carreira <dncarreira  gmail.com>
> To: qgis-pt  lists.osgeo.org
> Cc:
> Date: Wed, 14 May 2014 17:46:26 +0100
> Subject: [QGIS-pt] acção que faz zoom a registo noutro layer
> Olá a todos! Aqui vai a minha estreia na lista!
>
> O que preciso fazer é criar uma action que usa um campo para encontrar e
> fazer zoom a um registo noutro layer.
>
> Alguma ajuda/receita/link para isto?
>
> Mais detalhadamente:
>
> 1-selecionar registo na tabela A
> 2-obter valor do campo Id_B
> 3-fazer zoom ao registo na tabela B cujo id=Id_B
>
> Obrigado!
> Duarte
>
>
-------------- próxima parte ----------
Um anexo em HTML foi limpo...
URL: <http://lists.osgeo.org/pipermail/qgis-pt/attachments/20140515/80c5b03e/attachment.html>


More information about the QGIS-pt mailing list