Пытаюсь переделать его, чтобы работало с использованием PyQt5.
Функция, добавляющая слой выглядит так:
Код: Выделить всё
def addLayer(self):
# Слой должен быть в той же папке, что и файл приложения
# Имя слоя задано в коде
# Создать слой
layer = QgsVectorLayer('test.shp', 'test', 'ogr')
if not layer.isValid():
print("Layer failed to load!")
else:
# Добавить слой в реестр
QgsProject.instance().addMapLayer(layer)
# Установить охват карты равным охвату слоя
self.canvas.setExtent(layer.extent())
# Вывод имени и типа данных
for field in layer.fields():
print(field.name(), field.typeName())
Код: Выделить всё
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtWidgets import QApplication, QFrame, QGridLayout, QMainWindow, QVBoxLayout
from PyQt5.QtGui import QPainter, QColor, QFont
from PyQt5.QtCore import pyqtSignal
from qgis.gui import QgsMapCanvas, QgsMapToolPan, QgsMapToolZoom
from qgis.core import QgsApplication, QgsVectorLayer, QgsProject, QgsMarkerSymbol
import sys,os
# Импорт созданного интерфейса
from mainwindow_ui import Ui_MainWindow
app = QApplication([])
qgs = QgsApplication([], False)
qgs.setPrefixPath("C:/OSGeo4W64/apps/qgis", True)
qgs.initQgis()
class MainWindow(QMainWindow, Ui_MainWindow):
triggered = pyqtSignal()
def __init__( self ):
QMainWindow.__init__( self )
self.setupUi( self )
# Устанавливаем заголовок окна
self.setWindowTitle('QGIS Demo')
# Создаем карту
self.canvas = QgsMapCanvas()
# Задаем цвет фона карты
self.canvas.setCanvasColor(QColor( 200, 200, 255 ))
self.canvas.enableAntiAliasing(True)
self.canvas.show()
# Размещаем виджеты в окне
self.layout = QVBoxLayout(self.frame)
self.layout.addWidget(self.canvas)
# Задаем действия для каждого из инструментов и соединяем их с соответствующими методами
self.actionAdd_Layer.triggered.connect(self.addLayer)
self.actionZoom_In.triggered.connect(self.zoomIn)
self.actionZoom_Out.triggered.connect(self.zoomOut)
self.actionPan.triggered.connect(self.pan)
self.actionZoom_Full.triggered.connect(self.zoomFull)
# Создаем панель инструментов
self.toolbar = self.addToolBar("Map")
# Добавляем действия на панель инструментов
self.toolbar.addAction(self.actionAdd_Layer);
self.toolbar.addAction(self.actionZoom_In);
self.toolbar.addAction(self.actionZoom_Out);
self.toolbar.addAction(self.actionPan);
self.toolbar.addAction(self.actionZoom_Full);
# Создаем инструменты карты
self.toolPan = QgsMapToolPan(self.canvas)
self.toolPan.setAction(self.actionPan)
self.toolZoomIn = QgsMapToolZoom(self.canvas, False) # false = уменьшить
self.toolZoomIn.setAction(self.actionZoom_In)
self.toolZoomOut = QgsMapToolZoom(self.canvas, True) # true = увеличить
self.toolZoomOut.setAction(self.actionZoom_Out)
# Установить инструмент увеличения
def zoomIn( self ):
self.canvas.setMapTool(self.toolZoomIn)
# Установить инструмент уменьшения
def zoomOut( self ):
self.canvas.setMapTool(self.toolZoomOut)
# Установить инструмент для перемещения
def pan( self ):
self.canvas.setMapTool(self.toolPan)
# Установить инструмент показа карты полностью
def zoomFull( self ):
self.canvas.zoomToFullExtent()
# Добавить OGR-слой
def addLayer(self):
# Слой должен быть в той же папке, что и файл приложения
# Имя слоя задано в коде
# Создать слой
layer = QgsVectorLayer('test.shp', 'test', 'ogr')
if not layer.isValid():
print("Layer failed to load!")
else:
# Добавить слой в реестр
QgsProject.instance().addMapLayer(layer)
# Установить охват карты равным охвату слоя
self.canvas.setExtent(layer.extent())
for field in layer.fields():
print(field.name(), field.typeName())
def main(app):
# Создание приложения
wnd = MainWindow()
wnd.show()
app.exec()
if __name__ == "__main__":
main(app)