[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