Re: [QGIS-it-user] pyQgis: come verificare una gemetria id=X nel corso di un ciclo?

2016-11-06 Thread Luca Mandolesi
Ciao Marco.
per ora devo solo mandare fuori l'id delle 2 geometrie e la verifica della
presenza di intersezione. Dal cookbook si arriva bene qua:

iter = vlayer.getFeatures()

Faccio un loop sulle singole geometrie e se becco il rapporto copre
 ricavare da iter la feature id=x senza fare un loop.

Tipo con una chiamata:
#singFeat = vlayer.featureAtId(1)

Ma mi dice che vlayer non ha featureAtId come metodo
E' possibile?

Grazie
Luca

#
Dilungandosi nei particolari

Il loop è eseguito su un tabella view che fonde la tabella spaziale con la
tabella alfanumerica.

Quindi se nel campo rapporto c'è scritto 1 copre 2, devo chiamare le
geometrie di 1 e 2 e fare un verifica l'intersezione.

Facendo un loop sulla view accedo al campo rapporti, quando si verifica la
condizione "copre" (e fin qui ci sono come script python) allora nel loop
dal provider devo ricavare la geometria ed è qui che non capisco come
accedere dal provider al dato geometry.

uri = QgsDataSourceURI()
uri.setDatabase('C:\\Users\\Luca\\pyarchinit_DB_folder\\pyarchinit_db.sqlite')
uri.setDataSource('','pyarchinit_us_view', 'the_geom')

provider = vlayer.dataProvider()
iter = vlayer.getFeatures()

vlayer = QgsVectorLayer(uri.uri(), 'pyarchinit_us_view', 'spatialite')

for feature in iter:
for sing_us in feature[31]: #il 31 è il campo che contiene il
rapporto in formato lista ['copre', '2']
#a questo punto avrei bisogno di dire
a = feature
b = iter.(cerca la feature id=2).feature() #<- qui c'è il punto
in cui non riesco a recuperare la geometria della feature senza fare un iter
return sing_us, a.geometry().intersects(b.geometry())


Alla fine otterrei un valore di rapporto copre e un false o true per
l'intersezione che andrò a gestire in una tabella esterna dove visualizzo
il rapporto alfanumerico richiesto e farò apparire le 2 geometrie in ballo.
Sarà poi l'utente a decidere se è il disegno sbagliato oppure il dato
alfanumerico inserito ad essere errato.





Il giorno 5 novembre 2016 17:11, Marco Grisolia 
ha scritto:

> Ciao,
> non ho capito se vuoi sapere soltanto quali siano le features che si
> intersecano tra loro (ad es. una lista) oppure se devi fare un ulteriore
> controllo su di esse una volta verificata l'intersezione (ad esempio: se la
> feature "a" interseca altre 3 features all'interno del layer, verificare
> che a["id_us"] sia pari a 3).
> A prescindere dall'obiettivo, vuoi solo stampare qualcosa o modificare gli
> attributi?
> Marco
>
> Il giorno 5 novembre 2016 09:53, Luca Mandolesi  ha
> scritto:
>
>> Scusate, partito l'invio, il print di prima era un errore.
>>
>> Io pensavo ad una cosa tipo [0], ma ricevo poi errore perchè a e b non
>> accedono a geometry:
>>
>> [0]
>> request = QgsFeatureRequest().setFilterExpression( '"id_us" = 2' )
>> a = vlayer.getFeatures( request )
>> request = QgsFeatureRequest().setFilterExpression( '"id_us" = 3' )
>> b = vlayer.getFeatures( request )
>>
>> a.geometry().intersects(b.geometry())
>>
>> Grazie per i suggerimenti.
>> Luca
>>
>> ___
>> QGIS-it-user mailing list
>> QGIS-it-user@lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/qgis-it-user
>>
>>
>
___
QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/qgis-it-user


