8. 预测支持

提示

如果您在pyqgis控制台之外,则此页面上的代码片段需要以下导入:

1from qgis.core import (
2    QgsCoordinateReferenceSystem,
3    QgsCoordinateTransform,
4    QgsProject,
5    QgsPointXY,
6)

8.1. 坐标参考系

坐标参考系(CRS)由 QgsCoordinateReferenceSystem 班级。可以通过几种不同的方式创建此类的实例:

  • 按ID指定CRS

    # EPSG 4326 is allocated for WGS84
    crs = QgsCoordinateReferenceSystem("EPSG:4326")
    print(crs.isValid())
    
    True
    

    QGIS支持不同的CRS标识,格式如下:

如果未指定前缀,则假定为WKT定义。

  • 通过熟知文本(WKT)指定CRS

    1wkt = 'GEOGCS["WGS84", DATUM["WGS84", SPHEROID["WGS84", 6378137.0, 298.257223563]],' \
    2      'PRIMEM["Greenwich", 0.0], UNIT["degree",0.017453292519943295],' \
    3      'AXIS["Longitude",EAST], AXIS["Latitude",NORTH]]'
    4crs = QgsCoordinateReferenceSystem(wkt)
    5print(crs.isValid())
    
    True
    
  • 创建无效的CRS,然后使用 create* 函数对其进行初始化。在下面的示例中,我们使用Proj字符串来初始化投影。

    crs = QgsCoordinateReferenceSystem()
    crs.createFromProj("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
    print(crs.isValid())
    
    True
    

明智的做法是检查CRS的创建(即在数据库中查找)是否成功: isValid() 一定要回来 True

请注意,对于空间参考系的初始化,QGIS需要在其内部数据库中查找适当的值 srs.db 。因此,如果您创建了一个独立的应用程序,则需要使用 QgsApplication.setPrefixPath() ,否则它将无法找到数据库。如果您正在从QGIS Python控制台运行命令或开发插件,您并不关心:一切都已经为您准备好了。

访问空间参考系信息:

 1crs = QgsCoordinateReferenceSystem("EPSG:4326")
 2
 3print("QGIS CRS ID:", crs.srsid())
 4print("PostGIS SRID:", crs.postgisSrid())
 5print("Description:", crs.description())
 6print("Projection Acronym:", crs.projectionAcronym())
 7print("Ellipsoid Acronym:", crs.ellipsoidAcronym())
 8print("Proj String:", crs.toProj())
 9# check whether it's geographic or projected coordinate system
10print("Is geographic:", crs.isGeographic())
11# check type of map units in this CRS (values defined in QGis::units enum)
12print("Map units:", crs.mapUnits())

产出:

1QGIS CRS ID: 3452
2PostGIS SRID: 4326
3Description: WGS 84
4Projection Acronym: longlat
5Ellipsoid Acronym: EPSG:7030
6Proj String: +proj=longlat +datum=WGS84 +no_defs
7Is geographic: True
8Map units: DistanceUnit.Degrees

8.2. CRS转换

您可以在不同的空间参考系之间使用 QgsCoordinateTransform 班级。使用它的最简单方法是创建源和目标CRS,并构造 QgsCoordinateTransform 实例和当前项目。然后反复地打电话给 transform() 函数进行转换。默认情况下,它执行正向变换,但也能够进行逆变换。

 1crsSrc = QgsCoordinateReferenceSystem("EPSG:4326")    # WGS 84
 2crsDest = QgsCoordinateReferenceSystem("EPSG:32633")  # WGS 84 / UTM zone 33N
 3transformContext = QgsProject.instance().transformContext()
 4xform = QgsCoordinateTransform(crsSrc, crsDest, transformContext)
 5
 6# forward transformation: src -> dest
 7pt1 = xform.transform(QgsPointXY(18,5))
 8print("Transformed point:", pt1)
 9
10# inverse transformation: dest -> src
11pt2 = xform.transform(pt1, QgsCoordinateTransform.ReverseTransform)
12print("Transformed back:", pt2)

产出:

Transformed point: <QgsPointXY: POINT(832713.79873844375833869 553423.98688333143945783)>
Transformed back: <QgsPointXY: POINT(18 4.99999999999999911)>