QGIS API: 空間参照、座標変換

データを扱う上で避けて通れない空間参照と、それに関連する座標変換について説明します。

取得、設定

まず、レイヤーの空間参照定義を取得する場合は以下のようにします。

  # レイヤーのCRSを取得
  crs = layer.crs()
  
  # 取得したあとは以下の様ないろいろな方法で確認できる
  crs.authid()
  crs.epsg()
  crs.description()
  crs.toProj4()
  
  # キャンバスのCRSを取得
  canvascrs = canvas.mapRenderer().destinationSrs()

  # レイヤーのCRSを設定
  layer.setCrs(QgsCoordinateReferenceSystem(2451, QgsCoordinateReferenceSystem.EpsgCrsId))

  # v1.8ならこれもアリ
  crs = QgsCoordinateReferenceSystem()
  crs.createFromEpsg(systemNo)
  layer.setCrs(crs)
  
  # キャンバスのCRSを設定
  canvas.mapRenderer().setDestinationSrs(
     QgsCoordinateReferenceSystem(4612,QgsCoordinateReferenceSystem.EpsgCrsId))
  
  # CRS選択ダイアログを使用する場合
  dlg = QgsGenericProjectionSelector(mainwindow)
  if dlg.exec_() == True:
    layer.setCrs(QgsCoordinateReferenceSystem(dlg.selectedEpsg(), 
      QgsCoordinateReferenceSystem.EpsgCrsId))

v2.0系のAPIリファレンスを見ると、EPSGかWKT、Proj4Stringの使用が推奨されています。
といいつつcreateFromEpsg()関数が無くなっているので注意が必要です。

CRS選択GUIは、QgsProjectionSelectorクラスもあります。
こちらはウィジェットで、自作のダイアログに埋め込んで使用したりするようです。

座標変換

2つの座標系の間で図形の座標変換を行う場合は以下のようにします。

  # 座標変換クラスを作成
  trans = QgsCoordinateTransform(srcCrs, dstCrs)

  # 矩形を順変換
  dstRect = trans.transform(srcRect)
  
  # 点を逆変換
  dstPnt = trans.transform(QgsPoint(x, y), QgsCoordinateTransform.ReverseTransform)

オンザフライの状態を確認・設定するには

キャンバスのオンザフライが有効になっているかどうかを調べたり、
有効・無効を切り替えたりするには以下のようにします。

  # On/Offの取得
  canvas.mapRenderer().hasCrsTransformEnabled()
  
  # オンザフライを有効にする場合
  canvas.mapRenderer().setProjectionsEnabled(True)
アーカイブ