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 passworduri.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=/wms.cgi&layers=global_mosaic&styles=pseudo&format=image/jpeg&crs=EPSG:4326'rlayer = QgsRasterLayer(urlWithParams, 'some layer name', 'wms')ifnot rlayer.isValid():print"Layer failed to load!"同样的,栅格图层还可以从WMS服务创建,代码如下:urlWithParams ='url=/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()。