QGIS Python开发手册-加载图层

QGIS Python开发手册-加载图层
QGIS Python开发手册-加载图层

QGIS Python开发手册-加载图层

加载图层

在QGIS中,图层主要分为矢量图层和栅格图层,另外还支持自定义图层,本文不予讨论。

矢量图层

加载矢量图层,需要知道图层的数据源标识、名称和数据源类型(provider),加载代码如下:layer = QgsVectorLayer(data_source, layer_name, provider_name)

ifnot layer.isValid():

print"Layer failed to load!"

根据数据源类型的不同,数据源标识也不同。图层名称用于在图层列表Widget里显示。需要注意的是在加载图层后要判断是否加载成功,可以通过layer的isValid()方法进行判断。

在QGIS中快速打开并显示图层的方式是使用QgisInterface的addVectorLayer方法,代码如下:

layer = iface.addVectorLayer("/path/to/shapefile/file.shp",

"layer_name_you_like", "ogr")

ifnot layer:

print"Layer failed to load!"

该方法创建一个图层,静将图层假入到地图对象中,其返回一个图层对象。如果图层对象为None,则图层加载失败。

下面介绍加载不同数据源的图层:

* OGR–数据源标识为指向文件的路径

vlayer = QgsVectorLayer("/path/to/shapefile/file.shp",

"layer_name_you_like", "ogr")

* PostGIS数据库–数据源标识是数据库连接字符串,可以通过QgsDataSourceURI类来生成,需要注意的是QGIS编译的时候选择了支持Postgres,否则不支持PostGIS。代码如下:

uri = QgsDataSourceURI()

# set host name, port, database name, username and password

uri.setConnection("localhost", "5432", "dbname", "johny", "xxx")

# setdatabaseschema, table name, geometry columnand optionally

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

需要注意的是,从QGIS1.7开始,该类型的数据源标识为URL,因此路径要包含file://前缀。另外,使用该数据源还可以加载WKT格式的数据,并且允许定义参考系,相关代码如下:

uri =

"file:///some/path/file.csv?delimiter=%s&crs=epsg:4723&wktField=%s" % (";", "shape")

* GPX–gpx数据源可以读取从gpx文件里读取tracks, routes and waypoints 。使用gpx数据源的时候需要在路径中指定上述三种类型中的一种,代码如下:

uri = "path/to/gpx/file.gpx?type=track"

vlayer = QgsVectorLayer(uri, "layer_name_you_like", "gpx")

* SpatiaLite数据库–从QGIS1.1开始支持,类似于PostGIS数据库

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类型,通过OGR读取–数据源标识为数据库连接字符串,代码如下:

uri =

"MySQL:dbname,host=localhost,port=3306,user=root,password=xxx|layername=my _table"

vlayer = QgsVectorLayer( uri, "my_table", "ogr" )

* WFS连接–数据源标识为URI,代码如下:

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也可以通过urilib创建:

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

栅格图层

在QGIS中,使用GDAL来读取栅格图层,因此支持非常多种栅格格式。如果打开某些栅格文件有问题,请检查GDAL是否支持这种格式。

加载栅格图层,只需要指定栅格文件的路径和名称即可,代码如下:

fileName = "/path/to/raster/file.tif"

fileInfo = QFileInfo(fileName)

baseName = fileInfo.baseName()

rlayer = QgsRasterLayer(fileName, baseName)

ifnot rlayer.isValid():

print"Layer failed to load!"

和矢量图层类似,使用QgisInterface的addRasterLayer方法可以快速加载和显示栅格图层,代码如下:

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

上面的代码会创建一个栅格图层,并将该图层添加到地图对象中。

栅格图层还可以从WCS服务中创建,代码如下:

urlWithParams =

'url=https://www.360docs.net/doc/07540411.html,/wms.cgi&layers=global_mosaic&styles=pseudo&fo

rmat=image/jpeg&crs=EPSG:4326'

rlayer = QgsRasterLayer(urlWithParams, 'some layer name', 'wms')

ifnot rlayer.isValid():

print"Layer failed to load!"

同样的,栅格图层还可以从WMS服务创建,代码如下:

urlWithParams =

'url=https://www.360docs.net/doc/07540411.html,/wms.cgi&layers=global_mosaic&styles=pseudo&fo rmat=image/jpeg&crs=EPSG:4326'

rlayer = QgsRasterLayer(urlWithParams, 'some layer name', 'wms')

ifnot rlayer.isValid():

print"Layer failed to load!"

图层加入到地图中

图层加载完成后,如果想进行显示,需要加载到地图中。代码如下:

QgsMapLayerRegistry.instance().addMapLayer(layer)

当程序退出的时候,图层会自动析构,如果想手动删除,可以使用下面的代码:

QgsMapLayerRegistry.instance().removeMapLayer(layer_id)

用户可以通过图层的id来获取地图中图层,下面的方法列出地图对象中的所有图层: QgsMapLayerRegistry.instance().mapLayers()

相关主题
相关文档
最新文档