PyQGisCookbook--支持投影(九)

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:

    如果没有另外指定第二个参数,则默认使用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提供的主题构建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值