[QGIS Commit] r9457 - in trunk/qgis/src: gui providers/gpx

svn_qgis at osgeo.org svn_qgis at osgeo.org
Wed Oct 8 02:02:57 EDT 2008


Author: timlinux
Date: 2008-10-08 02:02:57 -0400 (Wed, 08 Oct 2008)
New Revision: 9457

Modified:
   trunk/qgis/src/gui/qgsmapcanvassnapper.cpp
   trunk/qgis/src/providers/gpx/qgsgpxprovider.cpp
Log:
Bugfix from Marco: when selecting features in gpxprovider use proper intersection test rather than just testing if bounding boxes intersect

Modified: trunk/qgis/src/gui/qgsmapcanvassnapper.cpp
===================================================================
--- trunk/qgis/src/gui/qgsmapcanvassnapper.cpp	2008-10-08 05:46:44 UTC (rev 9456)
+++ trunk/qgis/src/gui/qgsmapcanvassnapper.cpp	2008-10-08 06:02:57 UTC (rev 9457)
@@ -48,12 +48,13 @@
 void QgsMapCanvasSnapper::setMapCanvas( QgsMapCanvas* canvas )
 {
   mMapCanvas = canvas;
+  delete mSnapper;
   if ( mMapCanvas )
   {
     mSnapper = new QgsSnapper( canvas->mapRenderer() );
   }
   else
-  {
+  { 
     mSnapper = 0;
   }
 }

Modified: trunk/qgis/src/providers/gpx/qgsgpxprovider.cpp
===================================================================
--- trunk/qgis/src/providers/gpx/qgsgpxprovider.cpp	2008-10-08 05:46:44 UTC (rev 9456)
+++ trunk/qgis/src/providers/gpx/qgsgpxprovider.cpp	2008-10-08 06:02:57 UTC (rev 9457)
@@ -111,6 +111,7 @@
 QgsGPXProvider::~QgsGPXProvider()
 {
   GPSData::releaseData( mFileName );
+  delete mSelectionRectangle;
 }
 
 
@@ -212,59 +213,80 @@
       if (( rte->xMax >= b.xMin() ) && ( rte->xMin <= b.xMax() ) &&
           ( rte->yMax >= b.yMin() ) && ( rte->yMin <= b.yMax() ) )
       {
-        feature.setFeatureId( rte->id );
-        result = true;
-
         // some wkb voodoo
-        if ( mFetchGeom )
-        {
-          int nPoints = rte->points.size();
-          char* geo = new char[9 + 16 * nPoints];
-          std::memset( geo, 0, 9 + 16 * nPoints );
-          geo[0] = QgsApplication::endian();
-          geo[geo[0] == QgsApplication::NDR ? 1 : 4] = QGis::WKBLineString;
-          std::memcpy( geo + 5, &nPoints, 4 );
-          for ( uint i = 0; i < rte->points.size(); ++i )
+	int nPoints = rte->points.size();
+	char* geo = new char[9 + 16 * nPoints];
+	std::memset( geo, 0, 9 + 16 * nPoints );
+	geo[0] = QgsApplication::endian();
+	geo[geo[0] == QgsApplication::NDR ? 1 : 4] = QGis::WKBLineString;
+	std::memcpy( geo + 5, &nPoints, 4 );
+	for ( uint i = 0; i < rte->points.size(); ++i )
           {
             std::memcpy( geo + 9 + 16 * i, &rte->points[i].lon, sizeof( double ) );
             std::memcpy( geo + 9 + 16 * i + 8, &rte->points[i].lat, sizeof( double ) );
           }
-          feature.setGeometryAndOwnership(( unsigned char * )geo, 9 + 16 * nPoints );
-        }
-        feature.setValid( true );
 
-        // add attributes if they are wanted
-        for ( iter = mAttributesToFetch.begin(); iter != mAttributesToFetch.end(); ++iter )
-        {
-          switch ( *iter )
-          {
-            case NameAttr:
-              feature.addAttribute( NameAttr, QVariant( rte->name ) );
-              break;
-            case NumAttr:
-              if ( rte->number != std::numeric_limits<int>::max() )
-                feature.addAttribute( NumAttr, QVariant( rte->number ) );
-              break;
-            case CmtAttr:
-              feature.addAttribute( CmtAttr, QVariant( rte->cmt ) );
-              break;
-            case DscAttr:
-              feature.addAttribute( DscAttr, QVariant( rte->desc ) );
-              break;
-            case SrcAttr:
-              feature.addAttribute( SrcAttr, QVariant( rte->src ) );
-              break;
-            case URLAttr:
-              feature.addAttribute( URLAttr, QVariant( rte->url ) );
-              break;
-            case URLNameAttr:
-              feature.addAttribute( URLNameAttr, QVariant( rte->urlname ) );
-              break;
-          }
-        }
+	//create QgsGeometry and use it for intersection test
+	//if geometry is to be fetched, it is attached to the feature, otherwise we delete it
+	QgsGeometry* theGeometry = new QgsGeometry();
+	theGeometry->setWkbAndOwnership(( unsigned char * )geo, 9 + 16 * nPoints);
+	bool intersection = theGeometry->intersects(b);//use geos for precise intersection test
+	
+        if(!intersection)
+	  {
+	    delete theGeometry;
+	  }  
+	else
+	  {
+	    if(mFetchGeom)
+	      {
+		feature.setGeometry(theGeometry);
+	      }
+	    else
+	      {
+		delete theGeometry;
+	      }
+	    feature.setFeatureId( rte->id );
+	    result = true;
+	    feature.setValid( true );
+	    
+	    // add attributes if they are wanted
+	    for ( iter = mAttributesToFetch.begin(); iter != mAttributesToFetch.end(); ++iter )
+	      {
+		switch ( *iter )
+		  {
+		  case NameAttr:
+		    feature.addAttribute( NameAttr, QVariant( rte->name ) );
+		    break;
+		  case NumAttr:
+		    if ( rte->number != std::numeric_limits<int>::max() )
+		      feature.addAttribute( NumAttr, QVariant( rte->number ) );
+		    break;
+		  case CmtAttr:
+		    feature.addAttribute( CmtAttr, QVariant( rte->cmt ) );
+		    break;
+		  case DscAttr:
+		    feature.addAttribute( DscAttr, QVariant( rte->desc ) );
+		    break;
+		  case SrcAttr:
+		    feature.addAttribute( SrcAttr, QVariant( rte->src ) );
+		    break;
+		  case URLAttr:
+		    feature.addAttribute( URLAttr, QVariant( rte->url ) );
+		    break;
+		  case URLNameAttr:
+		    feature.addAttribute( URLNameAttr, QVariant( rte->urlname ) );
+		    break;
+		  }
+	      }
 
-        ++mRteIter;
-        break;
+	    ++mRteIter;
+	    break;
+	    
+	  }
+
+        //++mRteIter;
+        //xbreak;
       }
     }
   }
