[Gfoss] qgis: layer not valid

ciao a tutti,

sono riuscito a far partire un'applicazione standalone basata su
qgis, seguendo la guida qgis-1.6.0_coding-compilation_guide_en.pdf;

sembra tutto a posto ma quando carico un layer (che sono certo essere
corretto in quanto qGis lo legge perfettamente) questo non supera il
controllo di validità; indagando ho visto che non ha dataProvider
(None);

dove potrei cercare l'intoppo?

grazie, ciao,
giuliano

PS: se servissero, quì sono le linee coinvolte:

  ........
# Add an OGR layer to the map
  def addLayer(self):
    file = QFileDialog.getOpenFileName(self, "Open Shapefile", ".", "Shapefiles (*.shp)")
    fileInfo = QFileInfo(file)
    print "file:", file (*)
    print "fileInfo:", fileInfo (*)
    print "fileInfo.filename():", fileInfo.fileName() (*)

# Add the layer
    layer = QgsVectorLayer(file, fileInfo.fileName(), "ogr")
    print "layer:", layer (*)
    print "layer data provider:", layer.dataProvider() (*)
    print "layer validity:", layer.isValid() (*)

    if not layer.isValid():
      print "oops: the layer is not valid"
      return ++++++++ il codice si ferma qui ++++++++++++++

# Change the color of the layer to gray
    symbols = layer.renderer().symbols()
    symbol = symbols[0]
    symbol.setFillColor(QColor.fromRgb(192,192,192))

# Add layer to the registry
    QgsMapLayerRegistry.instance().addMapLayer(layer);
    .....

(*) aggiunte da me per indagare l'errore;

Ciao Giuliano,

On Monday, April 16, 2012, giuliano su Tiscali <giulianc@tiscali.it> wrote:

non supera il controllo di validità
[snip]
if not layer.isValid():
print “oops: the layer is not valid”
return ++++++++ il codice si ferma qui ++++++++++++++

i layer sono non validi perché probabilmente l’applicazione
non riesce a caricare le librerie contenenti i provider.

Purtoppo le linee che hai postato non sono utili in questo
caso. Dovresti postare le linee nelle quali fai il setup
dell’applicazione standalone.

Probabilmente basterà cambiare il path che hai passato alla
QgsApplication.setPrefix() per risolvere il problema, ma senza
ulteriori informazioni sull’OS e sulla tua installazione di QGis è
parecchio complicato.
Se sei su linux prova /usr o /usr/local.

Saluti.


Giuseppe Sucameli

On Tue, 17 Apr 2012 23:00:21 +0200
Giuseppe Sucameli <sucameli@faunalia.it> wrote:

Ciao Giuliano,

ciao (e grazie) Giuseppe :slight_smile:

On Monday, April 16, 2012, giuliano su Tiscali <giulianc@tiscali.it> wrote:
> non supera il controllo di validità
[snip]
> if not layer.isValid():
> print "oops: the layer is not valid"
> return ++++++++ il codice si ferma qui ++++++++++++++

i layer sono non validi perché probabilmente l'applicazione
non riesce a caricare le librerie contenenti i provider.

Purtoppo le linee che hai postato non sono utili in questo
caso. Dovresti postare le linee nelle quali fai il setup
dell'applicazione standalone.

Probabilmente basterà cambiare il path che hai passato alla
QgsApplication.setPrefix() per risolvere il problema, ma senza
ulteriori informazioni sull'OS e sulla tua installazione di QGis è
parecchio complicato.
Se sei su linux prova /usr o /usr/local.

sì, scusa, ma sai che è facile perdersi in un bicchiere d'acqua ....
ho la 1.9.90alpha su linuz debian wheezy;

alla tua ipotesi circa il path ci avevo pensato; qgis è installato
in /usr/share/qgis e /usr/lib/qgis; ho provato con entrambi
(qgis_prefix = '/usr/share/qgis/' e qgis_prefix = '/usr/lib/qgis/')
senza risultato, però potrebbe non essere questo il parametro
determinante; ma non so cos'altro provare dopo aver letto Martin D. in
originale e tradotto;

metto sotto l'__init__(), l'addLayer() e il main() per adesso (non
vorrei disturbare gli altri con un centinaio di linee):

Saluti.

Giuseppe Sucameli

grazie ancora, ciao,
giuliano

  def __init__(self):
    QMainWindow.__init__(self)
    self.setWindowTitle("QGIS Demo App")

# Required by Qt4 to initialize the UI
    self.setupUi(self)

# Create the map canvas
    self.canvas = QgsMapCanvas()
    self.canvas.setCanvasColor(QColor(230,230,255))
    self.canvas.enableAntiAliasing(True)
    self.canvas.useImageToRender(False)
    self.canvas.show()

