PyQGisCookbook--支持投影(九)
支持投影
如果您在pyqgis控制台之外,则此需要导入以下代码段:
from qgis.core import (QgsCoordinateReferenceSystem,
QgsCoordinateTransform,
QgsProject,
QgsPointXY,
)
参考坐标系统
QgsCoordinateReferenceSystem
类封装了坐标参考系统(CRS) 。可以通过几种不同的方式来创建此类的实例:
-
通过ID指定CRS
# PostGIS SRID 4326 is allocated for WGS84 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*
功能之一对其进行初始化。在下面的示例中,我们使用Proj字符串初始化投影。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("Proj String:", crs.toProj4())
# check whether it's geographic or projected coordinate system
print("Is geographic:", crs.isGeographic())
# check type of map units in this CRS (values defined in QGis::units enum)
print("Map units:", crs.mapUnits())
输出:
QGIS CRS ID: 3452
PostGIS SRID: 4326
Description: WGS 84
Projection Acronym: longlat
Ellipsoid Acronym: WGS84
Proj String: +proj=longlat +datum=WGS84 +no_defs
Is geographic: True
Map units: 6
CRS转换
您可以使用QgsCoordinateTransform
类实现不同空间参照系之间进行转换。最简单的使用方法是创建源CRS和目标CRS,并使用它们和当前投影对象 构造一个QgsCoordinateTransform
的实例。然后只需调用 transform()
函数即可进行转换。默认情况下,它会进行正向变换,但也能够进行逆向变换。
crsSrc = QgsCoordinateReferenceSystem(4326) # WGS 84
crsDest = QgsCoordinateReferenceSystem(32633) # WGS 84 / UTM zone 33N
xform = QgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())
# forward transformation: src -> dest
pt1 = xform.transform(QgsPointXY(18,5))
print("Transformed point:", pt1)
# inverse transformation: 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)>
©版权所有2002-现在,QGIS项目 最近更新于2020年4月3日09:14。
使用Sphinx使用Read the Docs提供的主题构建。