7 投影支持
目录
此页面上的代码片段需要导入以下模块:
from qgis.core import (QgsCoordinateReferenceSystem,
QgsCoordinateTransform,
QgsProject,
QgsPointXY,
)
7.1 坐标参考系统
坐标参考系统(CRS)由QgsCoordinateReferenceSystem
类封装 。可以通过几种不同的方式创建此类的实例:
-
ID
# WGS84:4326 crs = QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.PostgisCrsId) assert crs.isValid()
QGIS为每个参考系统使用三种不同的ID:
-
InternalCrsId——
QGIS内部数据库中使用的ID -
PostgisCrsId——
PostGIS数据库中使用的ID -
EpsgCrsId——
EPSG组织分配的ID
如果未使用第二个参数指定,则默认使用PostGIS SRID。
-
-
通过WKT指定CRS
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) assert crs.isValid()
-
创建一个无效的CRS,然后使用其中一个
create*
函数进行初始化。在下面的示例中,我们使用Proj4字符串初始化投影。crs = QgsCoordinateReferenceSystem() crs.createFromProj4("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs") assert crs.isValid()
检查CRS的创建(即在数据库中查找)是否成功是明智的:isValid()
必须返回True
。
请注意,对于空间参考系统的初始化,QGIS需要在其内部数据库srs.db
中查找适当的值。因此,如果您创建一个独立的应用程序,您需要正确设置路径 QgsApplication.setPrefixPath()
,否则将无法找到数据库。如果您正在运行QGIS Python控制台中的命令或开发插件,则无需关注:所有内容都已为您设置。
访问空间参考系统信息:
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的地图单位类型
print("Map units:", crs.mapUnits())
输出:
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: 6
7.2 坐标参考系统转换
您可以使用QgsCoordinateTransform
类在不同的空间参照系之间进行转换。使用它的最简单方法是创建源和目标CRS,并在当前项目中构造QgsCoordinateTransform
实例。然后只需反复调用 transform()
函数进行转换。默认情况下,它会正向转换,但也可以逆向转换。
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)
输出:
Transformed point: <QgsPointXY: POINT(832713.79873844375833869 553423.98688333143945783)>
Transformed back: <QgsPointXY: POINT(18 5)>
写在最后:文中难免有翻译错误,欢迎您的指正。完整版翻译请移步PyQGIS开发者手册-完整版