如果用过超图的desktop进行过空间数据操作,那工程文件可以简单理解等同于超图的workspace(工作空间)文件。这个工程文件在QGIS里是做了同样的事情,进行空间数据的描述和组织,包括但不限于参考坐标系、地图图层信息、布局信息、标注和插件情况。
QGIS的工程文件有两类二进制和XML两种不同形式,其中XML格式采用.qgs扩展名,具体如下(部分,不完整罗列):
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis projectname="" saveDateTime="2022-10-28T22:28:39" version="3.26.3-Buenos Aires" saveUser="matebook" saveUserFull="matebook">
<homePath path=""/>
<title></title>
<transaction mode="Disabled"/>
<projectFlags set=""/>
<projectCrs>
<spatialrefsys nativeFormat="Wkt">
<wkt>GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]</wkt>
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
<srsid>3452</srsid>
<srid>4326</srid>
<authid>EPSG:4326</authid>
<description>WGS 84</description>
<projectionacronym>longlat</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>true</geographicflag>
</spatialrefsys>
</projectCrs>
<layer-tree-group>
<customproperties>
<Option/>
</customproperties>
<layer-tree-layer source="./line_sample.shp" providerKey="ogr" id="line_sample_09f4a6ec_1a05_46e0_b889_640d9ee0e799" checked="Qt::Checked" expanded="1" legend_split_behavior="0" name="03" legend_exp="" patch_size="-1,-1">
<customproperties>
<Option/>
</customproperties>
</layer-tree-layer>
<layer-tree-layer source="./50m_cultural/ne_50m_admin_0_countries.shp" providerKey="ogr" id="ne_50m_admin_0_countries_b16becdd_0955_4f24_b51a_bda250df38d9" checked="Qt::Checked" expanded="1" legend_split_behavior="0" name="02" legend_exp="" patch_size="-1,-1">
<customproperties>
<Option/>
</customproperties>
</layer-tree-layer>
<layer-tree-layer source="./region_sample.shp" providerKey="ogr" id="region_sample_f6a8d8ba_a795_43e0_8b92_5e8370d67666" checked="Qt::Unchecked" expanded="1" legend_split_behavior="0" name="01" legend_exp="" patch_size="-1,-1">
<customproperties>
<Option/>
</customproperties>
</layer-tree-layer>
<custom-order enabled="0">
<item>ne_50m_admin_0_countries_b16becdd_0955_4f24_b51a_bda250df38d9</item>
<item>line_sample_09f4a6ec_1a05_46e0_b889_640d9ee0e799</item>
<item>region_sample_f6a8d8ba_a795_43e0_8b92_5e8370d67666</item>
</custom-order>
</layer-tree-group>
从某种意义讲只有加载并解释即可获取空间数据的描述信息,但实际上不建议如此做,如果需要具体操作工程文件的话可以通过QgsProject这个类来实现,比如加载工程文件,读取节点等。
由于之前使用arcgis和supermap较多,这里有几个遗憾:
1、空间数据的描述还是缺乏层次,没有地图这个层次描述,直接就是图层,这就导致了一个工程文件只有一个地图,而不是1:多的关系。
2、图层的理解存在偏差,图层既是数据源也是显示,没有进行有效隔离,比如增加一个类型dataset来保存数据,而图层是具体数据集的渲染。这样可以实现一个数据集可以有多个图层(也许qgis本来就有,可能我理解不到位)。
3、QgsProject里面的封装还是过于原始,很多功能没法直接调用,比如打开地图,这必须自己加载图层实现。这也正是缺少map这个逻辑带来的一个开发实现的不便利吧。