Работа с проектными файлами .qgs в PyQGis

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Работа с проектными файлами .qgs в PyQGis

Сообщение Voltron » 17 апр 2012, 20:20

У вас карта не слушает сигнал и не обновляет набор слоёв. В __init__ добавьте строку

Код: Выделить всё

self.connect( QgsProject.instance(), QtCore.SIGNAL( "readProject( const QDomDocument & )" ), self.projectLoaded )
И собственно реализация этого слота

Код: Выделить всё

def projectLoaded( self, doc ):
  self.canvas.readProject( doc )
  layers = []
  for k, v in QgsMapLayerRegistry.instance().mapLayers().iteritems():
    layers.append( QgsMapCanvasLayer( v ) )
  self.canvas.setLayerSet( layers )

Togran
Новоприбывший
Сообщения: 11
Зарегистрирован: 10 апр 2012, 13:26
Репутация: 0

Re: Работа с проектными файлами .qgs в PyQGis

Сообщение Togran » 18 апр 2012, 15:44

Спасибо! Это то, что нужно. Все слои отобразились корректно. Единственное, что меня смущает - почему координаты отображаются как-то странно... Там откуда-то шестизначные цифры в градусах. По идее такого быть не должно. С чем это может быть связано? Кривой проектный файл?
И еще один момент. Во время открытия проекта в консоль вываливается куча ошибок преобразования кодировки типа [OGR] Error Recoding 65003 UTF-8 и дальше иероглифы. Я так понимаю, что где-то в проектном файле прописана кодировка и необходимо ее определить. Если я прав, то подскажите пожалуйста где мне нужно эту кодировку определить? В параметрах канвы, в параметрах слоев или еще где-то?

Ну и последний вопрос. Я прикрутил к программе (код вы уже видели) еще один модуль, для того чтобы можно было отключать ненужные слои. И он вроде работает корректно, но опять-таки после accept() на конве ничего не меняется... Я передаю в этот модуль экземпляр QgsProject.instance() и с ним работаю внутри модуля. В чем моя ошибка? Код модуля ниже:
(Не ругайте сильно за полнейший бред в коде. Плясал с бубном весь день и исходную красоту сохранить забыл :)))

Код: Выделить всё

# -*- coding: utf-8 -*-

from PyQt4 import QtGui,QtCore, QtXml
from PyQt4.QtGui import QTableWidgetItem

from qgis.core import *

from layerchooser_ui import Ui_Layers

class ReadProject(QtGui.QDialog, Ui_Layers):
    def __init__(self, filePath, project):
        QtGui.QDialog.__init__(self)
        self.filePath = filePath
        self.project = QgsProject.instance()
        project = self.project
        self.setupUi(self)

    def populateTable(self):
        ui = self
        table = ui.tableWidget
