8. 投影法サポート

ヒント

pyqgisコンソールを使わない場合、このページにあるコードスニペットは次のインポートが必要です:

1from qgis.core import (
2    QgsCoordinateReferenceSystem,
3    QgsCoordinateTransform,
4    QgsProject,
5    QgsPointXY,
6)

8.1. 座標参照系

座標参照系(CRS)は QgsCoordinateReferenceSystem クラスによってカプセル化されています。このクラスのインスタンスは複数の異なる方法で作ることができます:

  • CRSをIDによって指定する

    # EPSG 4326 is allocated for WGS84
    crs = QgsCoordinateReferenceSystem("EPSG:4326")
    print(crs.isValid())
    
    True
    

    QGISは以下の形式のCRS識別子をサポートしています:

    • EPSG: <code> --- EPSG機関によって割り当てられたID - createFromOgcWms() で処理されます

    • POSTGIS: <srid>---PostGISデータベースで使われるID - createFromSrid() で処理されます

    • INTERNAL: <srsid> --- QGISの内部データベースで使われるID - createFromSrsId() で処理されます

    • PROJ: <proj> - createFromProj() で処理されます

    • WKT: <wkt> - :meth:`createFromWkt() <qgis.core.QgsCoordinateReferenceSystem.createFromWkt>`で処理されます

プリフィックスが指定されない場合はWKTの定義が仮定されます。

  • CRSをwell-knownテキスト(WKT)で指定する

    1wkt = 'GEOGCS["WGS84", DATUM["WGS84", SPHEROID["WGS84", 6378137.0, 298.257223563]],' \
    2      'PRIMEM["Greenwich", 0.0], UNIT["degree",0.017453292519943295],' \
    3      'AXIS["Longitude",EAST], AXIS["Latitude",NORTH]]'
    4crs = QgsCoordinateReferenceSystem(wkt)
    5print(crs.isValid())
    
    True
    
  • 無効な CRS を作成し、create* 関数のいずれかを使用して初期化します。以下の例では、投影法を初期化するために Proj 文字列を使用しています。

    crs = QgsCoordinateReferenceSystem()
    crs.createFromProj("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
    print(crs.isValid())
    
    True
    

CRSの作成(つまりデータベースへの参照)が成功したかどうかをチェックするのが賢明です: isValid()True を返さなければなりません。

空間参照系の初期化のために、QGISは内部データベース srs.db から適切な値を検索する必要があることに注意してください。そのため、独立したアプリケーションを作成する場合は、 QgsApplication.setPrefixPath() で正しくパスを設定する必要があり、さもないとデータベースの検索に失敗します。QGIS Pythonコンソールからコマンドを実行している場合やプラグインを開発している場合は気にする必要はありません:すべてがすでに設定されています。

空間参照系の情報にアクセスする:

 1crs = QgsCoordinateReferenceSystem("EPSG:4326")
 2
 3print("QGIS CRS ID:", crs.srsid())
 4print("PostGIS SRID:", crs.postgisSrid())
 5print("Description:", crs.description())
 6print("Projection Acronym:", crs.projectionAcronym())
 7print("Ellipsoid Acronym:", crs.ellipsoidAcronym())
 8print("Proj String:", crs.toProj())
 9# check whether it's geographic or projected coordinate system
10print("Is geographic:", crs.isGeographic())
11# check type of map units in this CRS (values defined in QGis::units enum)
12print("Map units:", crs.mapUnits())

出力:

1QGIS CRS ID: 3452
2PostGIS SRID: 4326
3Description: WGS 84
4Projection Acronym: longlat
5Ellipsoid Acronym: EPSG:7030
6Proj String: +proj=longlat +datum=WGS84 +no_defs
7Is geographic: True
8Map units: 6

8.2. CRSの変換

QgsCoordinateTransform クラスを使用することで、異なる空間参照系の間で変換を行うことができます。最も簡単な使用方法は、変換元と変換先のCRSを作成し、 QgsCoordinateTransform インスタンスをそれらと現在のプロジェクトで作成することです。そして transform() 関数を繰り返し呼び出して変換を行います。デフォルトでは順変換を行いますが、逆変換も可能です。

 1crsSrc = QgsCoordinateReferenceSystem("EPSG:4326")    # WGS 84
 2crsDest = QgsCoordinateReferenceSystem("EPSG:32633")  # WGS 84 / UTM zone 33N
 3transformContext = QgsProject.instance().transformContext()
 4xform = QgsCoordinateTransform(crsSrc, crsDest, transformContext)
 5
 6# forward transformation: src -> dest
 7pt1 = xform.transform(QgsPointXY(18,5))
 8print("Transformed point:", pt1)
 9
10# inverse transformation: dest -> src
11pt2 = xform.transform(pt1, QgsCoordinateTransform.ReverseTransform)
12print("Transformed back:", pt2)

出力:

Transformed point: <QgsPointXY: POINT(832713.79873844375833869 553423.98688333143945783)>
Transformed back: <QgsPointXY: POINT(18 4.99999999999999911)>