레이어 불러오기

데이터를 담고 있는 레이어를 열어봅시다. QGIS는 벡터 및 래스터 레이어를 인식합니다. 추가적으로 사용자 정의 레이어도 이용할 수 있지만, 이 문서에서는 사용자 정의 레이어를 다루지 않습니다.

벡터 레이어

To load a vector layer, specify layer’s data source identifier, name for the layer and provider’s name:

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

data_source 식별자는 문자열로 각 벡터 데이터 제공자에 지정되어 있습니다. layer_name은 레이어 목록 위젯에서 사용합니다. 레이어를 성공적으로 불러왔는지 확인하는 일이 중요합니다. 성공적이 아니라면, 유효하지 않은 레이어 인스턴스가 반환됩니다.

QGIS에서 벡터 레이어를 가장 빨리 불러와서 표출하는 방법은 QgisInterface 클래스의 addVectorLayer() 함수입니다.

layer = iface.addVectorLayer("/path/to/shapefile/file.shp", "layer_name_you_like", "ogr")
if not layer:
  print "Layer failed to load!"

이 함수는 단 한 번에 새 레이어를 생성해서 맵 레이어 레지스트리에 추가(레이어 목록에 새 레이어를 표출)합니다. 이 함수는 레이어 인스턴스를 반환하거나, 레이어를 불러올 수 없을 경우 None 을 반환합니다.

다음 목록은 벡터 데이터 제공자를 통해 여러 데이터 소스에 접근하는 방법을 보여줍니다.

  • OGR library (shapefiles and many other file formats) — data source is the path to the file

    vlayer = QgsVectorLayer("/path/to/shapefile/file.shp", "layer_name_you_like", "ogr")
    
  • PostGIS database — data source is a string with all information needed to create a connection to PostgreSQL database. QgsDataSourceURI class can generate this string for you. Note that QGIS has to be compiled with Postgres support, otherwise this provider isn’t available.

    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 optionally
    # subset (WHERE clause)
    uri.setDataSource("public", "roads", "the_geom", "cityid = 2643")
    
    vlayer = QgsVectorLayer(uri.uri(), "layer_name_you_like", "postgres")
    
  • CSV or other delimited text files — to open a file with a semicolon as a delimiter, with field “x” for x-coordinate and field “y” with y-coordinate you would use something like this

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

    Note: from QGIS version 1.7 the provider string is structured as a URL, so the path must be prefixed with file://. Also it allows WKT (well known text) formatted geometries as an alternative to “x” and “y” fields, and allows the coordinate reference system to be specified. For example

    uri = "file:///some/path/file.csv?delimiter=%s&crs=epsg:4723&wktField=%s" % (";", "shape")
    
  • GPX files — the “gpx” data provider reads tracks, routes and waypoints from gpx files. To open a file, the type (track/route/waypoint) needs to be specified as part of the url

    uri = "path/to/gpx/file.gpx?type=track"
    vlayer = QgsVectorLayer(uri, "layer_name_you_like", "gpx")
    
  • SpatiaLite database — supported from QGIS v1.1. Similarly to PostGIS databases, QgsDataSourceURI can be used for generation of data source identifier

    uri = QgsDataSourceURI()
    uri.setDatabase('/home/martin/test-2.3.sqlite')
    schema = ''
    table = 'Towns'
    geom_column = 'Geometry'
    uri.setDataSource(schema, table, geom_column)
    
    display_name = 'Towns'
    vlayer = QgsVectorLayer(uri.uri(), display_name, 'spatialite')
    
  • MySQL WKB-based geometries, through OGR — data source is the connection string to the table

    uri = "MySQL:dbname,host=localhost,port=3306,user=root,password=xxx|layername=my_table"
    vlayer = QgsVectorLayer( uri, "my_table", "ogr" )
    
  • WFS connection:. the connection is defined with a URI and using the WFS provider

    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")
    

    The uri can be created using the standard urllib library.

    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))
    

래스터 레이어

For accessing raster files, GDAL library is used. It supports a wide range of file formats. In case you have troubles with opening some files, check whether your GDAL has support for the particular format (not all formats are available by default). To load a raster from a file, specify its file name and base name

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!"

벡터 레이어와 마찬가지로, 래스터 레이어도 QgisInterface 클래스의 addRasterLayer() 함수를 통해 불러올 수 있습니다.

iface.addRasterLayer("/path/to/raster/file.tif", "layer_name_you_like")

이 함수는 단 한 번에 새 레이어를 생성해서 맵 레이어 레지스트리에 추가(레이어 목록에 새 레이어를 표출)합니다.

Raster layers can also be created from a WCS service.

layer_name = 'modis'
uri = QgsDataSourceURI()
uri.setParam('url', 'http://demo.mapserver.org/cgi-bin/wcs')
uri.setParam("identifier", layer_name)
rlayer = QgsRasterLayer(str(uri.encodedUri()), 'my_wcs_layer', 'wcs')

제공자 문서 에서 URI 설정에 대한 상세한 정보를 찾아볼 수 있습니다.

Alternatively you can load a raster layer from WMS server. However currently it’s not possible to access GetCapabilities response from API — you have to know what layers you want

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를 통해 어떤 응용 프로그램을 통해서도 레이어에 접근할 수 있게 됩니다. 맵 레이어 레지스트리에서 레이어를 제거하면 레이어가 삭제됩니다.

Adding a layer to the registry

QgsMapLayerRegistry.instance().addMapLayer(layer)

Layers are destroyed automatically on exit, however if you want to delete the layer explicitly, use

QgsMapLayerRegistry.instance().removeMapLayer(layer_id)

For a list of loaded layers and layer ids, use

QgsMapLayerRegistry.instance().mapLayers()
TODO:
More about map layer registry?