29 #include <QProgressDialog>
32 double tolerance,
bool onlySelectedFeatures, QProgressDialog* p )
52 if ( onlySelectedFeatures )
58 p->setMaximum( selection.size() );
61 int processedFeatures = 0;
62 QgsFeatureIds::const_iterator it = selection.constBegin();
63 for ( ; it != selection.constEnd(); ++it )
67 p->setValue( processedFeatures );
70 if ( p && p->wasCanceled() )
74 if ( !layer->
featureAtId( *it, currentFeature,
true,
true ) )
84 p->setValue( selection.size() );
96 p->setMaximum( featureCount );
98 int processedFeatures = 0;
104 p->setValue( processedFeatures );
106 if ( p && p->wasCanceled() )
115 p->setValue( featureCount );
127 if ( !featureGeometry )
132 tmpGeometry = featureGeometry->
simplify( tolerance );
146 bool onlySelectedFeatures, QProgressDialog* p )
166 if ( onlySelectedFeatures )
172 p->setMaximum( selection.size() );
175 int processedFeatures = 0;
176 QgsFeatureIds::const_iterator it = selection.constBegin();
177 for ( ; it != selection.constEnd(); ++it )
181 p->setValue( processedFeatures );
184 if ( p && p->wasCanceled() )
188 if ( !layer->
featureAtId( *it, currentFeature,
true,
true ) )
198 p->setValue( selection.size() );
209 p->setMaximum( featureCount );
211 int processedFeatures = 0;
217 p->setValue( processedFeatures );
219 if ( p && p->wasCanceled() )
228 p->setValue( featureCount );
241 if ( !featureGeometry )
246 tmpGeometry = featureGeometry->
centroid();
260 bool onlySelectedFeatures, QProgressDialog* p )
277 fields.insert( 0 ,
QgsField( QString(
"MINX" ), QVariant::Double ) );
278 fields.insert( 1 ,
QgsField( QString(
"MINY" ), QVariant::Double ) );
279 fields.insert( 2 ,
QgsField( QString(
"MAXX" ), QVariant::Double ) );
280 fields.insert( 3 ,
QgsField( QString(
"MAXY" ), QVariant::Double ) );
281 fields.insert( 4 ,
QgsField( QString(
"CNTX" ), QVariant::Double ) );
282 fields.insert( 5 ,
QgsField( QString(
"CNTY" ), QVariant::Double ) );
283 fields.insert( 6 ,
QgsField( QString(
"AREA" ), QVariant::Double ) );
284 fields.insert( 7 ,
QgsField( QString(
"PERIM" ), QVariant::Double ) );
285 fields.insert( 8 ,
QgsField( QString(
"HEIGHT" ), QVariant::Double ) );
286 fields.insert( 9 ,
QgsField( QString(
"WIDTH" ), QVariant::Double ) );
291 if ( onlySelectedFeatures )
301 double miny = rect.yMinimum();
302 double maxx = rect.xMaximum();
303 double maxy = rect.yMaximum();
304 double height = rect.height();
305 double width = rect.width();
306 double cntx = minx + ( width / 2.0 );
307 double cnty = miny + ( height / 2.0 );
308 double area = width * height;
309 double perim = ( 2 * width ) + ( 2 * height );
313 map.insert( 0 , QVariant( minx ) );
314 map.insert( 1 , QVariant( miny ) );
315 map.insert( 2 , QVariant( maxx ) );
316 map.insert( 3 , QVariant( maxy ) );
317 map.insert( 4 , QVariant( cntx ) );
318 map.insert( 5 , QVariant( cnty ) );
319 map.insert( 6 , QVariant( area ) );
320 map.insert( 7 , QVariant( perim ) );
321 map.insert( 8 , QVariant( height ) );
322 map.insert( 9 , QVariant( width ) );
325 vWriter.addFeature( feat );
336 list.append( pt.
x() );
337 list.append( pt.
y() );
342 list.append( measure.
measure( mpGeometry ) );
346 list.append( perim );
358 QgsMultiPolygon::iterator it;
359 QgsPolygon::iterator jt;
360 for ( it = poly.begin(); it != poly.end(); ++it )
362 for ( jt = it->begin(); jt != it->end(); ++jt )
370 QgsPolygon::iterator jt;
372 for ( jt = poly.begin(); jt != poly.end(); ++jt )
381 bool onlySelectedFeatures,
int uniqueIdField, QProgressDialog* p )
392 bool useField =
false;
393 if ( uniqueIdField == -1 )
402 fields.insert( 0 ,
QgsField( QString(
"UID" ), QVariant::String ) );
403 fields.insert( 1 ,
QgsField( QString(
"AREA" ), QVariant::Double ) );
404 fields.insert( 2 ,
QgsField( QString(
"PERIM" ), QVariant::Double ) );
412 QMultiMap<QString, int> map;
414 if ( onlySelectedFeatures )
418 QgsFeatureIds::const_iterator it = selection.constBegin();
419 for ( ; it != selection.constEnd(); ++it )
424 p->setValue( processedFeatures );
426 if ( p && p->wasCanceled() )
432 if ( !layer->
featureAtId( *it, currentFeature,
true,
true ) )
436 map.insert( currentFeature.attributeMap()[ uniqueIdField ].toString(), currentFeature.id() );
447 p->setValue( processedFeatures );
449 if ( p && p->wasCanceled() )
455 map.insert( currentFeature.attributeMap()[ uniqueIdField ].toString(), currentFeature.id() );
459 QMultiMap<QString, int>::const_iterator jt = map.constBegin();
460 while ( jt != map.constEnd() )
462 QString currentKey = jt.key();
463 int processedFeatures = 0;
465 if ( onlySelectedFeatures )
471 p->setMaximum( selection.size() );
473 processedFeatures = 0;
474 while ( jt != map.constEnd() && ( jt.key() == currentKey || !useField ) )
476 if ( p && p->wasCanceled() )
480 if ( selection.contains( jt.value() ) )
484 p->setValue( processedFeatures );
486 if ( !layer->
featureAtId( jt.value(), currentFeature,
true, true ) )
490 convexFeature( currentFeature, processedFeatures, &dissolveGeometry );
495 QList<double> values;
496 if ( !dissolveGeometry )
498 QgsDebugMsg(
"no dissolved geometry - should not happen" );
501 dissolveGeometry = dissolveGeometry->
convexHull();
504 attributeMap.insert( 0 , QVariant( currentKey ) );
505 attributeMap.insert( 1 , values[ 0 ] );
506 attributeMap.insert( 2 , values[ 1 ] );
510 vWriter.addFeature( dissolveFeature );
518 p->setMaximum( featureCount );
520 processedFeatures = 0;
521 while ( jt != map.constEnd() && ( jt.key() == currentKey || !useField ) )
525 p->setValue( processedFeatures );
528 if ( p && p->wasCanceled() )
532 if ( !layer->
featureAtId( jt.value(), currentFeature,
true, true ) )
536 convexFeature( currentFeature, processedFeatures, &dissolveGeometry );
540 QList<double> values;
542 if ( !dissolveGeometry )
544 QgsDebugMsg(
"no dissolved geometry - should not happen" );
547 dissolveGeometry = dissolveGeometry->
convexHull();
551 attributeMap.insert( 0 , QVariant( currentKey ) );
552 attributeMap.insert( 1 , QVariant( values[ 0 ] ) );
553 attributeMap.insert( 2 , QVariant( values[ 1 ] ) );
557 vWriter.addFeature( dissolveFeature );
570 if ( !featureGeometry )
575 convexGeometry = featureGeometry->
convexHull();
577 if ( nProcessedFeatures == 0 )
579 *dissolveGeometry = convexGeometry;
583 tmpGeometry = *dissolveGeometry;
584 *dissolveGeometry = ( *dissolveGeometry )->
combine( convexGeometry );
586 delete convexGeometry;
591 bool onlySelectedFeatures,
int uniqueIdField, QProgressDialog* p )
602 bool useField =
false;
603 if ( uniqueIdField == -1 )
617 QMultiMap<QString, int> map;
619 if ( onlySelectedFeatures )
623 QgsFeatureIds::const_iterator it = selection.constBegin();
624 for ( ; it != selection.constEnd(); ++it )
626 if ( !layer->
featureAtId( *it, currentFeature,
true,
true ) )
630 map.insert( currentFeature.attributeMap()[ uniqueIdField ].toString(), currentFeature.id() );
638 map.insert( currentFeature.attributeMap()[ uniqueIdField ].toString(), currentFeature.id() );
643 QMultiMap<QString, int>::const_iterator jt = map.constBegin();
645 while ( jt != map.constEnd() )
647 QString currentKey = jt.key();
648 int processedFeatures = 0;
651 if ( onlySelectedFeatures )
657 p->setMaximum( selection.size() );
659 while ( jt != map.constEnd() && ( jt.key() == currentKey || !useField ) )
661 if ( p && p->wasCanceled() )
665 if ( selection.contains( jt.value() ) )
669 p->setValue( processedFeatures );
671 if ( !layer->
featureAtId( jt.value(), currentFeature,
true, true ) )
680 dissolveFeature( currentFeature, processedFeatures, &dissolveGeometry );
692 p->setMaximum( featureCount );
694 while ( jt != map.constEnd() && ( jt.key() == currentKey || !useField ) )
698 p->setValue( processedFeatures );
701 if ( p && p->wasCanceled() )
705 if ( !layer->
featureAtId( jt.value(), currentFeature,
true, true ) )
713 dissolveFeature( currentFeature, processedFeatures, &dissolveGeometry );
719 vWriter.addFeature( outputFeature );
728 if ( !featureGeometry )
733 if ( nProcessedFeatures == 0 )
735 int geomSize = featureGeometry->
wkbSize();
737 unsigned char* wkb =
new unsigned char[geomSize];
738 memcpy( wkb, featureGeometry->
asWkb(), geomSize );
739 ( *dissolveGeometry )->fromWkb( wkb, geomSize );
743 *dissolveGeometry = ( *dissolveGeometry )->
combine( featureGeometry );
748 bool onlySelectedFeatures,
bool dissolve,
int bufferDistanceField, QProgressDialog* p )
773 if ( onlySelectedFeatures )
779 p->setMaximum( selection.size() );
782 int processedFeatures = 0;
783 QgsFeatureIds::const_iterator it = selection.constBegin();
784 for ( ; it != selection.constEnd(); ++it )
788 p->setValue( processedFeatures );
791 if ( p && p->wasCanceled() )
795 if ( !layer->
featureAtId( *it, currentFeature,
true,
true ) )
799 bufferFeature( currentFeature, processedFeatures, &vWriter, dissolve, &dissolveGeometry, bufferDistance, bufferDistanceField );
805 p->setValue( selection.size() );
817 p->setMaximum( featureCount );
819 int processedFeatures = 0;
825 p->setValue( processedFeatures );
827 if ( p && p->wasCanceled() )
831 bufferFeature( currentFeature, processedFeatures, &vWriter, dissolve, &dissolveGeometry, bufferDistance, bufferDistanceField );
836 p->setValue( featureCount );
843 if ( !dissolveGeometry )
845 QgsDebugMsg(
"no dissolved geometry - should not happen" );
849 vWriter.addFeature( dissolveFeature );
855 QgsGeometry** dissolveGeometry,
double bufferDistance,
int bufferDistanceField )
857 double currentBufferDistance;
862 if ( !featureGeometry )
868 if ( bufferDistanceField == -1 )
870 currentBufferDistance = bufferDistance;
874 currentBufferDistance = f.
attributeMap()[bufferDistanceField].toDouble();
876 bufferGeometry = featureGeometry->
buffer( currentBufferDistance, 5 );
880 if ( nProcessedFeatures == 0 )
882 *dissolveGeometry = bufferGeometry;
886 tmpGeometry = *dissolveGeometry;
887 *dissolveGeometry = ( *dissolveGeometry )->
combine( bufferGeometry );
889 delete bufferGeometry;