跳转至

8 投影支持⚓︎

此页面上的代码片段需要导入以下模块:

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

8.1 坐标参考系统⚓︎

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

  • ID
1
2
3
4
# WGS84:4326
crs = QgsCoordinateReferenceSystem("EPSG:4326")
print(crs.isValid())
# True

QGIS支持不同的CRS识别符,支持以下格式:

如果未指定前缀,则默认使用WKT定义。

  • 通过WKT指定CRS
1
2
3
4
5
6
wkt = 'GEOGCS["WGS84", DATUM["WGS84", SPHEROID["WGS84", 6378137.0, 298.257223563]],' \
      'PRIMEM["Greenwich", 0.0], UNIT["degree",0.017453292519943295],' \
      'AXIS["Longitude",EAST], AXIS["Latitude",NORTH]]'
crs = QgsCoordinateReferenceSystem(wkt)
print(crs.isValid())
# True
  • 创建一个无效的CRS,然后使用其中一个create*函数进行初始化。在下面的示例中,我们使用Proj字符串初始化投影。
1
2
3
4
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控制台中运行命令或开发插件,则无需关注:一切都已经为你准备好了。

访问空间参考系统信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
crs = QgsCoordinateReferenceSystem(4326)

print("QGIS CRS ID:", crs.srsid())
print("PostGIS SRID:", crs.postgisSrid())
print("Description:", crs.description())
print("Projection Acronym:", crs.projectionAcronym())
print("Ellipsoid Acronym:", crs.ellipsoidAcronym())
print("Proj4 String:", crs.toProj4())
# 检查是地理坐标系统还是投影坐标系统
print("Is geographic:", crs.isGeographic())
# 检查CRS的地图单位类型(在QGis::units枚举中定义)
print("Map units:", crs.mapUnits())

输出:

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

8.2 坐标参考系统转换⚓︎

你可以使用QgsCoordinateTransform类在不同的空间参考系之间进行转换。使用它的最简单方法是创建原始和目标CRS,并在当前项目中构造QgsCoordinateTransform实例。然后只需反复调用 transform()函数进行转换。默认情况下,它会正向转换,但也可以逆向转换。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
crsSrc = QgsCoordinateReferenceSystem(4326)    # WGS 84
crsDest = QgsCoordinateReferenceSystem(32633)  # WGS 84 / UTM zone 33N
xform = QgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())

# 正向转换: src -> dest
pt1 = xform.transform(QgsPointXY(18,5))
print("Transformed point:", pt1)

# 逆向转换: dest -> src
pt2 = xform.transform(pt1, QgsCoordinateTransform.ReverseTransform)
print("Transformed back:", pt2)

输出:

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