Skip to content

Commit f5ba57c

Browse files
author
homann
committedJan 21, 2007
Hack #2 for measuring. Localized numbers, added hectares (ha),
centralized pretty printing of units and made special cases for projection on and projection off. git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@6450 c8812cc2-4d05-0410-92ff-de0c093fc19c

File tree

4 files changed

+129
-66
lines changed

4 files changed

+129
-66
lines changed
 

‎src/app/qgsmaptoolidentify.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ void QgsMapToolIdentify::identifyVectorLayer(QgsVectorLayer* layer, const QgsPoi
215215

216216
// init distance/area calculator
217217
QgsDistanceArea calc;
218-
calc.setProjectionsEnabled(TRUE); // always project
218+
calc.setProjectionsEnabled(mCanvas->projectionsEnabled()); // project?
219219
calc.setEllipsoid(ellipsoid);
220220
calc.setSourceSRS(layer->srs().srsid());
221221

@@ -265,15 +265,13 @@ void QgsMapToolIdentify::identifyVectorLayer(QgsVectorLayer* layer, const QgsPoi
265265
if (layer->vectorType() == QGis::Line)
266266
{
267267
double dist = calc.measure(feat.geometry());
268-
QString str = QString::number(dist/1000, 'f', 3);
269-
str += " km";
268+
QString str = calc.textUnit(dist, 3, mCanvas->mapUnits(), false);
270269
mResults->addDerivedAttribute(featureNode, QObject::tr("Length"), str);
271270
}
272271
else if (layer->vectorType() == QGis::Polygon)
273272
{
274273
double area = calc.measure(feat.geometry());
275-
QString str = QString::number(area/1000000, 'f', 3);
276-
str += " km^2";
274+
QString str = calc.textUnit(area, 3, mCanvas->mapUnits(), true);
277275
mResults->addDerivedAttribute(featureNode, QObject::tr("Area"), str);
278276
}
279277

‎src/app/qgsmeasure.cpp

Lines changed: 9 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
#include "QMessageBox"
2929
#include <QSettings>
30+
#include <QLocale>
3031
#include <iostream>
3132

3233

@@ -184,12 +185,11 @@ void QgsMeasure::addPoint(QgsPoint &point)
184185
editTotal->setText(formatDistance(mTotal));
185186

186187

187-
int row = mPoints.size()-2;
188-
mTable->setText(row, 0, QString::number(d, 'f',1));
189-
//mTable->setText ( row, 1, QString::number(mTotal) );
188+
int row = mPoints.size()-2;
189+
mTable->setText(row, 0, QLocale::system().toString(d, 'f', 2));
190190
mTable->setNumRows ( mPoints.size() );
191191

192-
mTable->setText(row + 1, 0, QString::number(0, 'f',1));
192+
mTable->setText(row + 1, 0, QLocale::system().toString(0.0, 'f', 2));
193193
mTable->ensureCellVisible(row + 1,0);
194194
}
195195

@@ -232,7 +232,8 @@ void QgsMeasure::mouseMove(QgsPoint &point)
232232
QgsPoint p1 = tmpPoints[last], p2 = tmpPoints[last+1];
233233

234234
double d = mCanvas->mapRender()->distArea()->measureLine(p1,p2);
235-
mTable->setText(last, 0, QString::number(d, 'f',1));
235+
//mTable->setText(last, 0, QString::number(d, 'f',1));
236+
mTable->setText(last, 0, QLocale::system().toString(d, 'f', 2));
236237
editTotal->setText(formatDistance(mTotal + d));
237238
}
238239
}
@@ -299,66 +300,13 @@ QString QgsMeasure::formatDistance(double distance)
299300
QString unitLabel;
300301

301302
QGis::units myMapUnits = mCanvas->mapUnits();
302-
switch (myMapUnits)
303-
{
304-
case QGis::METERS:
305-
if (distance > 1000.0)
306-
{
307-
unitLabel=tr(" km");
308-
distance = distance/1000;
309-
}
310-
else if (distance < 0.01)
311-
{
312-
unitLabel=tr(" mm");
313-
distance = distance*1000;
314-
}
315-
else if (distance < 0.1)
316-
{
317-
unitLabel=tr(" cm");
318-
distance = distance*100;
319-
}
320-
else
321-
unitLabel=tr(" m");
322-
break;
323-
case QGis::FEET:
324-
if (distance == 1.0)
325-
unitLabel=tr(" foot");
326-
else
327-
unitLabel=tr(" feet");
328-
break;
329-
case QGis::DEGREES:
330-
if (distance == 1.0)
331-
unitLabel=tr(" degree");
332-
else
333-
unitLabel=tr(" degrees");
334-
break;
335-
case QGis::UNKNOWN:
336-
unitLabel=tr(" unknown");
337-
default:
338-
std::cout << "Error: not picked up map units - actual value = "
339-
<< myMapUnits << std::endl;
340-
};
341-
342-
txt = QString::number(distance,'f',1);
343-
txt += unitLabel;
344-
345-
return txt;
303+
return QgsDistanceArea::textUnit(distance, 2, myMapUnits, false);
346304
}
347305

