@@ -78,6 +78,14 @@ bool QgsDistanceArea::setEllipsoid(const QString& ellipsoid)
78
78
const char *myTail;
79
79
sqlite3_stmt *myPreparedStatement;
80
80
int myResult;
81
+
82
+ // Shortcut if ellipsoid is none.
83
+ if (ellipsoid == " NONE" )
84
+ {
85
+ mEllipsoid = " NONE" ;
86
+ return true ;
87
+ }
88
+
81
89
// check the db is available
82
90
myResult = sqlite3_open (QString (QgsApplication::qgisUserDbFilePath ()).latin1 (), &myDatabase);
83
91
if (myResult)
@@ -248,14 +256,14 @@ double QgsDistanceArea::measureLine(const std::vector<QgsPoint>& points)
248
256
249
257
try
250
258
{
251
- if (mProjectionsEnabled )
259
+ if (mProjectionsEnabled && ( mEllipsoid != " NONE " ) )
252
260
p1 = mCoordTransform ->transform (points[0 ]);
253
261
else
254
262
p1 = points[0 ];
255
263
256
264
for (std::vector<QgsPoint>::size_type i = 1 ; i < points.size (); i++)
257
265
{
258
- if (mProjectionsEnabled )
266
+ if (mProjectionsEnabled && ( mEllipsoid != " NONE " ) )
259
267
{
260
268
p2 = mCoordTransform ->transform (points[i]);
261
269
total += computeDistanceBearing (p1,p2);
@@ -284,7 +292,7 @@ double QgsDistanceArea::measureLine(const QgsPoint& p1, const QgsPoint& p2)
284
292
try
285
293
{
286
294
QgsPoint pp1 = p1, pp2 = p2;
287
- if (mProjectionsEnabled )
295
+ if (mProjectionsEnabled && ( mEllipsoid != " NONE " ) )
288
296
{
289
297
pp1 = mCoordTransform ->transform (p1);
290
298
pp2 = mCoordTransform ->transform (p2);
@@ -336,7 +344,7 @@ unsigned char* QgsDistanceArea::measurePolygon(unsigned char* feature, double* a
336
344
ptr += sizeof (double );
337
345
338
346
points[jdx] = QgsPoint (x,y);
339
- if (mProjectionsEnabled )
347
+ if (mProjectionsEnabled && ( mEllipsoid != " NONE " ) )
340
348
{
341
349
points[jdx] = mCoordTransform ->transform (points[jdx]);
342
350
}
@@ -366,7 +374,7 @@ double QgsDistanceArea::measurePolygon(const std::vector<QgsPoint>& points)
366
374
367
375
try
368
376
{
369
- if (mProjectionsEnabled )
377
+ if (mProjectionsEnabled && ( mEllipsoid != " NONE " ) )
370
378
{
371
379
std::vector<QgsPoint> pts (points.size ());
372
380
for (std::vector<QgsPoint>::size_type i = 0 ; i < points.size (); i++)
@@ -391,7 +399,7 @@ double QgsDistanceArea::measurePolygon(const std::vector<QgsPoint>& points)
391
399
double QgsDistanceArea::getBearing (const QgsPoint& p1, const QgsPoint& p2)
392
400
{
393
401
QgsPoint pp1 = p1, pp2 = p2;
394
- if (mProjectionsEnabled )
402
+ if (mProjectionsEnabled && ( mEllipsoid != " NONE " ) )
395
403
{
396
404
pp1 = mCoordTransform ->transform (p1);
397
405
pp2 = mCoordTransform ->transform (p2);
@@ -538,7 +546,8 @@ double QgsDistanceArea::computePolygonArea(const std::vector<QgsPoint>& points)
538
546
double Qbar1, Qbar2;
539
547
double area;
540
548
541
- if (! mProjectionsEnabled )
549
+ QgsDebugMsg (" Ellipsoid: " + mEllipsoid );
550
+ if ((! mProjectionsEnabled ) || (mEllipsoid == " NONE" ))
542
551
{
543
552
return computePolygonFlatArea (points);
544
553
}
@@ -604,7 +613,7 @@ double QgsDistanceArea::computePolygonFlatArea(const std::vector<QgsPoint>& poin
604
613
}
605
614
// QgsDebugMsg("Area from point: " + (points[i % size]).stringRep(2));
606
615
area = area / 2.0 ;
607
- return area;
616
+ return fabs ( area); // All areas are positive!
608
617
}
609
618
610
619
QString QgsDistanceArea::textUnit (double value, int decimals, QGis::units u, bool isArea)
@@ -617,12 +626,12 @@ QString QgsDistanceArea::textUnit(double value, int decimals, QGis::units u, boo
617
626
case QGis::METERS:
618
627
if (isArea)
619
628
{
620
- if (value > 1000000.0 )
629
+ if (fabs ( value) > 1000000.0 )
621
630
{
622
631
unitLabel = QObject::tr (" km2" );
623
632
value = value / 1000000.0 ;
624
633
}
625
- else if (value > 1000.0 )
634
+ else if (fabs ( value) > 1000.0 )
626
635
{
627
636
unitLabel = QObject::tr (" ha" );
628
637
value = value / 10000.0 ;
@@ -634,17 +643,17 @@ QString QgsDistanceArea::textUnit(double value, int decimals, QGis::units u, boo
634
643
}
635
644
else
636
645
{
637
- if (value > 1000.0 )
646
+ if (fabs ( value) > 1000.0 )
638
647
{
639
648
unitLabel=QObject::tr (" km" );
640
649
value = value/1000 ;
641
650
}
642
- else if (value < 0.01 )
651
+ else if (fabs ( value) < 0.01 )
643
652
{
644
653
unitLabel=QObject::tr (" mm" );
645
654
value = value*1000 ;
646
655
}
647
- else if (value < 0.1 )
656
+ else if (fabs ( value) < 0.1 )
648
657
{
649
658
unitLabel=QObject::tr (" cm" );
650
659
value = value*100 ;
@@ -662,7 +671,7 @@ QString QgsDistanceArea::textUnit(double value, int decimals, QGis::units u, boo
662
671
}
663
672
else
664
673
{
665
- if (value == 1.0 )
674
+ if (fabs ( value) == 1.0 )
666
675
unitLabel=QObject::tr (" foot" );
667
676
else
668
677
unitLabel=QObject::tr (" feet" );
@@ -675,7 +684,7 @@ QString QgsDistanceArea::textUnit(double value, int decimals, QGis::units u, boo
675
684
}
676
685
else
677
686
{
678
- if (value == 1.0 )
687
+ if (fabs ( value) == 1.0 )
679
688
unitLabel=QObject::tr (" degree" );
680
689
else
681
690
unitLabel=QObject::tr (" degrees" );
0 commit comments