# Lay our widgets out in the main window using a
# vertical box layout
    self.layout = QVBoxLayout(self.frame)
    self.layout.addWidget(self.canvas)

# Create the actions for our tools and connect each to the appropriate method
    actionQuit = QAction(QIcon(qgis_icons_prefix + "actionExit.png"), "Quit", self)

...... seguono altre actions ........

# Add an OGR layer to the map
  def addLayer(self):
    file = QFileDialog.getOpenFileName(self, "Open Shapefile", ".", "Shapefiles (*.shp)")
    fileInfo = QFileInfo(file)

# Add the layer
    layer = QgsVectorLayer(file, fileInfo.fileName(), "ogr")

    if not layer.isValid():
      print "oops: the layer is not valid"
      return

*************** non passa mai questo test *******************

# Change the color of the layer to gray
    symbols = layer.renderer().symbols()
    symbol = symbols[0]
    symbol.setFillColor(QColor.fromRgb(192,192,192))

# Add layer to the registry
    QgsMapLayerRegistry.instance().addMapLayer(layer); # usare addMapLayers(layer_list)
# QgsMapLayerRegistry.addMapLayer(layer);

# Set extent to the extent of our layer
    self.canvas.setExtent(layer.extent())

# Set up the map canvas layer set
    cl = QgsMapCanvasLayer(layer)
    layers = [cl]
    self.canvas.setLayerSet(layers)

def main(argv):
# create Qt application
  app = QApplication(argv)

# Initialize qgis libraries
  QgsApplication.setPrefixPath(qgis_prefix, True)
  QgsApplication.initQgis()

# create main window
  wnd = MainWindow()
# Move the app window to upper left
  wnd.move(100,100)
  wnd.show()

# --- per vedere le librerie usate di default -------
# ---- quelle di QT --------------------------------
# for tmp in app.instance().libraryPaths():
# print tmp
# ---- restituisce: -----------------------------
# /usr/lib/qt4/plugins
# /usr/bin

# ---- quelle di qGis: -----------------------------
# for tmp in QgsApplication.instance().libraryPaths():
# print tmp
# ---- restituisce le stesse: ----------------------
# /usr/lib/qt4/plugins
# /usr/bin

# run!
  retval = app.exec_()

# exit
  QgsApplication.exitQgis()
  sys.exit(retval)

if __name__ == "__main__":
  main(sys.argv)

Ciao,

2012/4/17 giuliano su Tiscali <giulianc@tiscali.it>:

On Tue, 17 Apr 2012 23:00:21 +0200
alla tua ipotesi circa il path ci avevo pensato; qgis è installato
in /usr/share/qgis e /usr/lib/qgis; ho provato con entrambi
(qgis_prefix = '/usr/share/qgis/' e qgis_prefix = '/usr/lib/qgis/')

ho trovato un metodo piu' semplice del tirare ad indovinare:

imposta il valore di qgis_prefix allo stesso path che viene restituito
chiamando dalla python console di QGis il seguente comando:

QgsApplication.prefixPath()

il cui risultato probabilmente sara'

/usr

Saluti.

--
Giuseppe Sucameli

chiedo scusa Giuseppe: nella fretta non mi sono accorto
dell'indirizzo :frowning: scusa ancora;

On Wed, 18 Apr 2012 00:08:19 +0200
Giuseppe Sucameli <sucameli@faunalia.it> wrote:

Ciao,

2012/4/17 giuliano su Tiscali <giulianc@tiscali.it>:
> On Tue, 17 Apr 2012 23:00:21 +0200
> alla tua ipotesi circa il path ci avevo pensato; qgis è installato
> in /usr/share/qgis e /usr/lib/qgis; ho provato con entrambi
> (qgis_prefix = '/usr/share/qgis/' e qgis_prefix = '/usr/lib/qgis/')

ho trovato un metodo piu' semplice del tirare ad indovinare:

imposta il valore di qgis_prefix allo stesso path che viene restituito
chiamando dalla python console di QGis il seguente comando:

QgsApplication.prefixPath()

il cui risultato probabilmente sara'

/usr

accidenti, nemmeno Nembo Kid così rapido e preciso: sì: con quel
comando si ottiene '/usr' (nella mia situazione) e con questo il test
sul file viene superato (purtroppo non visualizzo ancora nulla, ma
intanto ho fatto un altro passo avanti);

non sarebbe il caso di tenere traccia della cosa, o aggiungendola al
lavoro di Pasquale o mettendolo nel wiki ? (un pò di fatica risparmiata
per gli altri newbies.... o sono il solo :slight_smile:

Saluti.

--
Giuseppe Sucameli

grazie ancora, ciao,
giuliano