8 投影支持
此页面上的代码片段需要导入以下模块:
| from qgis.core import (
QgsCoordinateReferenceSystem,
QgsCoordinateTransform,
QgsProject,
QgsPointXY,
)
|
8.1 坐标参考系统
坐标参考系统(CRS)由QgsCoordinateReferenceSystem
类封装 。可以通过几种不同的方式创建此类的实例:
| # WGS84:4326
crs = QgsCoordinateReferenceSystem("EPSG:4326")
print(crs.isValid())
# True
|
QGIS支持不同的CRS识别符,支持以下格式:
如果未指定前缀,则默认使用WKT定义。
| 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字符串初始化投影。
| 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())
|
输出:
| 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()
函数进行转换。默认情况下,它会正向转换,但也可以逆向转换。
| 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 4.99999999999999911)>
|