Re: [QGIS-it-user] pyQgis: come verificare una gemetria id=X nel corso di un ciclo?

2016-11-06 Thread Giuliano Curti
On 11/6/16, Luca Mandolesi  wrote:
> Ciao Marco.

ciao Luca,


> per ora devo solo mandare fuori l'id delle 2 geometrie e la verifica della
> presenza di intersezione. Dal cookbook si arriva bene qua:
> ...

credo tu abbia due possibilità: o confronti le geometrie e quando
trovi intersezioni verifichi la bontà dell'attributo interessato o,
come mi sembrava indicasse il codice che avevi postato, prendi le
feature con attributo positivo e verifichi l'effettiva intersezione;
non so se ho capito bene fino a questo punto, ma confesso di non aver
capito il tuo problema da quì in avanti:

ciao,
giuliano
___
QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/qgis-it-user


Re: [QGIS-it-user] pyQgis: come verificare una gemetria id=X nel corso di un ciclo?

2016-11-06 Thread Luca Mandolesi
Il giorno 6 novembre 2016 13:33, Giuliano Curti  ha
scritto:

> On 11/6/16, Luca Mandolesi  wrote:
> > Ciao Marco.
> il tuo problema da quì in avanti:
>

Ciao Giuliano,
il mio unico problema è:

mentre sono in un ciclo for e analizzo il campo di un record, come faccio a
chiamare un altro record e caricarne la geometria. La parte del perchè devo
farlo è inerente all'archeologia e non è importante [0].

In pseudo codice:

per ogni feature in tutte le features:
  se il feature.campo == "controlla":
id_altra_feature = feature.campo_con_id_da_verificare
altra_geometria =  features.ricava_record(id_altra_feature) <-
questo è il passaggio che non riesco a ricavare
return feature.geometria.interseca(altra_geometria.geometria)

Ciao
Luca

[0]
Per approfondire ma non necessario:
- nella tabella alfanumerica sono indicati i rapporti tra i record dentro
ad una lista di liste id=1, campo = [[copre, 2], [copre, 3], [coperto da,
4], [...]]

- devo verificare solo certi rapporti

- non posso sapere a priori se è buono il disegno oppure l'attributo
inserito (il data entry crea errori senza possibilità di verifica runtime)

- ad un record alfanumerico corrispondono molte geometrie

Quindi quello che si vuole ottenere, come per il plugin di verifica della
topologia è un bel listato con il tipo di rapporto e l'assenza di
corrispondenza da un punto di vista topografico...ma per fare questo ho
tutto l'occorrente.
___
QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/qgis-it-user


Re: [QGIS-it-user] pyQgis: come verificare una gemetria id=X nel corso di un ciclo?

2016-11-06 Thread Giuliano Curti
On 11/6/16, Luca Mandolesi  wrote:
> Il giorno 6 novembre 2016 13:33, Giuliano Curti  ha
> scritto:
>
>> On 11/6/16, Luca Mandolesi  wrote:
>
> mentre sono in un ciclo for e analizzo il campo di un record, come faccio a
> chiamare un altro record e caricarne la geometria.

rimango sempre nel dubbio di aver capito bene :-) questo spezzone di
codice cmq ti dà le due feature f1 e f2, le rispettive geometrie, le
confronta (scartando ovviamente il controllo
con sè stessa) e puoi accedere ad ogni altro loro attributo;

for f1 in layer.getFeatures():
..
for f2 in layer.getFeatures():

if f2.id() <> f1.id():
.
if f1.geometry().intersects(f2.geometry()):
(controllo se l'attributo delle due 
feature è corretto)
...

NB: per il tuo caso forse è ridondante perchè confronta A con B e B
con A, mentre a te potrebbe bastare confrontare A con B, ad es.
modificando il test in
if f2.id() > f1.id():
o qualche modo migliore che sapranno indicarti altri;

> Ciao
> Luca

ciao,
giuliano
___
QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/qgis-it-user