QGIS API: ベクタデータの読み込み・表示

ベクタデータの読み込み・表示はマニュアルにあるコードのとおりです。
ラスタデータやPostGISデータの読み込みも基本的には同じですが、
それぞれちょっとずつ違いがあります。

以下は典型的な読み込み方法の抜粋です。
ここではレイヤーセットをメンバ変数としています。

2.x

class MainWindow(QMainWindow, Ui_MainWindow):

	layers = []

	def __init__(self):

		QMainWindow.__init__(self)

		self.setupUi(self)

		self.setWindowTitle("QGIS Application test")

		# QgsMapCanvasの作成
		self.canvas = QgsMapCanvas()

		# QgsMapCanvasの設定
		self.canvas.setCanvasColor(QColor(200,200,255))
		self.canvas.enableAntiAliasing(True)

		# 下の関数は1.0からは無い
		# self.canvas.useQImageToRender(False)
		self.canvas.show()

	def addVectorLayer(self):
		file = QFileDialog.getOpenFileName
			(self, "Open Shapefile", ".", "Shapefiles(*.shp)")
		fileInfo = QFileInfo(file)

		# ベクタレイヤーの作成
		layer = QgsVectorLayer(file, fileInfo.fileName(), "ogr")

		if not layer.isValid():
			return

		# ベクタレイヤーの表示設定
		symbols = layer.renderer().symbols()
		symbol = symbols[0]
		symbol.setFillColor(QColor.fromRgb(192,192,192))
		symbol = layer.rendererV2().symbol()
		symbol.setColor(QColor.fromRgb(192, 192, 192))

		# レジストリへレイヤを登録
		QgsMapLayerRegistry.instance().addMapLayer(layer);

		# レイヤ全体を表示
		self.canvas.setExtent(layer.extent())

		# QgsMapCanvasにレイヤセットを登録
		cl = QgsMapCanvasLayer(layer)
		self.layers.append(cl)
		self.canvas.setLayerSet(self.layers)

データの読み込みは大体上記のような手順になります。
まず、ファイル名からレイヤーを作成し、作成されたレイヤーを
QgsMapLayerRegistryに登録、
QgsMapCanvasLayerクラスにレイヤーをセットした後、
QgsMapCanvasLayerのセットに追加して、そのレイヤーセットを
QgsMapCanvasにセットという手順です。

表示順はQgsMapCanvasLayerセットの最初の要素が最前面に表示されるので、
セットの末尾に追加すると背面に追加されることになります。
セットの順番を入れ替えてQgsMapCanvas.setLayerSet()関数で再設定すれば
簡単に表示順を切り替えることができます。

QgsVectorLayer()関数の3番目の引数は”ogr”か”postgres”のどちらかを指定します。
普通のファイルならば”ogr”を指定すると、OGRがサポートするファイルであれば判別して読み込んでくれます。

3.x

  fileInfo = QFileInfo(fname)

  layer = QgsVectorLayer(fname, fileInfo.fileName(), "ogr")
  if not layer.isValid():
    return

  # QgsMapLayerRegistry -> QgsProjectに変更
  QgsProject.instance().addMapLayer(layer);

  # ベクタレイヤーの表示設定
  symbol = layer.renderer().symbol()
  symbol.setColor(QColor.fromRgb(192, 192, 192))

  # canvas.setLeyerSet -> canvas.setLayers
  self.canvas.setExtent(layer.extent())
  self.canvas.setLayers([layer])

大きな変更点としては、QgsMapCanvasLayerがなくなりました。
マップキャンバスへのレイヤ登録はQgsMapLayer派生クラスオブジェクトのリストを
そのままセットできます。

アーカイブ