#        table.clear()
        table.setRowCount(0)
        xml = file(self.filePath).read()
        d = QtXml.QDomDocument()
        d.setContent(xml)
        maps = d.elementsByTagName("maplayer")
        self.maps=maps

        for i in range(maps.length()):
            table.setRowCount(table.rowCount()+1)
            info = getMapInfo(maps.item(i))
            nameItem = QTableWidgetItem(info['name'])
            nameItem.setFlags(QtCore.Qt.ItemIsUserCheckable|QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
            nameItem.setCheckState(QtCore.Qt.Unchecked)
            nameItem.setData(QtCore.Qt.UserRole,str(i))
            table.setItem(i,0,nameItem)
            table.setItem(i,1,FixedWidgetItem(info['mtype']))
            table.setItem(i,2,FixedWidgetItem(info['geom']))
            table.setItem(i,3,FixedWidgetItem(info['provider']))
            ds = FixedWidgetItem(info['ds'])
            ds.setData(QtCore.Qt.ToolTipRole,info['ds'])
            table.setItem(i,4,ds)

    def accept(self):
        here = QtCore.QDir.currentPath()
        QtCore.QDir.setCurrent(str(QtCore.QFileInfo(self.filePath).absoluteDir().canonicalPath()))
        for row in range(self.tableWidget.rowCount()):
            if self.tableWidget.item(row,0).checkState():
                index = self.tableWidget.item(row,0).data(QtCore.Qt.UserRole).toInt()[0] 
                self.project.read(self.maps.item(index))
        QtCore.QDir.setCurrent(here)
        super(ReadProject,self).accept()
        pass


class FixedWidgetItem(QTableWidgetItem):
    def __init__(self,label):
        super(FixedWidgetItem,self).__init__(label)
        self.setFlags(QtCore.Qt.ItemIsEnabled|QtCore.Qt.ItemIsSelectable)

def getMapInfo(mapDom):
    name = mapDom.namedItem("layername").firstChild().toText().data()
    ds = mapDom.namedItem("datasource").firstChild().toText().data()
    provider = mapDom.namedItem("provider").firstChild().toText().data()
    mtype = mapDom.attributes().namedItem("type").firstChild().toText().data()
    if mtype == "vector":
        geom = mapDom.attributes().namedItem("geometry").firstChild().toText().data()
    elif mtype == "raster":
        geom = mapDom.namedItem("rasterproperties").namedItem("mDrawingStyle").firstChild().toText().data()
        if provider == "":
            provider = "gdal?"
    else:
        print "Unknown mtype: %s " % mtype
    return {'name':name, 'ds':ds, 'mtype':mtype, 'geom':geom, 'provider':provider}


Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Работа с проектными файлами .qgs в PyQGis

Сообщение Voltron » 18 апр 2012, 16:00

Togran писал(а):Спасибо! Это то, что нужно. Все слои отобразились корректно. Единственное, что меня смущает - почему координаты отображаются как-то странно... Там откуда-то шестизначные цифры в градусах. По идее такого быть не должно. С чем это может быть связано? Кривой проектный файл?
Возможно, данные у вас не в DD, а спроецированы. Либо включено перепроецирование «на лету»
Togran писал(а):И еще один момент. Во время открытия проекта в консоль вываливается куча ошибок преобразования кодировки типа [OGR] Error Recoding 65003 UTF-8 и дальше иероглифы. Я так понимаю, что где-то в проектном файле прописана кодировка и необходимо ее определить. Если я прав, то подскажите пожалуйста где мне нужно эту кодировку определить? В параметрах канвы, в параметрах слоев или еще где-то?
Мои скромные способности телепата говоря, что используется GDAL >=1.9.0. В таком случае вы не правы, проектный файл тут не причем. Вам сюда и сюда

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Работа с проектными файлами .qgs в PyQGis

Сообщение Voltron » 18 апр 2012, 17:52

Togran писал(а):Ну и последний вопрос. Я прикрутил к программе (код вы уже видели) еще один модуль, для того чтобы можно было отключать ненужные слои. И он вроде работает корректно, но опять-таки после accept() на конве ничего не меняется... Я передаю в этот модуль экземпляр QgsProject.instance() и с ним работаю внутри модуля. В чем моя ошибка?
Вы там что-то страшное делаете. Не знаю какая у вас задача, но решение (на мой взгляд) вы выбрали неправильное. Файлы проекта не используются для управления видимостью слоёв или для чего-то еще, это всего лишь способ быстро восстановить рабочее окружение (слои и их оформление, СК, цвет фона и т.д.). Не стоит использовать его для каких-то других целей. Во-первых, это неправильно. Во-вторых — вы только усложните себе жизнь.

Для управления видимостью лучше использовать специально предназначенные для этого классы QgsMapLayerRegistry, QgsMapCanvasLayer и другие. Более того, существует готовая к использованию реализация списка слоёв для приложений PyQGIS (статья).

Что касается вашего кода. В accept вы только заново считываете описания слоёв из проекта (при том, что они уже были загружены при открытии проекта. Т.е. это абсолютно бесполезная операция), но не меняете видимость слоя и не обновляете набор слоёв карты.

Togran
Новоприбывший
Сообщения: 11
Зарегистрирован: 10 апр 2012, 13:26
Репутация: 0

Re: Работа с проектными файлами .qgs в PyQGis

Сообщение Togran » 03 май 2012, 11:47

Доброго времени суток! Был вынужденный перерыв в работе... Несколько вопросов:
Voltron писал(а): Возможно, данные у вас не в DD, а спроецированы. Либо включено перепроецирование «на лету»
К сожалению не совсем понимаю, что значит DD и как с ним бороться? Можете подробнее описать, или ссылку, где почитать об этом таинственном DD?
Насчет перепроецирования "на лету". Это свойство какого-то класса? Если да, то какого, ибо я ничего похожего не нашел ни в QgsProject, ни в QgsMapCanvas?

И еще вопрос:
- как можно ускорить загрузку векторных слоев в PyQGis? Карта России (контур boundary-polygon формата shp) в один слой загружается порядка 3 - 5 минут с отключенным Antialysing (с включенным почему-то дольше). Компьютер у меня конечно не Core i7 но и не самый старый (2Гб оперативки и двух-башковый Pentium-D)

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Работа с проектными файлами .qgs в PyQGis

Сообщение Denis Rykov » 03 май 2012, 12:35

DD - ни что иное как Decimal Degrees
Spatial is now, more than ever, just another column- The Geometry Column.

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Работа с проектными файлами .qgs в PyQGis

Сообщение Voltron » 03 май 2012, 14:13

Togran писал(а):Насчет перепроецирования "на лету". Это свойство какого-то класса?
Это настройка. Если она активирована, то QGIS выполняет преобразование координат слоя в систему координат проекта. Если нет — каждый слой отображается с использованием своих координат
Togran писал(а):как можно ускорить загрузку векторных слоев в PyQGis?
Скорость отрисовки не зависит от того как вы загружаете слой: в QGIS или в своем собственном приложении. И волшебной кнопки «Сделать мне зашибись» нет.

На скорость отрисовки влияет использование сглаживания (вы его уже отключили), число объектов и узлов в ваших файлах, а также используемые стили отображения. Если не критична точность данных — можно упростить (генерализовать) слои и пользоваться упрощенными слоями. По возможности используйте простые стили.

Можете попробовать конвертировать данные в SpatiaLite, это несколько ускорит работу. Еще один вариант — нарезать большой слой на несколько меньших и работать с ними.

Togran
Новоприбывший
Сообщения: 11
Зарегистрирован: 10 апр 2012, 13:26
Репутация: 0

Re: Работа с проектными файлами .qgs в PyQGis

Сообщение Togran » 04 май 2012, 09:15

Вообще говоря, сам QGis при открытии этого же проекта рисует в координатах примерно такие цифры:
12345678.12, 14523676.34. Естественно, преобразование координат идет неправильно. Сам проект, это ни что иное, как карта России, скачанная уже и не вспомню откуда (если вспомню - кину ссылку. По-моему даже с сайта КБ "Панорама"). Как это можно исправить и в какую сторону мне копать? Может отредактировать проект в QGis? Есть там такие возможности? Может система координат левая?
Voltron писал(а):Это настройка. Если она активирована, то QGIS выполняет преобразование координат слоя в систему координат проекта. Если нет — каждый слой отображается с использованием своих координат
Я могу как-то поэкспериментировать с этой настройкой в коде программы?
Voltron писал(а):На скорость отрисовки влияет использование сглаживания (вы его уже отключили), число объектов и узлов в ваших файлах, а также используемые стили отображения. Если не критична точность данных — можно упростить (генерализовать) слои и пользоваться упрощенными слоями. По возможности используйте простые стили.
Чертовски хороший совет! Спасибо! У меня на карте как раз много (даже слишком) узлов. Узлы, если не ошибаюсь, - это пересечения двух и более линий на карте... Попробую отображать границы более крупных регионов...

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Работа с проектными файлами .qgs в PyQGis

Сообщение Voltron » 04 май 2012, 15:36

Togran писал(а):Как это можно исправить и в какую сторону мне копать?
В сторону систем координат. Узнайте в какой СК у вас данные, задайте соответствующую СК проекту, при необходимости используйте перепроецирование «на лету»
Togran писал(а):Я могу как-то поэкспериментировать с этой настройкой в коде программы?
С ней не нужно экспериментировать, ее надо применять по необходимости. И, разумеется, включать/выключать OTFR можно и программно.

Ответить

Вернуться в «QGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя