[QGIS-pt] Iterações sobre atributos selecionados.

  Olá a todos,

  Estou tentando desenvolver um script para o processing no QGIS 2.12
em Xubuntu 14.04. Não sou profissional de cartografia topografia,
portanto o SIG para mim é uma ferramenta que não conheço profundamente
e estou longe de usá-lo em seu total potencial.

  Eu tenho duas coleções de pontos, por exemplo Rec e Fon. Em
princípio são dois shapefiles. Em linhas gerais, estou percorrendo as
duas coleções como:

RPts = ogr.Open(Rec, False)
Rs = RPs.GetLayer(0)
NR = Rs.GetFeatureCount()

for i in xrange(NumREC):
    R = Rs.GetNextFeature()
    {faz alguma coisa com os R's}

  O mesmo para a coleção Fon.

  Uma das minhas perguntas é: Esta é a melhor maneira de fazê-lo?

  Está funcionando, mas não sei se é mais eficiente ou elegante.

  Agora a minha pergunta núcleo. Para cada ponto da coleção Fon eu
devo selecionar um subconjunto da coleção Rec. Estou fazendo esta
seleção usando:

    # Esta expressão define um retângulo em torno do ponto Fon sendo
    # processado, supondo que as distribuições são orientadas NS ou LO.
    Sel = 'abs("RX"-%f)<=%f and abs("RY"-%f)<=%f'%\
            (FX,MxXd,FY,MxYd)

   # Seleciona os Rec em um retângulo
   processing.runalg('qgis:selectbyexpression','Rec',Sel,0)

  Esta seleção está funcionando, até onde consegui testar. A minha
pergunta é: Uma vez realizada a seleção, como posso iterar sobre a
lista de Rec's selecionados?

  Se esta não for a melhor abordagem para este problema eu ficaria muito
agradecido em receber sugestões.

  De antemão agradeço.

  Saudações.

  Roxo
P.S.- Pela escrita já devem ter percebido que sou brasileiro. :slight_smile:
--
---------------- Non luctari, ludare -------------------+ WYSIWYG
Fernando M. Roxo da Motta <petro@roxo.org> | Editor?
Except where explicitly stated I speak on my own behalf.| VI !!
      ( Usuário Linux registrado #39505 ) | I see text,
------------ Quis custodiet ipsos custodes?-------------+ I get text!

  Roxo

--
---------------- Non luctari, ludare -------------------+ WYSIWYG
Fernando M. Roxo da Motta <petro@roxo.org> | Editor?
Except where explicitly stated I speak on my own behalf.| VI !!
      ( Usuário Linux registrado #39505 ) | I see text,
------------ Quis custodiet ipsos custodes?-------------+ I get text!

Bom dia

Fernando M. Roxo da Motta <petro@roxo.org> escreveu no dia sáb, 28/11/2015 às 13:45:

Eu tenho duas coleções de pontos, por exemplo Rec e Fon. Em
princípio são dois shapefiles. Em linhas gerais, estou percorrendo as
duas coleções como:

RPts = ogr.Open(Rec, False)
Rs = RPs.GetLayer(0)
NR = Rs.GetFeatureCount()

for i in xrange(NumREC):
R = Rs.GetNextFeature()
{faz alguma coisa com os R’s}

Acho que podes iterar os elementos de uma camada sem necessitar de os contar antes:

for feature in layer.getFeatures():

Faz qualquer coisa com cada elemento

Honestamente, não sei se é mais eficiente, mas fica mais simples

Esta seleção está funcionando, até onde consegui testar. A minha
pergunta é: Uma vez realizada a seleção, como posso iterar sobre a
lista de Rec’s selecionados?

Se tens uma layer com elementos seleccionados, pode usar o método selectedFeatures()

for feature in layer.selectedFeatures():

#Fazer qq coisa com cada elemento

Cumprimentos,

Alexandre Neto

Alexandre Neto

http://gisunchained.wordpress.com

On Mon, 30 Nov 2015 11:04:03 +0000, Alexandre Neto
<senhor.neto@gmail.com> wrote:

Bom dia

  Bom dia Alexandre.

Fernando M. Roxo da Motta <petro@roxo.org> escreveu no dia sáb,
28/11/2015 às 13:45:

>
> Eu tenho duas coleções de pontos, por exemplo Rec e Fon. Em
> princípio são dois shapefiles. Em linhas gerais, estou
> percorrendo as duas coleções como:
>
> RPts = ogr.Open(Rec, False)
> Rs = RPs.GetLayer(0)
> NR = Rs.GetFeatureCount()
>
> for i in xrange(NumREC):
> R = Rs.GetNextFeature()
> {faz alguma coisa com os R's}
>
>
Acho que podes iterar os elementos de uma camada sem necessitar de os
contar antes:

  Ok. A contagem foi como um teste extra com relação à "sanidade" da
camada. A contagem está sendo obtida da seguinte maneira:

  NR = Rs.GetFeatureCount()
  if NR == 0:
        raise GeoAlgorithmExecutionException(
                'There are no Points in input vector Layer')

  Talvez eu possa iterar como sugerido abaixo e se ao final do laço a
contagem for zero emitir a exceção.

for feature in layer.getFeatures():
    # Faz qualquer coisa com cada elemento

Honestamente, não sei se é mais eficiente, mas fica mais simples

  Concordo, mas não sei se a forma como faço o acesso está errado
(talvez crie uma instância de um tipo diferente de objeto), mas eu
estou obtendo uma mensagem de erro. Usei o método dir() sobre o
objeto "Rs" e o método "getFeatures()" não aparece listado:

['AlterFieldDefn', 'Clip', 'CommitTransaction', 'CreateFeature',
'CreateField', 'CreateFields', 'DeleteFeature', 'DeleteField',
'Dereference', 'Erase', 'GetExtent', 'GetFIDColumn', 'GetFeature',
'GetFeatureCount', 'GetFeaturesRead', 'GetGeomType',
'GetGeometryColumn', 'GetLayerDefn', 'GetName', 'GetNextFeature',
'GetRefCount', 'GetSpatialFilter', 'GetSpatialRef', 'Identity',
'Intersection', 'Reference', 'ReorderField', 'ReorderFields',
'ResetReading', 'RollbackTransaction', 'SetAttributeFilter',
'SetFeature', 'SetIgnoredFields', 'SetNextByIndex', 'SetSpatialFilter',
'SetSpatialFilterRect', 'StartTransaction', 'SymDifference',
'SyncToDisk', 'TestCapability', 'Union', 'Update', '__bool__',
'__class__', '__delattr__', '__dict__', '__doc__', '__format__',
'__getattr__', '__getattribute__', '__getitem__', '__hash__',
'__init__', '__iter__', '__len__', '__module__', '__new__',
'__nonzero__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__swig_getmethods__', '__swig_setmethods__', '__weakref__', 'next',
'schema', 'this']

> Esta seleção está funcionando, até onde consegui testar. A minha
> pergunta é: Uma vez realizada a seleção, como posso iterar sobre a
> lista de Rec's selecionados?
>

Se tens uma layer com elementos seleccionados, pode usar o método
selectedFeatures()

for feature in layer.selectedFeatures():
    #Fazer qq coisa com cada elemento

  Ainda não testei esta opção, na verdade o método "selectedFeatures()"
também não aparece na lista acima. :frowning:

  Obrigado pela sua atenção.

  Sds.

Cumprimentos,
Alexandre Neto

  Roxo

--
---------------- Non luctari, ludare -------------------+ WYSIWYG
Fernando M. Roxo da Motta <petro@roxo.org> | Editor?
Except where explicitly stated I speak on my own behalf.| VI !!
      ( Usuário Linux registrado #39505 ) | I see text,
------------ Quis custodiet ipsos custodes?-------------+ I get text!

Peço desculpa, só reparei agora que o algoritmo corre directamente com base no OGR. Por isso os métodos que estava a sugerir (que são de pyqgis) não funcionam.

Fernando M. Roxo da Motta <petro@roxo.org> escreveu no dia seg, 30/11/2015 às 14:55:

On Mon, 30 Nov 2015 11:04:03 +0000, Alexandre Neto
<senhor.neto@gmail.com> wrote:

Bom dia

Bom dia Alexandre.

Fernando M. Roxo da Motta <petro@roxo.org> escreveu no dia sáb,
28/11/2015 às 13:45:

Eu tenho duas coleções de pontos, por exemplo Rec e Fon. Em
princípio são dois shapefiles. Em linhas gerais, estou
percorrendo as duas coleções como:

RPts = ogr.Open(Rec, False)
Rs = RPs.GetLayer(0)
NR = Rs.GetFeatureCount()

for i in xrange(NumREC):
R = Rs.GetNextFeature()
{faz alguma coisa com os R’s}

Acho que podes iterar os elementos de uma camada sem necessitar de os
contar antes:

Ok. A contagem foi como um teste extra com relação à “sanidade” da
camada. A contagem está sendo obtida da seguinte maneira:

NR = Rs.GetFeatureCount()
if NR == 0:
raise GeoAlgorithmExecutionException(
‘There are no Points in input vector Layer’)

Talvez eu possa iterar como sugerido abaixo e se ao final do laço a
contagem for zero emitir a exceção.

for feature in layer.getFeatures():

Faz qualquer coisa com cada elemento

Honestamente, não sei se é mais eficiente, mas fica mais simples

Concordo, mas não sei se a forma como faço o acesso está errado
(talvez crie uma instância de um tipo diferente de objeto), mas eu
estou obtendo uma mensagem de erro. Usei o método dir() sobre o
objeto “Rs” e o método “getFeatures()” não aparece listado:

[‘AlterFieldDefn’, ‘Clip’, ‘CommitTransaction’, ‘CreateFeature’,
‘CreateField’, ‘CreateFields’, ‘DeleteFeature’, ‘DeleteField’,
‘Dereference’, ‘Erase’, ‘GetExtent’, ‘GetFIDColumn’, ‘GetFeature’,
‘GetFeatureCount’, ‘GetFeaturesRead’, ‘GetGeomType’,
‘GetGeometryColumn’, ‘GetLayerDefn’, ‘GetName’, ‘GetNextFeature’,
‘GetRefCount’, ‘GetSpatialFilter’, ‘GetSpatialRef’, ‘Identity’,
‘Intersection’, ‘Reference’, ‘ReorderField’, ‘ReorderFields’,
‘ResetReading’, ‘RollbackTransaction’, ‘SetAttributeFilter’,
‘SetFeature’, ‘SetIgnoredFields’, ‘SetNextByIndex’, ‘SetSpatialFilter’,
‘SetSpatialFilterRect’, ‘StartTransaction’, ‘SymDifference’,
‘SyncToDisk’, ‘TestCapability’, ‘Union’, ‘Update’, ‘bool’,
class’, ‘delattr’, ‘dict’, ‘doc’, ‘format’,
getattr’, ‘getattribute’, ‘getitem’, ‘hash’,
init’, ‘iter’, ‘len’, ‘module’, ‘new’,
nonzero’, ‘reduce’, ‘reduce_ex’, ‘repr’,
setattr’, ‘sizeof’, ‘str’, ‘subclasshook’,
swig_getmethods’, ‘swig_setmethods’, ‘weakref’, ‘next’,
‘schema’, ‘this’]

Esta seleção está funcionando, até onde consegui testar. A minha
pergunta é: Uma vez realizada a seleção, como posso iterar sobre a
lista de Rec’s selecionados?

Se tens uma layer com elementos seleccionados, pode usar o método
selectedFeatures()

for feature in layer.selectedFeatures():
#Fazer qq coisa com cada elemento

Ainda não testei esta opção, na verdade o método “selectedFeatures()”
também não aparece na lista acima. :frowning:

Obrigado pela sua atenção.

Sds.

Cumprimentos,
Alexandre Neto

Roxo


---------------- Non luctari, ludare -------------------+ WYSIWYG
Fernando M. Roxo da Motta <petro@roxo.org> | Editor?
Except where explicitly stated I speak on my own behalf.| VI !!
( Usuário Linux registrado #39505 ) | I see text,
------------ Quis custodiet ipsos custodes?-------------+ I get text!


QGIS-pt mailing list
QGIS-pt@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/qgis-pt

Alexandre Neto

http://gisunchained.wordpress.com

On Mon, 30 Nov 2015 16:31:03 +0000, Alexandre Neto
<senhor.neto@gmail.com> wrote:

Peço desculpa, só reparei agora que o algoritmo corre directamente
com base no OGR. Por isso os métodos que estava a sugerir (que são de
pyqgis) não funcionam.

  Sem problema. :slight_smile:

  Você poderia me indicar como eu poderia alterar o código para utilizar
a infraestrutura do pyqgis? Estou particularmente interessado no
método "layer.getFeatures()".

  Sds.

Fernando M. Roxo da Motta <petro@roxo.org> escreveu no dia seg,
30/11/2015 às 14:55:

> On Mon, 30 Nov 2015 11:04:03 +0000, Alexandre Neto
> <senhor.neto@gmail.com> wrote:
>
>
> > Bom dia
>
> Bom dia Alexandre.
>
> >
> > Fernando M. Roxo da Motta <petro@roxo.org> escreveu no dia sáb,
> > 28/11/2015 às 13:45:
> >
> > >
> > > Eu tenho duas coleções de pontos, por exemplo Rec e Fon. Em
> > > princípio são dois shapefiles. Em linhas gerais, estou
> > > percorrendo as duas coleções como:
> > >
> > > RPts = ogr.Open(Rec, False)
> > > Rs = RPs.GetLayer(0)
> > > NR = Rs.GetFeatureCount()
> > >
> > > for i in xrange(NumREC):
> > > R = Rs.GetNextFeature()
> > > {faz alguma coisa com os R's}
> > >
> > >
> > Acho que podes iterar os elementos de uma camada sem necessitar
> > de os contar antes:
>
> Ok. A contagem foi como um teste extra com relação à "sanidade"
> da camada. A contagem está sendo obtida da seguinte maneira:
>
> NR = Rs.GetFeatureCount()
> if NR == 0:
> raise GeoAlgorithmExecutionException(
> 'There are no Points in input vector Layer')
>
> Talvez eu possa iterar como sugerido abaixo e se ao final do laço
> a contagem for zero emitir a exceção.
>
> >
> > for feature in layer.getFeatures():
> > # Faz qualquer coisa com cada elemento
> >
> > Honestamente, não sei se é mais eficiente, mas fica mais simples
> >
>
> Concordo, mas não sei se a forma como faço o acesso está errado
> (talvez crie uma instância de um tipo diferente de objeto), mas eu
> estou obtendo uma mensagem de erro. Usei o método dir() sobre o
> objeto "Rs" e o método "getFeatures()" não aparece listado:
>
> ['AlterFieldDefn', 'Clip', 'CommitTransaction', 'CreateFeature',
> 'CreateField', 'CreateFields', 'DeleteFeature', 'DeleteField',
> 'Dereference', 'Erase', 'GetExtent', 'GetFIDColumn', 'GetFeature',
> 'GetFeatureCount', 'GetFeaturesRead', 'GetGeomType',
> 'GetGeometryColumn', 'GetLayerDefn', 'GetName', 'GetNextFeature',
> 'GetRefCount', 'GetSpatialFilter', 'GetSpatialRef', 'Identity',
> 'Intersection', 'Reference', 'ReorderField', 'ReorderFields',
> 'ResetReading', 'RollbackTransaction', 'SetAttributeFilter',
> 'SetFeature', 'SetIgnoredFields', 'SetNextByIndex',
> 'SetSpatialFilter', 'SetSpatialFilterRect', 'StartTransaction',
> 'SymDifference', 'SyncToDisk', 'TestCapability', 'Union', 'Update',
> '__bool__', '__class__', '__delattr__', '__dict__', '__doc__',
> '__format__', '__getattr__', '__getattribute__', '__getitem__',
> '__hash__', '__init__', '__iter__', '__len__', '__module__',
> '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__',
> '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
> '__swig_getmethods__', '__swig_setmethods__', '__weakref__', 'next',
> 'schema', 'this']
>
>
> >
> > > Esta seleção está funcionando, até onde consegui testar. A
> > > minha pergunta é: Uma vez realizada a seleção, como posso
> > > iterar sobre a lista de Rec's selecionados?
> > >
> >
> > Se tens uma layer com elementos seleccionados, pode usar o método
> > selectedFeatures()
> >
> > for feature in layer.selectedFeatures():
> > #Fazer qq coisa com cada elemento
>
> Ainda não testei esta opção, na verdade o método
> "selectedFeatures()" também não aparece na lista acima. :frowning:
>
>
> Obrigado pela sua atenção.
>
>
> Sds.
>
>
> >
> > Cumprimentos,
> > Alexandre Neto
>
>
>
>
>
>
>
>
> Roxo
>
> --
> ---------------- Non luctari, ludare -------------------+ WYSIWYG
> Fernando M. Roxo da Motta <petro@roxo.org> | Editor?
> Except where explicitly stated I speak on my own behalf.| VI !!
> ( Usuário Linux registrado #39505 ) | I see
> text, ------------ Quis custodiet ipsos custodes?-------------+ I
> get text!
>
> _______________________________________________
> QGIS-pt mailing list
> QGIS-pt@lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/qgis-pt
>

  Roxo

--
---------------- Non luctari, ludare -------------------+ WYSIWYG
Fernando M. Roxo da Motta <petro@roxo.org> | Editor?
Except where explicitly stated I speak on my own behalf.| VI !!
      ( Usuário Linux registrado #39505 ) | I see text,
------------ Quis custodiet ipsos custodes?-------------+ I get text!

On Tue, 1 Dec 2015 09:21:27 -0200, "Fernando M. Roxo da Motta"
<petro@roxo.org> wrote:

  Olá a todos,

  Eu consegui fazer a conversão para pyqgis e a iteração sobre os
atributos selecionados está funcionando, até onde consegui testar.

  Não sei se a forma como estou fazendo é a mais adequada ou
eficiente. Estou usando :

  processing.runalg('qgis:selectbyexpression','Rec',"expr-sel",0)

  Para selecionar os atributos dentro de um retângulo e faço as
iterações sobre estes atributos. Durante este processo o mapa é
atualizado, o que (acredito) pode gerar demora porque são milhares de
seleções.

  Há alguma maneira de parar a atualização do mapa durante a execução
do script?

  Sds.

On Mon, 30 Nov 2015 16:31:03 +0000, Alexandre Neto
<senhor.neto@gmail.com> wrote:

> Peço desculpa, só reparei agora que o algoritmo corre directamente
> com base no OGR. Por isso os métodos que estava a sugerir (que são
> de pyqgis) não funcionam.

  Sem problema. :slight_smile:

  Você poderia me indicar como eu poderia alterar o código para
utilizar a infraestrutura do pyqgis? Estou particularmente
interessado no método "layer.getFeatures()".

  Roxo

--
---------------- Non luctari, ludare -------------------+ WYSIWYG
Fernando M. Roxo da Motta <petro@roxo.org> | Editor?
Except where explicitly stated I speak on my own behalf.| VI !!
      ( Usuário Linux registrado #39505 ) | I see text,
------------ Quis custodiet ipsos custodes?-------------+ I get text!

A 13h45 Sáb, 28 de Nov de 2015, Fernando M. Roxo da Motta <petro@roxo.org> escreveu:

Olá a todos,

Estou tentando desenvolver um script para o processing no QGIS 2.12
em Xubuntu 14.04. Não sou profissional de cartografia topografia,
portanto o SIG para mim é uma ferramenta que não conheço profundamente
e estou longe de usá-lo em seu total potencial.

Eu tenho duas coleções de pontos, por exemplo Rec e Fon. Em
princípio são dois shapefiles. Em linhas gerais, estou percorrendo as
duas coleções como:

RPts = ogr.Open(Rec, False)
Rs = RPs.GetLayer(0)
NR = Rs.GetFeatureCount()

for i in xrange(NumREC):
R = Rs.GetNextFeature()
{faz alguma coisa com os R’s}

O mesmo para a coleção Fon.

Uma das minhas perguntas é: Esta é a melhor maneira de fazê-lo?

Está funcionando, mas não sei se é mais eficiente ou elegante.

Agora a minha pergunta núcleo. Para cada ponto da coleção Fon eu
devo selecionar um subconjunto da coleção Rec. Estou fazendo esta
seleção usando:

Esta expressão define um retângulo em torno do ponto Fon sendo

processado, supondo que as distribuições são orientadas NS ou LO.

Sel = ‘abs(“RX”-%f)<=%f and abs(“RY”-%f)<=%f’%
(FX,MxXd,FY,MxYd)

Seleciona os Rec em um retângulo

processing.runalg(‘qgis:selectbyexpression’,‘Rec’,Sel,0)

Esta seleção está funcionando, até onde consegui testar. A minha
pergunta é: Uma vez realizada a seleção, como posso iterar sobre a
lista de Rec’s selecionados?

Se esta não for a melhor abordagem para este problema eu ficaria muito
agradecido em receber sugestões.

De antemão agradeço.

Saudações.

Roxo
P.S.- Pela escrita já devem ter percebido que sou brasileiro. :slight_smile:

---------------- Non luctari, ludare -------------------+ WYSIWYG
Fernando M. Roxo da Motta <petro@roxo.org> | Editor?
Except where explicitly stated I speak on my own behalf.| VI !!
( Usuário Linux registrado #39505 ) | I see text,
------------ Quis custodiet ipsos custodes?-------------+ I get text!

Roxo


---------------- Non luctari, ludare -------------------+ WYSIWYG
Fernando M. Roxo da Motta <petro@roxo.org> | Editor?
Except where explicitly stated I speak on my own behalf.| VI !!
( Usuário Linux registrado #39505 ) | I see text,
------------ Quis custodiet ipsos custodes?-------------+ I get text!


QGIS-pt mailing list
QGIS-pt@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/qgis-pt

Alexandre Neto

http://gisunchained.wordpress.com