Skip to content

Commit df2b8b2

Browse files
author
homann
committed
Added planimetric measurement as an option, and made all areas positive.
git-svn-id: http://svn.osgeo.org/qgis/trunk@6534 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 0b21820 commit df2b8b2

File tree

2 files changed

+31
-18
lines changed

2 files changed

+31
-18
lines changed

src/app/qgsoptions.cpp

+7-3
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
#include <cassert>
3131
#include <iostream>
3232
#include <sqlite3.h>
33-
33+
#define ELLIPS_FLAT "NONE"
34+
#define ELLIPS_FLAT_DESC "None / Planimetric"
3435

3536
/**
3637
* \class QgsOptions - Set user options and preferences
@@ -332,6 +333,9 @@ void QgsOptions::getEllipsoidList()
332333
const char *myTail;
333334
sqlite3_stmt *myPreparedStatement;
334335
int myResult;
336+
337+
338+
cmbEllipsoid->insertItem(ELLIPS_FLAT_DESC);
335339
//check the db is available
336340
myResult = sqlite3_open(QgsApplication::qgisUserDbFilePath(), &myDatabase);
337341
if(myResult)
@@ -364,7 +368,7 @@ QString QgsOptions::getEllipsoidAcronym(QString theEllipsoidName)
364368
const char *myTail;
365369
sqlite3_stmt *myPreparedStatement;
366370
int myResult;
367-
QString myName;
371+
QString myName(ELLIPS_FLAT);
368372
//check the db is available
369373
myResult = sqlite3_open(QgsApplication::qgisUserDbFilePath(), &myDatabase);
370374
if(myResult)
@@ -396,7 +400,7 @@ QString QgsOptions::getEllipsoidName(QString theEllipsoidAcronym)
396400
const char *myTail;
397401
sqlite3_stmt *myPreparedStatement;
398402
int myResult;
399-
QString myName;
403+
QString myName(ELLIPS_FLAT_DESC);
400404
//check the db is available
401405
myResult = sqlite3_open(QgsApplication::qgisUserDbFilePath(), &myDatabase);
402406
if(myResult)

src/core/qgsdistancearea.cpp

+24-15
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@ bool QgsDistanceArea::setEllipsoid(const QString& ellipsoid)
7878
const char *myTail;
7979
sqlite3_stmt *myPreparedStatement;
8080
int myResult;
81+
82+
// Shortcut if ellipsoid is none.
83+
if (ellipsoid == "NONE")
84+
{
85+
mEllipsoid = "NONE";
86+
return true;
87+
}
88+
8189
//check the db is available
8290
myResult = sqlite3_open(QString(QgsApplication::qgisUserDbFilePath()).latin1(), &myDatabase);
8391
if(myResult)
@@ -248,14 +256,14 @@ double QgsDistanceArea::measureLine(const std::vector<QgsPoint>& points)
248256

249257
try
250258
{
251-
if (mProjectionsEnabled)
259+
if (mProjectionsEnabled && (mEllipsoid != "NONE"))
252260
p1 = mCoordTransform->transform(points[0]);
253261
else
254262
p1 = points[0];
255263

256264
for (std::vector<QgsPoint>::size_type i = 1; i < points.size(); i++)
257265
{
258-
if (mProjectionsEnabled)
266+
if (mProjectionsEnabled && (mEllipsoid != "NONE"))
259267
{
260268
p2 = mCoordTransform->transform(points[i]);
261269
total += computeDistanceBearing(p1,p2);
@@ -284,7 +292,7 @@ double QgsDistanceArea::measureLine(const QgsPoint& p1, const QgsPoint& p2)
284292
try
285293
{
286294
QgsPoint pp1 = p1, pp2 = p2;
287-
if (mProjectionsEnabled)
295+
if (mProjectionsEnabled && (mEllipsoid != "NONE"))
288296
{
289297
pp1 = mCoordTransform->transform(p1);
290298
pp2 = mCoordTransform->transform(p2);
@@ -336,7 +344,7 @@ unsigned char* QgsDistanceArea::measurePolygon(unsigned char* feature, double* a
336344
ptr += sizeof(double);
337345

338346
points[jdx] = QgsPoint(x,y);
339-
if (mProjectionsEnabled)
347+
if (mProjectionsEnabled && (mEllipsoid != "NONE"))
340348
{
341349
points[jdx] = mCoordTransform->transform(points[jdx]);
342350
}
@@ -366,7 +374,7 @@ double QgsDistanceArea::measurePolygon(const std::vector<QgsPoint>& points)
366374

367375
try
368376
{
369-
if (mProjectionsEnabled)
377+
if (mProjectionsEnabled && (mEllipsoid != "NONE"))
370378
{
371379
std::vector<QgsPoint> pts(points.size());
372380
for (std::vector<QgsPoint>::size_type i = 0; i < points.size(); i++)
@@ -391,7 +399,7 @@ double QgsDistanceArea::measurePolygon(const std::vector<QgsPoint>& points)
391399
double QgsDistanceArea::getBearing(const QgsPoint& p1, const QgsPoint& p2)
392400
{
393401
QgsPoint pp1 = p1, pp2 = p2;
394-
if (mProjectionsEnabled)
402+
if (mProjectionsEnabled && (mEllipsoid != "NONE"))
395403
{
396404
pp1 = mCoordTransform->transform(p1);
397405
pp2 = mCoordTransform->transform(p2);
@@ -538,7 +546,8 @@ double QgsDistanceArea::computePolygonArea(const std::vector<QgsPoint>& points)
538546
double Qbar1, Qbar2;
539547
double area;
540548

541-
if (! mProjectionsEnabled)
549+
QgsDebugMsg("Ellipsoid: " + mEllipsoid);
550+
if ((! mProjectionsEnabled) || (mEllipsoid == "NONE"))
542551
{
543552
return computePolygonFlatArea(points);
544553
}
@@ -604,7 +613,7 @@ double QgsDistanceArea::computePolygonFlatArea(const std::vector<QgsPoint>& poin
604613
}
605614
// QgsDebugMsg("Area from point: " + (points[i % size]).stringRep(2));
606615
area = area / 2.0;
607-
return area;
616+
return fabs(area); // All areas are positive!
608617
}
609618

610619
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
617626
case QGis::METERS:
618627
if (isArea)
619628
{
620-
if (value > 1000000.0)
629+
if (fabs(value) > 1000000.0)
621630
{
622631
unitLabel = QObject::tr(" km2");
623632
value = value / 1000000.0;
624633
}
625-
else if (value > 1000.0)
634+
else if (fabs(value) > 1000.0)
626635
{
627636
unitLabel = QObject::tr(" ha");
628637
value = value / 10000.0;
@@ -634,17 +643,17 @@ QString QgsDistanceArea::textUnit(double value, int decimals, QGis::units u, boo
634643
}
635644
else
636645
{
637-
if (value > 1000.0)
646+
if (fabs(value) > 1000.0)
638647
{
639648
unitLabel=QObject::tr(" km");
640649
value = value/1000;
641650
}
642-
else if (value < 0.01)
651+
else if (fabs(value) < 0.01)
643652
{
644653
unitLabel=QObject::tr(" mm");
645654
value = value*1000;
646655
}
647-
else if (value < 0.1)
656+
else if (fabs(value) < 0.1)
648657
{
649658
unitLabel=QObject::tr(" cm");
650659
value = value*100;
@@ -662,7 +671,7 @@ QString QgsDistanceArea::textUnit(double value, int decimals, QGis::units u, boo
662671
}
663672
else
664673
{
665-
if (value == 1.0)
674+
if (fabs(value) == 1.0)
666675
unitLabel=QObject::tr(" foot");
667676
else
668677
unitLabel=QObject::tr(" feet");
@@ -675,7 +684,7 @@ QString QgsDistanceArea::textUnit(double value, int decimals, QGis::units u, boo
675684
}
676685
else
677686
{
678-
if (value == 1.0)
687+
if (fabs(value) == 1.0)
679688
unitLabel=QObject::tr(" degree");
680689
else
681690
unitLabel=QObject::tr(" degrees");

0 commit comments

Comments
 (0)