レイヤのロード

データのレイヤをオープンしましょう.QGISはベクタとラスタレイヤを認識できます.加えてカスタムレイヤタイプを利用することもできますが,それについてここでは述べません.

ベクタレイヤ

ベクタレイヤをロードするためにはレイヤのデータソース識別子を指定してください,それはレイヤの名前とプロバイダの名前です:

layer = QgsVectorLayer(data_source, layer_name, provider_name)
if not layer.isValid():
  print "Layer failed to load!"

データソース識別子は文字列でそれぞれのデータプロバイダを表します.レイヤ名はレイヤリストウィジェットで使われます.レイヤが正常にロードされたかどうかをチェックすることは重要です.正しくロードされていない場合は不正なレイヤインスタンスが返ります.

以下のリストはベクタデータプロバイダを使って様々なデータソースにアクセスする方法が記述されています.

  • OGRライブラリ(shapefilesと多くの他の形式)—データソースはファイルパスです

    vlayer = QgsVectorLayer("/path/to/shapefile/file.shp", \
      "layer_name_you_like", "ogr")
    
  • PostGISデータベース — データソースはPostgreSQLデータベースへの接続を作るために必要な文字列です.この文字列を使って:class:QgsDataSourceURI クラスを作ることができます.ただしQGISがPostgresサポートつきでコンパイルされていないと利用できません.:

    uri = QgsDataSourceURI()
    # set host name, port, database name, username and password
    uri.setConnection("localhost", "5432", "dbname", "johny", "xxx")
    # set database schema, table name, geometry column and optionaly
    # subset (WHERE clause)
    uri.setDataSource("public", "roads", "the_geom", "cityid = 2643")
    
    vlayer = QgsVectorLayer(uri.uri(), "layer_name_you_like", "postgres")
    
  • CSVまたは他のデリミテッドテキストファイル – 区切り文字としてセミコロン,x座標フィールドが “x” でy座標フィールドが “y”のファイルを開く手順はこのとおりです:

    uri = "/some/path/file.csv?delimiter=%s&xField=%s&yField=%s" % (";", "x", "y")
    vlayer = QgsVectorLayer(uri, "layer_name_you_like", "delimitedtext")
    

    注:QGISバージョン1.7からプロバイダの文字列はURL形式になりました,ですからパスは file:// という記述になります.またジオメトリの記述に”x”と”y”のフィールドの他にWKT(well known text)形式も利用できるようになりました,さらに空間参照系も指定できるようになりました.例は次のとおりです:

    uri = "file:///some/path/file.csv?delimiter=%s&crs=epsg:4723&wktField=%s" \
      % (";", "shape")
    
  • GPX files — “gpx” データプロバイダを使うとgpxファイルからtracks,routes, waypointsを読み出すことができます. ファイルを開く場合Tタイプ(track/route/waypoint) の指定がurlの一部として必要です:

    uri = "path/to/gpx/file.gpx?type=track"
    vlayer = QgsVectorLayer(uri, "layer_name_you_like", "gpx")
    
  • SpatiaLite データベース — QGIS v1.1以降サポートされています. SPostGIS データベースと同じように, QgsDataSourceURI を使ってデータソース識別子を作成できます

    uri = QgsDataSourceURI()
    uri.setDatabase('/home/martin/test-2.3.sqlite')
    schema = ''
    table = 'Towns'
    geom_column = 'Geometry'
    uri.setDataSource(schema, table, geom_colum)
    
    display_name = 'Towns'
    vlayer = QgsVectorLayer(uri.uri(), display_name, 'spatialite')
    
  • MySQL OGR経由でアクセスするWKB-を使ったジオメトリ — データソースはテーブルに対する接続文字列

    uri = "MySQL:dbname,host=localhost,port=3306,user=root,password=xxx|\
      layername=my_table"
    vlayer = QgsVectorLayer( uri, "my_table", "ogr" )
    
  • WFS コネクション:. コネクションは URI で定義され、 WFS プロバイダを使います:

    uri = "http://localhost:8080/geoserver/wfs?srsname=EPSG:23030&typename=\
      union&version=1.0.0&request=GetFeature&service=WFS",
    vlayer = QgsVectorLayer("my_wfs_layer", "WFS")
    

    URI は urllib という標準ライブラリを使って作成することもできます。

    params = {
        'service': 'WFS',
        'version': '1.0.0',
        'request': 'GetFeature',
        'typename': 'union',
        'srsname': "EPSG:23030"
    }
    uri = 'http://localhost:8080/geoserver/wfs?' + \
      urllib.unquote(urllib.urlencode(params))
    

    別のものも使うことができます

ラスタレイヤ

ラスタファイルのアクセスにはGDALライブラリが使われています.このライブラリは幅広い形式をサポートしています.なにかのファイルのオープンにトラブルがある場合はGDALがサポートしている形式をチェックしてください(デフォルトですべての形式がサポートされているわけではありません).ラスタをファイルからロードする場合ファイル名とベース名を指定して下さい:

fileName = "/path/to/raster/file.tif"
fileInfo = QFileInfo(fileName)
baseName = fileInfo.baseName()
rlayer = QgsRasterLayer(fileName, baseName)
if not rlayer.isValid():
  print "Layer failed to load!"

ラスタレイヤは WCS サービスから作ることもできます。

layer_name = 'elevation'
uri = QgsDataSourceURI()
uri.setParam ('url', 'http://localhost:8080/geoserver/wcs')
uri.setParam ( "identifier", layer_name)
rlayer = QgsRasterLayer(uri, 'my_wcs_layer', 'wcs')

それとは別にWMSサーバからラスタをロードできます.現状ではGetCapabilitiesレスポンスをAPIから取得できません—どのレイヤが必要かはあなたが知らなければいけません:

urlWithParams = 'url=http://wms.jpl.nasa.gov/wms.cgi&layers=global_mosaic&\
  styles=pseudo&format=image/jpeg&crs=EPSG:4326'
rlayer = QgsRasterLayer(urlWithParams, 'some layer name', 'wms')
if not rlayer.isValid():
  print "Layer failed to load!"

マップレイヤレジストリ

もしあなたが開かれているレイヤを描画に利用したい場合はそれらをマップレイヤレジストリに追加することを忘れないで下さい.マップレイヤレジストリはレイヤのオーナーシップを取得して後でアプリケーションのいろいろな場所でユニークIDを使ってアクセスできるようになります.レイヤがマップレイヤレジストリから削除された削除された時にそれも削除されます.

レイヤをレジストリに追加する:

QgsMapLayerRegistry.instance().addMapLayer(layer)

終了時にレイヤは廃棄されます,もしあなたがレイヤを明示的に削除したい場合は利用しましょう:

QgsMapLayerRegistry.instance().removeMapLayer(layer_id)
TODO:

マップレイヤレジストリのさらに詳細な情報が必要ですか?