QGIS API Documentation 3.99.0-Master (2fe06baccd8)
Loading...
Searching...
No Matches
qgstolerance.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgstolerance.cpp - wrapper for tolerance handling
3 ----------------------
4 begin : March 2009
5 copyright : (C) 2009 by Richard Kostecky
6 email : csf.kostej at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#include "qgstolerance.h"
17
18#include <cmath>
19
20#include "qgsmapsettings.h"
21#include "qgspointxy.h"
25
26#include <QPoint>
27
28#include "moc_qgstolerance.cpp"
29
30// return ratio [mu/lu] between map units and layer units
31// this is of course only an approximation
32double _ratioMU2LU( const QgsMapSettings &mapSettings, QgsMapLayer *layer )
33{
34 const double distMU = mapSettings.mapUnitsPerPixel();
35 const QgsPointXY ptMapCenterMU = mapSettings.visibleExtent().center();
36 const QgsPointXY ptMapCenterRightMU( ptMapCenterMU.x() + distMU, ptMapCenterMU.y() );
37 const QgsPointXY ptMapCenterLU = mapSettings.mapToLayerCoordinates( layer, ptMapCenterMU );
38 const QgsPointXY ptMapCenterRightLU = mapSettings.mapToLayerCoordinates( layer, ptMapCenterRightMU );
39 const double distLU = std::sqrt( ptMapCenterLU.sqrDist( ptMapCenterRightLU ) );
40 const double ratio = distMU / distLU;
41 return ratio;
42}
43
44double QgsTolerance::toleranceInProjectUnits( double tolerance, QgsMapLayer *layer, const QgsMapSettings &mapSettings, Qgis::MapToolUnit units )
45{
46 // converts to map units
47 if ( units == Qgis::MapToolUnit::Project )
48 return tolerance;
49 else if ( units == Qgis::MapToolUnit::Pixels )
50 return tolerance * mapSettings.mapUnitsPerPixel();
51 else // units == LayerUnits
52 {
53 // [mu] = [lu] * [mu/lu]
54 return tolerance * _ratioMU2LU( mapSettings, layer );
55 }
56}
57
58
59double QgsTolerance::toleranceInMapUnits( double tolerance, QgsMapLayer *layer, const QgsMapSettings &mapSettings, Qgis::MapToolUnit units )
60{
61 // converts to layer units
62 if ( units == Qgis::MapToolUnit::Layer )
63 {
64 return tolerance;
65 }
66 else if ( units == Qgis::MapToolUnit::Pixels )
67 {
68 const double layerUnitsPerPixel = computeMapUnitPerPixel( layer, mapSettings );
69 return tolerance * layerUnitsPerPixel;
70 }
71 else // ProjectUnits
72 {
73 // [lu] = [mu] / [mu/lu]
74 return tolerance / _ratioMU2LU( mapSettings, layer );
75 }
76}
77
79{
82 if ( units == Qgis::MapToolUnit::Layer )
84 return toleranceInProjectUnits( tolerance, nullptr, mapSettings, units );
85}
86
88{
91 return toleranceInMapUnits( tolerance, layer, mapSettings, units );
92}
93
94double QgsTolerance::defaultTolerance( QgsMapLayer *layer, const QgsMapSettings &mapSettings )
95{
98 return toleranceInMapUnits( tolerance, layer, mapSettings, units );
99}
100
101
102double QgsTolerance::computeMapUnitPerPixel( QgsMapLayer *layer, const QgsMapSettings &mapSettings )
103{
104 // the layer is projected. Find out how many pixels are in one map unit - either horizontal and vertical direction
105 // this check might not work correctly in some cases
106 // (on a large area the pixels projected around "0,0" can have different properties from the actual point)
107 const QgsPointXY p1 = toLayerCoordinates( layer, mapSettings, QPoint( 0, 1 ) );
108 const QgsPointXY p2 = toLayerCoordinates( layer, mapSettings, QPoint( 0, 2 ) );
109 const QgsPointXY p3 = toLayerCoordinates( layer, mapSettings, QPoint( 1, 0 ) );
110 const QgsPointXY p4 = toLayerCoordinates( layer, mapSettings, QPoint( 2, 0 ) );
111 const double x = p1.sqrDist( p2 );
112 const double y = p3.sqrDist( p4 );
113 if ( x > y )
114 {
115 return std::sqrt( x );
116 }
117 else
118 {
119 return std::sqrt( y );
120 }
121}
122
123
124QgsPointXY QgsTolerance::toLayerCoordinates( QgsMapLayer *layer, const QgsMapSettings &mapSettings, QPoint point )
125{
126 const QgsPointXY pt = mapSettings.mapToPixel().toMapCoordinates( point );
127 return mapSettings.mapToLayerCoordinates( layer, pt );
128}
MapToolUnit
Type of unit of tolerance value from settings.
Definition qgis.h:4981
@ Layer
Layer unit value.
Definition qgis.h:4982
@ Project
Map (project) units.
Definition qgis.h:4984
@ Pixels
Pixels unit of tolerance.
Definition qgis.h:4983
Base class for all map layer types.
Definition qgsmaplayer.h:80
Contains configuration for rendering maps.
const QgsMapToPixel & mapToPixel() const
double mapUnitsPerPixel() const
Returns the distance in geographical coordinates that equals to one pixel in the map.
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes output image size into account.
QgsPointXY mapToLayerCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from output CRS to layer's CRS
QgsPointXY toMapCoordinates(int x, int y) const
Transforms device coordinates to map (world) coordinates.
Represents a 2D point.
Definition qgspointxy.h:60
double sqrDist(double x, double y) const
Returns the squared distance between this point a specified x, y coordinate.
Definition qgspointxy.h:186
double y
Definition qgspointxy.h:64
double x
Definition qgspointxy.h:63
QgsPointXY center
static const QgsSettingsEntryDouble * settingsDigitizingSearchRadiusVertexEdit
Settings entry digitizing search radius vertex edit.
static const QgsSettingsEntryEnumFlag< Qgis::MapToolUnit > * settingsDigitizingDefaultSnappingToleranceUnit
Settings entry digitizing default snapping tolerance unit.
static const QgsSettingsEntryEnumFlag< Qgis::MapToolUnit > * settingsDigitizingSearchRadiusVertexEditUnit
Settings entry digitizing search radius vertex edit unit.
static const QgsSettingsEntryDouble * settingsDigitizingDefaultSnappingTolerance
Settings entry digitizing default snapping tolerance.
static double toleranceInMapUnits(double tolerance, QgsMapLayer *layer, const QgsMapSettings &mapSettings, Qgis::MapToolUnit units=Qgis::MapToolUnit::Layer)
Static function to translate tolerance value into layer units.
static double vertexSearchRadius(const QgsMapSettings &mapSettings)
Static function to get vertex tolerance value.
static double defaultTolerance(QgsMapLayer *layer, const QgsMapSettings &mapSettings)
Static function to get default tolerance value for a layer.
static double toleranceInProjectUnits(double tolerance, QgsMapLayer *layer, const QgsMapSettings &mapSettings, Qgis::MapToolUnit units)
Static function to translate tolerance value into map units.
double _ratioMU2LU(const QgsMapSettings &mapSettings, QgsMapLayer *layer)