348306
QString QgsMeasure::formatArea(double area)
349307
{
350-
QString txt;
351-
if (area < 10000)
352-
{
353-
txt = QString::number(area,'f',0);
354-
txt += " m2";
355-
}
356-
else
357-
{
358-
txt = QString::number(area/1000000,'f',3);
359-
txt += " km2";
360-
}
361-
return txt;
308+
QGis::units myMapUnits = mCanvas->mapUnits();
309+
return QgsDistanceArea::textUnit(area, 2, myMapUnits, true);
362310
}
363311

364312
void QgsMeasure::updateUi()

‎src/core/qgsdistancearea.cpp

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
#include <cmath>
1818
#include <sqlite3.h>
1919
#include <QDir>
20+
#include <QString>
21+
#include <QLocale>
22+
#include <QObject>
2023

2124
#include "qgis.h"
2225
#include "qgspoint.h"
@@ -529,6 +532,10 @@ double QgsDistanceArea::computePolygonArea(const std::vector<QgsPoint>& points)
529532
double Qbar1, Qbar2;
530533
double area;
531534

535+
if (! mProjectionsEnabled)
536+
{
537+
return computePolygonFlatArea(points);
538+
}
532539
int n = points.size();
533540
x2 = DEG2RAD(points[n-1].x());
534541
y2 = DEG2RAD(points[n-1].y());
@@ -573,3 +580,109 @@ double QgsDistanceArea::computePolygonArea(const std::vector<QgsPoint>& points)
573580
return area;
574581
}
575582

583+
double QgsDistanceArea::computePolygonFlatArea(const std::vector<QgsPoint>& points)
584+
{
585+
// Normal plane area calculations.
586+
double area = 0.0;
587+
int i, size;
588+
589+
size = points.size();
590+
591+
// QgsDebugMsg("New area calc, nr of points: " + QString::number(size));
592+
for(i = 0; i < size; i++)
593+
{
594+
// QgsDebugMsg("Area from point: " + (points[i]).stringRep(2));
595+
// Using '% size', so that we always end with the starting point
596+
// and thus close the polygon.
597+
area = area + points[i].x()*points[(i+1) % size].y() - points[(i+1) % size].x()*points[i].y();
598+
}
599+
// QgsDebugMsg("Area from point: " + (points[i % size]).stringRep(2));
600+
area = area / 2.0;
601+
return area;
602+
}
603+
604+
QString QgsDistanceArea::textUnit(double value, int decimals, QGis::units u, bool isArea)
605+
{
606+
QString unitLabel;
607+
608+
609+
switch (u)
610+
{
611+
case QGis::METERS:
612+
if (isArea)
613+
{
614+
if (value > 1000000.0)
615+
{
616+
unitLabel = QObject::tr(" km2");
617+
value = value / 1000000.0;
618+
}
619+
else if (value > 1000.0)
620+
{
621+
unitLabel = QObject::tr(" ha");
622+
value = value / 10000.0;
623+
}
624+
else
625+
{
626+
unitLabel = QObject::tr(" m2");
627+
}
628+
}
629+
else
630+
{
631+
if (value > 1000.0)
632+
{
633+
unitLabel=QObject::tr(" km");
634+
value = value/1000;
635+
}
636+
else if (value < 0.01)
637+
{
638+
unitLabel=QObject::tr(" mm");
639+
value = value*1000;
640+
}
641+
else if (value < 0.1)
642+
{
643+
unitLabel=QObject::tr(" cm");
644+
value = value*100;
645+
}
646+
else
647+
{
648+
unitLabel=QObject::tr(" m");
649+
}
650+
}
651+
break;
652+
case QGis::FEET:
653+
if (isArea)
654+
{
655+
unitLabel = QObject::tr(" sq ft");
656+
}
657+
else
658+
{
659+
if (value == 1.0)
660+
unitLabel=QObject::tr(" foot");
661+
else
662+
unitLabel=QObject::tr(" feet");
663+
}
664+
break;
665+
case QGis::DEGREES:
666+
if (isArea)
667+
{
668+
unitLabel = QObject::tr(" sq.deg.");
669+
}
670+
else
671+
{
672+
if (value == 1.0)
673+
unitLabel=QObject::tr(" degree");
674+
else
675+
unitLabel=QObject::tr(" degrees");
676+
}
677+
break;
678+
case QGis::UNKNOWN:
679+
unitLabel=QObject::tr(" unknown");
680+
default:
681+
std::cout << "Error: not picked up map units - actual value = "
682+
<< u << std::endl;
683+
};
684+
685+
686+
return QLocale::system().toString(value, 'f', decimals) + unitLabel;
687+
688+
}

‎src/core/qgsdistancearea.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ class CORE_EXPORT QgsDistanceArea
8484
//! compute bearing - in radians
8585
double getBearing(const QgsPoint& p1, const QgsPoint& p2);
8686

87+
static QString textUnit(double value, int decimals, QGis::units u, bool isArea);
88+
8789
protected:
8890

8991
//! measures line distance, line points are extracted from WKB
@@ -111,6 +113,8 @@ class CORE_EXPORT QgsDistanceArea
111113
112114
*/
113115
double computePolygonArea(const std::vector<QgsPoint>& points);
116+
117+
double computePolygonFlatArea(const std::vector<QgsPoint>& points);
114118

115119
/**
116120
precalculates some values

0 commit comments

Comments
 (0)
Please sign in to comment.