Carregando Camadas

Vamos abrir algumas camadas com dados. QGIS reconhece camadas vetoriais e matriciais. Adicionalmente, camadas personalizadas estão disponíveis, mas não discutiremos este tipo de camadas aqui.

Camadas Vetoriais

Para carregar uma camada vetorial, especifique o identificador da origem de dados, o nome da camada e o nome do provedor.

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

O identificador da fonte de dados é uma string e é especifico para cada provedor de dados vetoriais. O nome da camada é usado no painel de lista de camadas. É importante verificar se a camada foi carregada com sucesso. Se não for, uma instância de camada inválida é retornada.

A lista a seguir mostra como acessar várias fontes de dados usando provedores de dados vetoriais:

  • Biblioteca OGR (shapefiles e muitos outros formatos de arquivo) — fonte de dados é o caminho para o arquivo

    vlayer = QgsVectorLayer("/path/to/shapefile/file.shp", \
      "layer_name_you_like", "ogr")
    
  • Banco de dados PostGIS — fonte de dados é uma string com todas as informações necessárias para criar uma conexão com banco de dados PostgreSQL. : classe class:QgsDataSourceURI pode gerar essa string para você. Note-se que o QGIS tem de ser compilado com suporte a Postgres, caso contrário, este provedor não estará disponível.

    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 ou outros arquivos de texto delimitados — para abrir um arquivo com um ponto e vírgula como delimitador, com o campo “x” para coordenada x e campo de “y” com coordenada y você usaria algo assim

    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 geomtries 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")
    
  • Arquivos GPX — o provedor de dados “gpx” lê trilhas, rotas e waypoints a partir de arquivos GPX. Para abrir um arquivo, o tipo (track/route/waypoint) precisa ser especificado como parte da URL

    uri = "path/to/gpx/file.gpx?type=track"
    vlayer = QgsVectorLayer(uri, "layer_name_you_like", "gpx")
    
  • Banco de dados SpatiaLite — suportado a partir do QGIS v1.1. Da mesma forma que os bancos de dados PostGIS, QgsDataSourceURI pode ser usada para geração de identificador de fonte de dados

    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')
    
  • Geometrias baseadas em WKB no MySQL, através da OGR — fonte de dados é a string de conexão com a tabela

    uri = "MySQL:dbname,host=localhost,port=3306,user=root,password=xxx|\
      layername=my_table"
    vlayer = QgsVectorLayer( uri, "my_table", "ogr" )
    
  • Conexão WFS :. a conexão é definida com uma URI e usando o provedor 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")
    

    O URI pode ser criado usando a biblioteca urllib padrão.

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

    And you can also use the

Camadas Matriciais

Para acessar arquivos matriciais, a biblioteca GDAL é usada. Ela suporta uma ampla gama de formatos de arquivo. No caso de você ter problemas com a abertura de alguns arquivos, verifique se a sua GDAL tem suporte para o formato específico (nem todos os formatos estão disponíveis por padrão). Para carregar um raster a partir de um arquivo, especifique o nome do arquivo e o nome de base

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

Camadas matriciais também podem ser criadas a partir de um serviço de 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')

Alternativamente, você pode carregar uma camada a partir de um servidor WMS. No entanto, atualmente, não é possível acessar resposta GetCapabilities da API — você tem que saber o que você quer camadas

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

Registro de Camada de Mapa

Se você gostaria de usar as camadas abertas para renderização, não se esqueça de adicioná-los ao registro da camada de mapa. O registro camada de mapa apropria-se das camadas e podem ser mais tarde acessadas ​​a partir de qualquer parte do aplicativo pelo seu ID único. Quando a camada é removida do registro camada do mapa, ele é excluído, também.

Adicionando uma canada ao registro:

QgsMapLayerRegistry.instance().addMapLayer(layer)

Camadas são destruídas automaticamente ao sair, no entanto, se você deseja excluir a camada explicitamente, use

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

Mais sobre o registro de camada e mapa?