@@ -295,71 +317,90 @@
       if (( trk->xMax >= b.xMin() ) && ( trk->xMin <= b.xMax() ) &&
           ( trk->yMax >= b.yMin() ) && ( trk->yMin <= b.yMax() ) )
       {
-        feature.setFeatureId( trk->id );
-        result = true;
-
         // some wkb voodoo
-        if ( mFetchGeom )
-        {
-          char* geo = new char[9 + 16 * totalPoints];
-          if ( !geo )
+	char* geo = new char[9 + 16 * totalPoints];
+	if ( !geo )
           {
             QgsDebugMsg( "Too large track!!!" );
             return false;
           }
-          std::memset( geo, 0, 9 + 16 * totalPoints );
-          geo[0] = QgsApplication::endian();
-          geo[geo[0] == QgsApplication::NDR ? 1 : 4] = QGis::WKBLineString;
-          std::memcpy( geo + 5, &totalPoints, 4 );
-
-          int thisPoint = 0;
-          for ( std::vector<TrackSegment>::size_type k = 0; k < trk->segments.size(); k++ )
+	std::memset( geo, 0, 9 + 16 * totalPoints );
+	geo[0] = QgsApplication::endian();
+	geo[geo[0] == QgsApplication::NDR ? 1 : 4] = QGis::WKBLineString;
+	std::memcpy( geo + 5, &totalPoints, 4 );
+	
+	int thisPoint = 0;
+	for ( std::vector<TrackSegment>::size_type k = 0; k < trk->segments.size(); k++ )
           {
             int nPoints = trk->segments[k].points.size();
             for ( int i = 0; i < nPoints; ++i )
-            {
-              std::memcpy( geo + 9 + 16 * thisPoint,     &trk->segments[k].points[i].lon, sizeof( double ) );
-              std::memcpy( geo + 9 + 16 * thisPoint + 8, &trk->segments[k].points[i].lat, sizeof( double ) );
-              thisPoint++;
-            }
+	      {
+		std::memcpy( geo + 9 + 16 * thisPoint,     &trk->segments[k].points[i].lon, sizeof( double ) );
+		std::memcpy( geo + 9 + 16 * thisPoint + 8, &trk->segments[k].points[i].lat, sizeof( double ) );
+		thisPoint++;
+	      }
           }
-          feature.setGeometryAndOwnership(( unsigned char * )geo, 9 + 16 * totalPoints );
-        }
-        feature.setValid( true );
 
-        // add attributes if they are wanted
-        for ( iter = mAttributesToFetch.begin(); iter != mAttributesToFetch.end(); ++iter )
-        {
-          switch ( *iter )
-          {
-            case NameAttr:
-              feature.addAttribute( NameAttr, QVariant( trk->name ) );
-              break;
-            case NumAttr:
-              if ( trk->number != std::numeric_limits<int>::max() )
-                feature.addAttribute( NumAttr, QVariant( trk->number ) );
-              break;
-            case CmtAttr:
-              feature.addAttribute( CmtAttr, QVariant( trk->cmt ) );
-              break;
-            case DscAttr:
-              feature.addAttribute( DscAttr, QVariant( trk->desc ) );
-              break;
-            case SrcAttr:
-              feature.addAttribute( SrcAttr, QVariant( trk->src ) );
-              break;
-            case URLAttr:
-              feature.addAttribute( URLAttr, QVariant( trk->url ) );
-              break;
-            case URLNameAttr:
-              feature.addAttribute( URLNameAttr, QVariant( trk->urlname ) );
-              break;
-          }
-        }
+	//create QgsGeometry and use it for intersection test
+	//if geometry is to be fetched, it is attached to the feature, otherwise we delete it
+	QgsGeometry* theGeometry = new QgsGeometry();
+	theGeometry->setWkbAndOwnership(( unsigned char * )geo, 9 + 16 * totalPoints);
+	bool intersection = theGeometry->intersects(b);//use geos for precise intersection test
 
-        ++mTrkIter;
-        break;
+	if(!intersection) //no intersection, delete geometry and move on
+	  {
+	    delete theGeometry;
+	  }
+	else //intersection
+	  {
+	    if(mFetchGeom)
+	      {
+		feature.setGeometry(theGeometry);
+	      }
+	    else
+	      {
+		delete theGeometry;
+	      }
+	    feature.setFeatureId( trk->id );
+	    result = true;
+	    
+	    feature.setValid( true );
+	    
+	    // add attributes if they are wanted
+	    for ( iter = mAttributesToFetch.begin(); iter != mAttributesToFetch.end(); ++iter )
+	      {
+		switch ( *iter )
+		  {
+		  case NameAttr:
+		    feature.addAttribute( NameAttr, QVariant( trk->name ) );
+		    break;
+		  case NumAttr:
+		    if ( trk->number != std::numeric_limits<int>::max() )
+		      feature.addAttribute( NumAttr, QVariant( trk->number ) );
+		    break;
+		  case CmtAttr:
+		    feature.addAttribute( CmtAttr, QVariant( trk->cmt ) );
+		    break;
+		  case DscAttr:
+		    feature.addAttribute( DscAttr, QVariant( trk->desc ) );
+		    break;
+		  case SrcAttr:
+		    feature.addAttribute( SrcAttr, QVariant( trk->src ) );
+		    break;
+		  case URLAttr:
+		    feature.addAttribute( URLAttr, QVariant( trk->url ) );
+		    break;
+		  case URLNameAttr:
+		    feature.addAttribute( URLNameAttr, QVariant( trk->urlname ) );
+		    break;
+		  }
+	      }
+
+	    ++mTrkIter;
+	    break;
+	  }
       }
+      
     }
   }
   return result;
@@ -370,6 +411,9 @@
                              bool fetchGeometry,
                              bool useIntersect )
 {
+  delete mSelectionRectangle; 
+  mSelectionRectangle = 0;
+  
   if ( rect.isEmpty() )
   {
     mSelectionRectangle = new QgsRect( extent() );



More information about the QGIS-commit mailing list