[QGIS Commit] r11474 - in trunk/qgis/src: app core
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Fri Aug 21 19:39:13 EDT 2009
Author: homann
Date: 2009-08-21 19:39:11 -0400 (Fri, 21 Aug 2009)
New Revision: 11474
Modified:
trunk/qgis/src/app/qgsmaptoolidentify.cpp
trunk/qgis/src/app/qgsmaptoolidentify.h
trunk/qgis/src/core/qgsdistancearea.cpp
trunk/qgis/src/core/qgsdistancearea.h
Log:
Fixed measurements from identify tool:
* Added support for 25D (by ignoring Z value completely)
* Made the tool convert to the preferred units set for measurment tool
Modified: trunk/qgis/src/app/qgsmaptoolidentify.cpp
===================================================================
--- trunk/qgis/src/app/qgsmaptoolidentify.cpp 2009-08-21 22:39:43 UTC (rev 11473)
+++ trunk/qgis/src/app/qgsmaptoolidentify.cpp 2009-08-21 23:39:11 UTC (rev 11474)
@@ -346,7 +346,9 @@
if ( layer->geometryType() == QGis::Line )
{
double dist = calc.measure( f_it->geometry() );
- QString str = calc.textUnit( dist, 3, mCanvas->mapUnits(), false );
+ QGis::UnitType myDisplayUnits;
+ convertMeasurement( calc, dist, myDisplayUnits, false );
+ QString str = calc.textUnit( dist, 3, myDisplayUnits, false ); // dist and myDisplayUnits are out params
mResults->addDerivedAttribute( featureNode, tr( "Length" ), str );
if ( f_it->geometry()->wkbType() == QGis::WKBLineString )
{
@@ -364,7 +366,9 @@
else if ( layer->geometryType() == QGis::Polygon )
{
double area = calc.measure( f_it->geometry() );
- QString str = calc.textUnit( area, 3, mCanvas->mapUnits(), true );
+ QGis::UnitType myDisplayUnits;
+ convertMeasurement( calc, area, myDisplayUnits, true ); // area and myDisplayUnits are out params
+ QString str = calc.textUnit( area, 3, myDisplayUnits, true );
mResults->addDerivedAttribute( featureNode, tr( "Area" ), str );
}
else if ( layer->geometryType() == QGis::Point )
@@ -534,3 +538,49 @@
}
}
}
+
+void QgsMapToolIdentify::convertMeasurement( QgsDistanceArea &calc, double &measure, QGis::UnitType &u, bool isArea )
+{
+ // Helper for converting between meters and feet
+ // The parameter &u is out only...
+
+ QGis::UnitType myUnits = mCanvas->mapUnits();
+ if (( myUnits == QGis::Degrees || myUnits == QGis::Feet ) &&
+ calc.ellipsoid() != "NONE" &&
+ calc.hasCrsTransformEnabled() )
+ {
+ // Measuring on an ellipsoid returns meters, and so does using projections???
+ myUnits = QGis::Meters;
+ QgsDebugMsg( "We're measuring on an ellipsoid or using projections, the system is returning meters" );
+ }
+
+ // Get the units for display
+ QSettings settings;
+ QString myDisplayUnitsTxt = settings.value( "/qgis/measure/displayunits", "meters" ).toString();
+
+ // Only convert between meters and feet
+ if ( myUnits == QGis::Meters && myDisplayUnitsTxt == "feet" )
+ {
+ QgsDebugMsg( QString( "Converting %1 meters" ).arg( QString::number( measure ) ) );
+ measure /= 0.3048;
+ if ( isArea )
+ {
+ measure /= 0.3048;
+ }
+ QgsDebugMsg( QString( "to %1 feet" ).arg( QString::number( measure ) ) );
+ myUnits = QGis::Feet;
+ }
+ if ( myUnits == QGis::Feet && myDisplayUnitsTxt == "meters" )
+ {
+ QgsDebugMsg( QString( "Converting %1 feet" ).arg( QString::number( measure ) ) );
+ measure *= 0.3048;
+ if ( isArea )
+ {
+ measure *= 0.3048;
+ }
+ QgsDebugMsg( QString( "to %1 meters" ).arg( QString::number( measure ) ) );
+ myUnits = QGis::Meters;
+ }
+
+ u = myUnits;
+}
Modified: trunk/qgis/src/app/qgsmaptoolidentify.h
===================================================================
--- trunk/qgis/src/app/qgsmaptoolidentify.h 2009-08-21 22:39:43 UTC (rev 11473)
+++ trunk/qgis/src/app/qgsmaptoolidentify.h 2009-08-21 23:39:11 UTC (rev 11474)
@@ -17,9 +17,11 @@
#ifndef QGSMAPTOOLIDENTIFY_H
#define QGSMAPTOOLIDENTIFY_H
+#include "qgis.h"
#include "qgsmaptool.h"
#include "qgspoint.h"
#include "qgsfeature.h"
+#include "qgsdistancearea.h"
#include <QObject>
@@ -108,6 +110,9 @@
//! list of identified features
QgsFeatureList mFeatureList;
+ //! Private helper
+ void convertMeasurement( QgsDistanceArea &calc, double &measure, QGis::UnitType &u, bool isArea );
+
private slots:
// Let us know when the QgsIdentifyResults dialog box has been closed
void resultsDialogGone();
Modified: trunk/qgis/src/core/qgsdistancearea.cpp
===================================================================
--- trunk/qgis/src/core/qgsdistancearea.cpp 2009-08-21 22:39:43 UTC (rev 11473)
+++ trunk/qgis/src/core/qgsdistancearea.cpp 2009-08-21 23:39:11 UTC (rev 11474)
@@ -29,7 +29,6 @@
#include "qgsdistancearea.h"
#include "qgsapplication.h"
#include "qgslogger.h"
-#include "qgslogger.h"
// MSVC compiler doesn't have defined M_PI in math.h
#ifndef M_PI
@@ -185,34 +184,48 @@
memcpy( &wkbType, ( wkb + 1 ), sizeof( wkbType ) );
// measure distance or area based on what is the type of geometry
+ bool hasZptr = false;
+
switch ( wkbType )
{
+ case QGis::WKBLineString25D:
+ hasZptr = true;
case QGis::WKBLineString:
- measureLine( wkb, &res );
+ measureLine( wkb, &res, hasZptr );
+ QgsDebugMsg( "returning " + QString::number( res ) );
return res;
+ case QGis::WKBMultiLineString25D:
+ hasZptr = true;
case QGis::WKBMultiLineString:
count = *(( int* )( wkb + 5 ) );
ptr = wkb + 9;
for ( i = 0; i < count; i++ )
{
- ptr = measureLine( ptr, &res );
+ ptr = measureLine( ptr, &res, hasZptr );
resTotal += res;
}
+ QgsDebugMsg( "returning " + QString::number( resTotal ) );
return resTotal;
+ case QGis::WKBPolygon25D:
+ hasZptr = true;
case QGis::WKBPolygon:
- measurePolygon( wkb, &res );
+ measurePolygon( wkb, &res, hasZptr );
+ QgsDebugMsg( "returning " + QString::number( res ) );
return res;
+ case QGis::WKBMultiPolygon25D:
+ hasZptr = true;
case QGis::WKBMultiPolygon:
count = *(( int* )( wkb + 5 ) );
ptr = wkb + 9;
for ( i = 0; i < count; i++ )
{
- ptr = measurePolygon( ptr, &res );
+ ptr = measurePolygon( ptr, &res, hasZptr );
resTotal += res;
}
+ QgsDebugMsg( "returning " + QString::number( resTotal ) );
return resTotal;
default:
@@ -222,7 +235,7 @@
}
-unsigned char* QgsDistanceArea::measureLine( unsigned char* feature, double* area )
+unsigned char* QgsDistanceArea::measureLine( unsigned char* feature, double* area, bool hasZptr )
{
unsigned char *ptr = feature + 5;
unsigned int nPoints = *(( int* )ptr );
@@ -239,6 +252,12 @@
ptr += sizeof( double );
y = *(( double * ) ptr );
ptr += sizeof( double );
+ if ( hasZptr )
+ {
+ // totally ignore Z value
+ ptr += sizeof( double );
+ }
+
points.append( QgsPoint( x, y ) );
}
@@ -313,7 +332,7 @@
}
-unsigned char* QgsDistanceArea::measurePolygon( unsigned char* feature, double* area )
+unsigned char* QgsDistanceArea::measurePolygon( unsigned char* feature, double* area, bool hasZptr )
{
// get number of rings in the polygon
unsigned int numRings = *(( int* )( feature + 1 + sizeof( int ) ) );
@@ -344,6 +363,11 @@
ptr += sizeof( double );
y = *(( double * ) ptr );
ptr += sizeof( double );
+ if ( hasZptr )
+ {
+ // totally ignore Z value
+ ptr += sizeof( double );
+ }
pnt = QgsPoint( x, y );
Modified: trunk/qgis/src/core/qgsdistancearea.h
===================================================================
--- trunk/qgis/src/core/qgsdistancearea.h 2009-08-21 22:39:43 UTC (rev 11473)
+++ trunk/qgis/src/core/qgsdistancearea.h 2009-08-21 23:39:11 UTC (rev 11474)
@@ -90,9 +90,9 @@
protected:
//! measures line distance, line points are extracted from WKB
- unsigned char* measureLine( unsigned char* feature, double* area );
+ unsigned char* measureLine( unsigned char* feature, double* area, bool hasZptr = false );
//! measures polygon area, vertices are extracted from WKB
- unsigned char* measurePolygon( unsigned char* feature, double* area );
+ unsigned char* measurePolygon( unsigned char* feature, double* area, bool hasZptr = false );
/**
calculates distance from two points on ellipsoid
More information about the QGIS-commit
mailing list