这篇文章主要是用来记录一些在Qgis二次开发过程中,对于3.10版本的一些库函数,帮助文件的理解,方便自己梳理结构吧。
文章目录
1 QgsLayerTreeModel class
帮助文件中对这个类的描述:
继承自 QAbstractItemModel这个QT中所有model的基类,并进行拓展。
The model listens to the changes in the layer tree and signals the changes as appropriate, so that any view that uses the model is updated accordingly.
Behavior of the model can be customized with flags. For example, whether to show legend or whether to allow changes to the layer tree.
我的理解:
这个模型监听图层树的变化并发出适当的信号signal,让所有和这个模型有关的视图都产生相应的更新。(属于QT Model-View结构里的Model,主要负责数据部分)
模型的行为可以通过Flags进行定制。
2 MapCanvas类下的与点相关的函数
为了显示地图上的坐标点,需要从Canva上获取到当前的坐标,看了下大佬们的文章,似乎QgsMapCanvas本身留有这样返回坐标的接口,但是为了更好地理解,打算捋一下这个类下面和点操作有关的函数。
主要包括:
- 用于发送信号的
- 普通的成员函数
signal:
// Emits current mouse position.
void xyCoordinates (const QgsPointXY &p);
// 这是个发送信号的函数,如果需要实现上述功能,可以通过connect将该函数和要更新的地方进行绑定实现
public Member Function:
// Gets map center, in geographical coordinates
QgsPointXY center() const;
// set the center of the map canvas, in geographical coordinates.
void setCenter( const QgsPointXY ¢er);
// return last position of mouse cursor
QPoint QgsMapCanvas::mouseLastXY();
// 通过阅读源码,在画布的鼠标动作里,有根据不同动作返回的函数,
// 这里估计这个函数的用法,主要可以用于拖拽,画直线、按比例放大等需要两点操作的时候,
// 可以直接获取上一次点击的坐标,而不需要二次使用者自己去另外做上次坐标的存储了。
3 测量距离-面积的类qgsDistanceArea
官方介绍翻译与总结
- 一个通用的距离\面积计算器,可以用于椭球上的计算
- 可以用于
QgsGeometry
,也可以用于lists of points
ellipsoid()
决定了计算的算法,默认为基于笛卡尔坐标系setSourceCrs()
必须在使用前设定好,设置参考坐标系- 通常返回的单位是米,但如果
ellipsoid
没有设定,则不一定是米
单位相关
面积:
QgsUnitTypes::AreaUnit
–> 枚举类型enumerate
QgsDistanceArea::areaUnits() const
:返回当前项目(project)计算返回的数值的单位
距离:
QgsUnitTypes::DistanceUnit
–> 枚举类型enumerate
QgsDistanceArea::lengthUnits() const
:返回当前项目(project)计算返回的数值的单位
单位转换:
double convertAreaMeasurement(double area, QgsUnitTypes::AreaUnit toUnits) const
把算出的面积转换成给定单位。double convertLengthMeasurement(double length, QgsUnitTypes::DistanceUnit toUnits) const
把算出的长度转换成给定单位。QgsUnitTypes::DistanceUnit QgsDistanceArea::lengthUnits() const
返回当前object计算的长度的单位
计算的函数
方位角相关
double bearing(const QgsPointXY & p1,const QgsPointXY &p2,) const
计算bearing: 方位,以某点的正北为基准的描述。单位为弧度
QgsPointXY computeSpheroidProject(const QgsPointXY& p1, double distance = 1, double azimuth =M_PI_2)
给定点、方位角、距离,确定另一个点。
基于Vincenty’s formula
计算距离或面积
double measureArea(const QgsGeometry & geometry) const
计算给定几何图形QgsGeometry的面积,对于几何集合,无表面的几何图形会被忽略。double measureLength( const QgsGeometry &geometry) const
测量几何图形QgsGeometry的长度,对于几何集合,无曲线的几何会被忽略。double measureLine( const QVector<QgsPointXY> & points) const
测量给定多点线段的长度double measureLine( const QgsPointXY &p1, const QgsPointXY & p2) const
测量给定两点的距离。p1开始点,p2结束点double measureLineProjected( const QgsPointXY &p1, double distance =1, double azimuth = M_PI_2, QgsPointXY* projectedPoint = nullptr) const
如果sourceCrs()
是geographic
,测量给定点到以给定点、方位角、距离确定的点的距离。
否则,调用computeSpheroidProject()
。double measurePerimeter( const QgsGeometry& geometry) const
测量多边形的周长,对于几何几何,非多边形的几何会被忽略。double measurePolygon( const QVector<QgsPointXY> &points) const
测量给定点描述的多边形的面积
椭球基准ellipsoid及Crs
bool setEllipsoid( const QString & ellipsoid)
通过首字母缩略词设置椭球。
常用的椭球的首字母,可以用QgsEllipsoidUtils::acronyms()
获得。bool setEllipsoid(double semiMajor, double semiMinor)
通过半长轴,半短轴设定椭球void setSourceCrs( const QgsCoordinateReferenceSystem & crs, const QgsCoordinateTransformContext& context)
设置参考坐标系QgsCoordinateReferenceSystem courceCrs() const
返回正在使用的参考坐标系QString ellipsoid() const
返回椭球基准的首字母缩略词(就是单词的首字母拼在一起那种)QgsCoordinateReferenceSystem ellipsoidCrs() const
返回椭球空间参考坐标Crs,(一般来自于现在看的图层)double ellipsoidInverseFlattening() const
返回椭球的反扁率(Inverse Flattening)
i n v f = a a − b invf = \frac {a}{a-b} invf=a−badouble ellipsoidSemiMajor() cosnt
返回椭球的半长轴(Semi Major Axis)double ellipsoidSemiMinor() const
返回椭球的半短轴(Semi Minor Axis)bool willUseEllipsoid() const
返回计算是否使用椭球
面积\距离输出格式化
QString formatArea(double area, int decimals, QgsUnitTypes::AreaUnit unit, bool KeepBaseUnit = false)
将给定的面积以易于阅读的字符串(friendly string)输出QString formatDistace(double distance, int decimals, QgsUnitTypes::DistanceUnit unit, bool keepBaseUnit = false)
同上,但对象是距离
其他功能
-
QVector<QVector<QgsPointXY>> geodesicLine(const QgsPointXY & p1, const QgsPointXY & p2, double interval, bool breakLine = false) false
插点功能:将给点的两个点p1,p2,,用在椭球上的最短路径相连,将路径中,以最大间距为参数interval进行补点。breakLine参数是用于在路径穿过了本初子午线(antimeridian),精度正负号翻转的情况时,是否将线段分为两段。 -
double latitudeGeodesicCrossesAntimeridian( const QgsPointXY & p1, const QgsPointXY & p2, double & fractionAlongLine) const
计算穿过本初子午线时的纬度把给定两点连线穿过本初子午线的纬度计算出来。 -
QgsGeometry splitGeometryAtAntimeridian (const QgsGeometry & geometry) const
把给定几何以本初子午线为分割线进行分割,返回的是个多部件(multi-part)的几何。
4 坐标系部分
4.1 QgsCoordinateReferenceSystem(即程序中常见的Crs)
定义Crs的方法
QgsCoordinateReferenceSystem::QgsCoordinateReferenceSystem ( const QString & definition )
Constructs a CRS object from a string definition using createFromString()
It supports the following formats:
- “EPSG:
” - handled with createFromOgcWms()
- “POSTGIS:” - handled with createFromSrid()
- “INTERNAL:” - handled with createFromSrsId()
- “PROJ4:” - handled with createFromProj4()
- “WKT:” - handled with createFromWkt()
If no prefix is specified, WKT definition is assumed.
QgsCoordinateReferenceSystem::QgsCoordinateReferenceSystem ( long id, CrsType type = PostgisCrsId )
Constructor a CRS object using a PostGIS SRID, an EPSG code or an internal QGIS CRS ID.
Note
We encourage you to use EPSG code, WKT or Proj4 to describe CRS’s in your code wherever possible. Internal QGIS CRS IDs are not guaranteed to be permanent / involatile.
推荐使用方法1,因为qgis的id可能发生改变
Parameters
id The ID valid for the chosen CRS ID type
type One of the types described in CrsType
4.2 QgsCoordinateTransformContext
描述的是从坐标系变换间的关系
可以参考其成员函数进行理解
bool QgsCoordinateTransformContext::addCoordinateOperation ( const QgsCoordinateReferenceSystem & sourceCrs,
const QgsCoordinateReferenceSystem & destinationCrs,
const QString & coordinateOperationProjString )
该类内存储了多种从源坐标系 到目标坐标系的变换需要的内容。