Brief description of class still missing. More...
#include <CoordReader.h>
Public Member Functions | |
CoordReader () | |
bool | hasInput () const |
bool | setOptions (int &argc, char **argv) |
bool | terminate () |
~CoordReader () | |
Protected Member Functions | |
virtual bool | parse (QTextStream &s) |
Brief description of class still missing.
Full description of class still missing
Description of constructor still missing
References TRACE.
: ArgumentStdinReader() { TRACE; _mode=None; _averageCount=0; _kml=0; _utmZone=0; _distanceStddev=0.01; // 1 cm _priorPrecision=5.0; // 2 m }
bool CoordReader::hasInput | ( | ) | const |
References TRACE.
Referenced by main().
{ TRACE; switch(_mode) { case Distance: case DistanceLookup: case DistanceGeo: case Azimuth: case AzimuthGeo: case FromGeo: case ToGeo: case FromDMS: case ToDMS: case FromDM: case ToDM: case ToUTM: case FromUTM: case ToKML: break; case FromKML: case GenerateCircle: return false; case Translate: case Rotate: case Localize: case Average: case Lookup: case TriangulateDistance: case TriangulateAzimuth: case FromDistances: case None: break; } return true; }
bool CoordReader::parse | ( | QTextStream & | s | ) | [protected, virtual] |
Implements QGpCoreTools::ArgumentStdinReader.
References TapePositioningSystem::Triangulator::addDistance(), QGpCoreTools::GoogleEarthKML::Folder::addPlacemark(), QGpCoreTools::Point2D::azimuthTo(), QGpCoreTools::Angle::cos(), QGpCoreTools::LineParser::count(), QGpCoreTools::Point2D::degreesToDM(), QGpCoreTools::Point2D::degreesToDMS(), QGpCoreTools::Point::distanceTo(), QGpCoreTools::Point2D::DMSToDegrees(), QGpCoreTools::Point2D::DMToDegrees(), QGpCoreTools::GoogleEarthKML::document(), QGpCoreTools::endl(), QGpCoreTools::NamedPoint::fromString(), QGpCoreTools::Point::fromString(), QGpCoreTools::Point2D::geographicalAzimuthTo(), QGpCoreTools::Point2D::geographicalDistanceTo(), QGpCoreTools::Point2D::geographicalToRectangular(), QGpCoreTools::Point2D::geographicalToUtm(), QGpCoreTools::GoogleEarthKML::Document::mainFolder(), QGpCoreTools::NamedPoint::name(), QGpCoreTools::Point2D::rectangularToGeographical(), QGpCoreTools::Point2D::rotate(), QGpCoreTools::GoogleEarthKML::Placemark::setCoordinates(), QGpCoreTools::Angle::setDegreeAzimuth(), QGpCoreTools::NamedPoint::setName(), QGpCoreTools::GoogleEarthKML::Placemark::setName(), QGpCoreTools::Point2D::setX(), QGpCoreTools::Point2D::setY(), QGpCoreTools::Angle::sin(), sOut(), QGpCoreTools::LineParser::toDouble(), QGpCoreTools::LineParser::toString(), QGpCoreTools::NamedPoint::toString(), QGpCoreTools::tr(), TRACE, QGpCoreTools::Point::translate(), QGpCoreTools::Point2D::utmToGeographical(), QGpCoreTools::Point2D::utmZoneIndex(), QGpCoreTools::Point2D::x(), and QGpCoreTools::Point2D::y().
{ TRACE; QTextStream sOut(stdout); QString buf; bool ok=true; while(!s.atEnd()) { buf=s.readLine(); if(!buf.isEmpty() && buf[0]!='\n' && buf[0]!='#') { switch(_mode) { case Distance: { LineParser par(buf); if(par.count()==6) { Point p1(par.toDouble(0,ok), par.toDouble(1,ok), par.toDouble(2,ok)); Point p2(par.toDouble(3,ok), par.toDouble(4,ok), par.toDouble(5,ok)); sOut << p1.distanceTo(p2) << endl; } else { Point p1(par.toDouble(0,ok), par.toDouble(1,ok)); Point p2(par.toDouble(2,ok), par.toDouble(3,ok)); sOut << p1.distanceTo(p2) << endl; } } break; case DistanceLookup: { LineParser par(buf); QString name1=par.toString(0,ok); QString name2=par.toString(1,ok); QMap<QString, Point>::iterator it1=_refPoints.find(name1); if(it1==_refPoints.end()) { sOut << tr("Error unknown point name: %1").arg(name1) << endl; return true; } QMap<QString, Point>::iterator it2=_refPoints.find(name2); if(it2==_refPoints.end()) { sOut << tr("Error unknown point name: %1").arg(name2) << endl; return true; } Point p1=it1.value(); Point p2=it2.value(); double calcDist=p1.distanceTo(p2); if(par.count()==3) { double refDist=par.toDouble(2,ok); sOut << QString("%1 %2 %3 %4 %5 %6").arg(name1).arg(name2) .arg(calcDist, 0, 'f', 2) .arg(refDist, 0, 'f', 2) .arg(refDist-calcDist, 0, 'f', 2) .arg(100.0*(refDist-calcDist)/refDist, 0, 'f', 1) << endl; } else { sOut << QString("%1 %2 %3").arg(name1).arg(name2).arg(calcDist, 0, 'f', 2) << endl; } } break; case DistanceGeo: { LineParser par(buf); if(par.count()==6) { Point p1(par.toDouble(0,ok), par.toDouble(1,ok), par.toDouble(2,ok)); Point p2(par.toDouble(3,ok), par.toDouble(4,ok), par.toDouble(5,ok)); sOut << p1.geographicalDistanceTo(p2) << endl; } else { Point p1(par.toDouble(0,ok), par.toDouble(1,ok)); Point p2(par.toDouble(2,ok), par.toDouble(3,ok)); sOut << p1.geographicalDistanceTo(p2) << endl; } } break; case Azimuth: { LineParser par(buf); double az; if(par.count()==6) { Point p1(par.toDouble(0,ok), par.toDouble(1,ok), par.toDouble(2,ok)); Point p2(par.toDouble(3,ok), par.toDouble(4,ok), par.toDouble(5,ok)); az=p1.azimuthTo(p2); } else { Point p1(par.toDouble(0,ok), par.toDouble(1,ok)); Point p2(par.toDouble(2,ok), par.toDouble(3,ok)); az=p1.azimuthTo(p2); } sOut << Angle::mathToGeographic(az) << endl; } break; case AzimuthGeo: { LineParser par(buf); double az; if(par.count()==6) { Point p1(par.toDouble(0,ok), par.toDouble(1,ok), par.toDouble(2,ok)); Point p2(par.toDouble(3,ok), par.toDouble(4,ok), par.toDouble(5,ok)); az=p1.geographicalAzimuthTo(p2); } else { Point p1(par.toDouble(0,ok), par.toDouble(1,ok)); Point p2(par.toDouble(2,ok), par.toDouble(3,ok)); az=p1.geographicalAzimuthTo(p2); } sOut << Angle::radiansToDegrees(az) << endl; } break; case FromGeo: { NamedPoint longLat; ok=longLat.fromString(buf); if(!ok) { App::stream() << tr("Error parsing input: %1").arg(buf) << endl; return false; } longLat.geographicalToRectangular(_geoReference); sOut << " " << longLat.toString(20) << endl; } break; case ToGeo: { NamedPoint longLat; ok=longLat.fromString(buf); if(!ok) { App::stream() << tr("Error parsing input") << endl; return false; } longLat.rectangularToGeographical(_geoReference); sOut << longLat.toString(20) << endl; } break; case FromDMS: { NamedPoint longLat; ok=longLat.fromString(buf); if(!ok) { App::stream() << tr("Error parsing input: %1").arg(buf) << endl; return false; } longLat.DMSToDegrees(); sOut << " " << longLat.toString(20) << endl; } break; case ToDMS: { NamedPoint longLat; ok=longLat.fromString(buf); if(!ok) { App::stream() << tr("Error parsing input") << endl; return false; } longLat.degreesToDMS(); sOut << longLat.toString(20) << endl; } break; case FromDM: { NamedPoint longLat; ok=longLat.fromString(buf); if(!ok) { App::stream() << tr("Error parsing input: %1").arg(buf) << endl; return false; } longLat.DMToDegrees(); sOut << " " << longLat.toString(20) << endl; } break; case ToDM: { NamedPoint longLat; ok=longLat.fromString(buf); if(!ok) { App::stream() << tr("Error parsing input") << endl; return false; } longLat.degreesToDM(); sOut << longLat.toString(20) << endl; } break; case ToUTM: { NamedPoint longLat; ok=longLat.fromString(buf); if(!ok) { App::stream() << tr("Error parsing input") << endl; return false; } QPoint utmZone; if(_utmZone) { utmZone=*_utmZone; } else { utmZone=longLat.utmZoneIndex(); } longLat.geographicalToUtm(&utmZone); sOut << Point2D::utmZone(utmZone) << " " << longLat.toString(20) << endl; } break; case FromUTM: { LineParser par(buf); bool ok=true; QString utmZoneName=par.toString(0, ok); if(!ok) { App::stream() << tr("Error parsing input, cannot read first column.") << endl; return false; } bool zoneOk; QPoint utmZone=Point2D::utmZone(utmZoneName, &zoneOk); QString pointString; if(zoneOk) { pointString=par.toString(1, par.count(), ok); if(!ok) { App::stream() << tr("Error parsing input, missong point coordinates.") << endl; return false; } } else { pointString=buf; } NamedPoint utmCoord; ok=utmCoord.fromString(pointString); if(!ok) { App::stream() << tr("Error parsing input") << endl; return false; } if(zoneOk) { utmCoord.utmToGeographical(utmZone); } else if(_utmZone){ utmCoord.utmToGeographical(*_utmZone); } else { App::stream() << tr("Missing specification of UTM zone (stdin or argument, see -help)") << endl; return false; } sOut << utmCoord.toString(20) << endl; } break; case ToKML: { NamedPoint longLat; ok=longLat.fromString(buf); if(!ok) { App::stream() << tr("Error parsing input") << endl; return false; } GoogleEarthKML::Document& doc=_kml->document(); GoogleEarthKML::Folder * f=doc.mainFolder(); GoogleEarthKML::Placemark * p=new GoogleEarthKML::Placemark; p->setName(longLat.name()); p->setCoordinates(longLat); f->addPlacemark(p); } break; case FromKML: case GenerateCircle: ASSERT(false); break; case Translate: { NamedPoint p; ok=p.fromString(buf); if(!ok) { App::stream() << tr("Error parsing input") << endl; return false; } p.translate(_translateVector); sOut << p.toString(20) << endl; } break; case Rotate: { NamedPoint p; ok=p.fromString(buf); if(!ok) { App::stream() << tr("Error parsing input") << endl; return false; } p.rotate(_angle); sOut << p.toString(20) << endl; } break; case Localize: { NamedPoint v, p; ok=v.fromString(buf); if(!ok) { App::stream() << tr("Error parsing input") << endl; return false; } Angle a; a.setDegreeAzimuth(v.y()); p.setX(_cartReference.x()+v.x()*a.cos()); p.setY(_cartReference.y()+v.x()*a.sin()); p.setName(v.name()); sOut << p.toString(20) << endl; } break; case Average: { Point p; ok=p.fromString(buf); if(!ok) { App::stream() << tr("Error parsing input") << endl; return false; } _average+=p; _averageCount++; } break; case Lookup: { QMap<QString, Point>::iterator it=_refPoints.find(buf); if(it==_refPoints.end()) { sOut << tr("Error unknown point name: %1").arg(buf) << endl; return false; } sOut << it.value().toString(20) << " " << it.key() << endl; } break; case TriangulateDistance: { LineParser par(buf); if(par.count()==2) { QString name=par.toString(0,ok); if(!ok) { App::stream() << tr("Error parsing input, missing reference point name.") << endl; return false; } QMap<QString, Point>::iterator it=_refPoints.find(name); if(it==_refPoints.end()) { App::stream() << tr("Error unknown point name: %1").arg(name) << endl; return false; } _circles.append(Circle(it.value().x(), it.value().y(), par.toDouble(1,ok))); if(!ok) { App::stream() << tr("Error parsing input, missing distance for point %1.").arg(name) << endl; return false; } } else { App::stream() << tr("Error parsing input, NAME DISTANCE expected") << endl; return false; } } break; case TriangulateAzimuth: { LineParser par(buf); if(par.count()==2) { QString name=par.toString(0,ok); if(!ok) { App::stream() << tr("Error parsing input, missing reference point name.") << endl; return false; } QMap<QString, Point>::iterator it=_refPoints.find(name); if(it==_refPoints.end()) { App::stream() << tr("Error unknown point name: %1").arg(name) << endl; return false; } double az=par.toDouble(1,ok)*M_PI/180.0; _lines.append(Line2D(it.value().x(), it.value().y(), az)); if(!ok) { App::stream() << tr("Error parsing input, missing azimuth for point %1.").arg(name) << endl; return false; } } else { App::stream() << tr("Error parsing input, NAME AZIMUTH expected") << endl; return false; } } break; case FromDistances: { LineParser par(buf); if(par.count()==3) { QString name1=par.toString(0,ok); if(!ok) { App::stream() << tr("Error parsing input, missing first point name.") << endl; return false; } QString name2=par.toString(1,ok); if(!ok) { App::stream() << tr("Error parsing input, missing second point name.") << endl; return false; } double d=par.toDouble(2,ok); if(!ok) { App::stream() << tr("Error parsing input, missing distance for couple %1-%2.").arg(name1).arg(name2) << endl; return false; } if(name1==name2) { App::stream() << tr("Error parsing input, name of points must differ within the same couple ('%1').").arg(name1) << endl; return false; } _fromDistanceFactory.addDistance(name1, name2, d); } else { App::stream() << tr("Error parsing input, NAME1 NAME2 DISTANCE expected") << endl; return false; } } break; case None: App::stream() << tr("gpcoord: no operation defined, see -h") << endl; return false; } } } return true; }
bool CoordReader::setOptions | ( | int & | argc, |
char ** | argv | ||
) |
References QGpCoreTools::Angle::cos(), QGpCoreTools::LineParser::count(), QGpCoreTools::GoogleEarthKML::document(), QGpCoreTools::endl(), QGpCoreTools::GoogleEarthKML::Document::mainFolder(), QGpCoreTools::Angle::setDegreeAzimuth(), QGpCoreTools::Angle::setDegrees(), QGpCoreTools::NamedPoint::setName(), QGpCoreTools::GoogleEarthKML::Folder::setName(), QGpCoreTools::GoogleEarthKML::Document::setName(), QGpCoreTools::LineParser::setString(), QGpCoreTools::Point2D::setX(), QGpCoreTools::Point2D::setY(), QGpCoreTools::Angle::sin(), sOut(), QGpCoreTools::LineParser::toDouble(), QGpCoreTools::LineParser::toString(), QGpCoreTools::NamedPoint::toString(), QGpCoreTools::tr(), and TRACE.
Referenced by main().
{ TRACE; QString coordFile; int i, j=1; for(i=1; i<argc; i++) { QByteArray arg=argv[i]; if(arg[0]=='-') { if(arg=="-distance") { _mode=Distance; } else if(arg=="-distance-lookup") { _mode=DistanceLookup; CoreApplication::checkOptionArg(i, argc, argv); coordFile=argv[i]; } else if(arg=="-distance-geo") { _mode=DistanceGeo; } else if(arg=="-azimuth") { _mode=Azimuth; } else if(arg=="-azimuth-geo") { _mode=AzimuthGeo; } else if(arg=="-from-dms") { _mode=FromDMS; } else if(arg=="-to-dms") { _mode=ToDMS; } else if(arg=="-from-dm") { _mode=FromDM; } else if(arg=="-to-dm") { _mode=ToDM; } else if(arg=="-from-geo") { _mode=FromGeo; } else if(arg=="-to-geo") { _mode=ToGeo; } else if(arg=="-to-utm") { if(CoreApplication::checkOptionArg(i, argc, argv, false)) { bool ok; delete _utmZone; _utmZone=new QPoint(Point2D::utmZone(argv[i], &ok)); if(!ok) { App::stream() << tr("gpcoord: bad utm zone, %1").arg(argv[i]) << endl; return false; } } _mode=ToUTM; } else if(arg=="-from-utm") { if(CoreApplication::checkOptionArg(i, argc, argv, false)) { bool ok; delete _utmZone; _utmZone=new QPoint(Point2D::utmZone(argv[i], &ok)); if(!ok) { App::stream() << tr("gpcoord: bad utm zone, %1").arg(argv[i]) << endl; return false; } } _mode=FromUTM; } else if(arg=="-to-kml") { CoreApplication::checkOptionArg(i, argc, argv); _kmlFileName=argv[i]; _mode=ToKML; delete _kml; _kml=new GoogleEarthKML; GoogleEarthKML::Document& doc=_kml->document(); QFileInfo fi(_kmlFileName); doc.setName(fi.baseName()); GoogleEarthKML::Folder * f=doc.mainFolder(); f->setName(fi.baseName()); } else if(arg=="-from-kml") { CoreApplication::checkOptionArg(i, argc, argv); _kmlFileName=argv[i]; _mode=FromKML; } else if(arg=="-reference") { CoreApplication::checkOptionArg(i, argc, argv); _geoReference.setX(atof(argv[i])); CoreApplication::checkOptionArg(i, argc, argv); _geoReference.setY(atof(argv[i])); } else if(arg=="-translate") { _mode=Translate; CoreApplication::checkOptionArg(i, argc, argv); _translateVector.setX(atof(argv[i])); CoreApplication::checkOptionArg(i, argc, argv); _translateVector.setY(atof(argv[i])); } else if(arg=="-rotate") { CoreApplication::checkOptionArg(i, argc, argv); _mode=Rotate; // Input is counted clockwize while Angle uses math angles _angle.setDegrees(-atof(argv[i])); } else if(arg=="-average") { _mode=Average; } else if(arg=="-localize") { _mode=Localize; CoreApplication::checkOptionArg(i, argc, argv); _cartReference.setX(atof(argv[i])); CoreApplication::checkOptionArg(i, argc, argv); _cartReference.setY(atof(argv[i])); } else if(arg=="-lookup") { _mode=Lookup; CoreApplication::checkOptionArg(i, argc, argv); coordFile=argv[i]; } else if(arg=="-trig-dist") { _mode=TriangulateDistance; CoreApplication::checkOptionArg(i, argc, argv); coordFile=argv[i]; } else if(arg=="-trig-az") { _mode=TriangulateAzimuth; CoreApplication::checkOptionArg(i, argc, argv); coordFile=argv[i]; } else if(arg=="-circle") { _mode=GenerateCircle; CoreApplication::checkOptionArg(i, argc, argv); double radius=atof(argv[i]); CoreApplication::checkOptionArg(i, argc, argv); int n=atoi(argv[i]); int i0=0; if(CoreApplication::checkOptionArg(i, argc, argv, false)) { i0=atoi(argv[i]); } QTextStream sOut(stdout); Angle a; NamedPoint p; p.setName(QString("S%1").arg(i0, 3, 10, QChar('0'))); sOut << p.toString(20) << endl; for(int i=0; i<n; i++) { a.setDegreeAzimuth(i*360.0/n); p.setX(radius*a.cos()); p.setY(radius*a.sin()); p.setName(QString("S%1").arg(i0+i+1, 3, 10, QChar('0'))); sOut << p.toString(20) << endl; } } else if(arg=="-from-distances") { _mode=FromDistances; } else if(arg=="-stddev") { CoreApplication::checkOptionArg(i, argc, argv); _distanceStddev=atof(argv[i]); } else if(arg=="-origin") { CoreApplication::checkOptionArg(i, argc, argv); _origin=argv[i]; } else if(arg=="-north") { CoreApplication::checkOptionArg(i, argc, argv); _north=argv[i]; } else if(arg=="-eastward") { CoreApplication::checkOptionArg(i, argc, argv); _eastward=argv[i]; } else if(arg=="-prior-positions") { CoreApplication::checkOptionArg(i, argc, argv); coordFile=argv[i]; } else if(arg=="-prior-precision") { CoreApplication::checkOptionArg(i, argc, argv); _priorPrecision=atof(argv[i]); } else { App::stream() << tr("gpcoord: bad option %1, see -help").arg(argv[i]) << endl; return false; } } else { argv[j++]=argv[i]; } } if(j < argc) { argv[j]=0; argc=j; } if(!coordFile.isEmpty()) { QFile fCoord(coordFile); if(!fCoord.open(QIODevice::ReadOnly) ) { App::stream() << tr("gpcoord: cannot read file %1.").arg(coordFile) << endl; return false; } QTextStream sCoord(&fCoord); LineParser p; bool ok=true; int iLine=0; while( ! sCoord.atEnd()) { QString l=sCoord.readLine(); iLine++; if(!l.isEmpty() && l[0]!='#') { p.setString(l); double x, y, z; QString name; x=p.toDouble(0, ok); y=p.toDouble(1, ok); if(p.count()==4) { z=p.toDouble(2, ok); name=p.toString(3, ok); } else { z=0.0; name=p.toString(2, ok); } if(!ok) { App::stream() << tr("gpcoord: error reading file %1 at line %2").arg(coordFile).arg(iLine) << endl; return false; } _refPoints.insert(name, Point(x, y, z)); } } } if(_mode==FromDistances) { if(_origin.isEmpty()) { App::stream() << tr("gpcoord: missing option '-origin'") << endl; return false; } if(_north.isEmpty()) { App::stream() << tr("gpcoord: missing option '-north'") << endl; return false; } if(_eastward.isEmpty()) { App::stream() << tr("gpcoord: missing option '-eastward'") << endl; return false; } if(_origin==_north) { App::stream() << tr("gpcoord: origin and north cannot refer to the same point") << endl; return false; } if(_origin==_eastward) { App::stream() << tr("gpcoord: origin and eastward cannot refer to the same point") << endl; return false; } if(_north==_eastward) { App::stream() << tr("gpcoord: north and eastward cannot refer to the same point") << endl; return false; } } return true; }
bool CoordReader::terminate | ( | ) |
References TapePositioningSystem::Triangulator::aggregate(), TapePositioningSystem::Triangulator::covariance(), QGpCoreTools::GoogleEarthKML::document(), QGpCoreTools::endl(), QGpCoreTools::Covariance::mean(), TapePositioningSystem::Node::name(), TapePositioningSystem::Triangulator::node(), TapePositioningSystem::Triangulator::nodes(), QGpCoreTools::GoogleEarthKML::Document::points(), QGpCoreTools::GoogleEarthKML::save(), TapePositioningSystem::Triangulator::setCoordinates(), TapePositioningSystem::Triangulator::setPriorCoordinates(), TapePositioningSystem::Triangulator::solutions(), sOut(), QGpCoreTools::sqrt(), QGpCoreTools::Covariance::stddev2D(), str, QGpCoreTools::Ellipse::toString(), QGpCoreTools::Point::toString(), QGpCoreTools::tr(), QGpCoreTools::Point2D::x(), QGpCoreTools::XMLHeader::xml_restoreFile(), and QGpCoreTools::Point2D::y().
Referenced by main().
{ QTextStream sOut(stdout); switch(_mode) { case Distance: case DistanceLookup: case DistanceGeo: case Azimuth: case AzimuthGeo: case FromGeo: case ToGeo: case FromDMS: case ToDMS: case FromDM: case ToDM: case ToUTM: case FromUTM: case Translate: case Rotate: case Localize: case Lookup: case GenerateCircle: case None: break; case TriangulateDistance: if(_circles.count()==2) { QVector<Point2D> p=_circles.first().intersect(_circles.last()); for(QVector<Point2D>::iterator it=p.begin(); it!=p.end(); it++) { sOut << it->x() << " " << it->y() << endl; } } else if(_circles.count()>=3) { bool ok; int n=0; Point2D pAver(0, 0), pDev(0, 0); for(int i=0; i<_circles.count(); i++) { for(int j=i+1; j<_circles.count(); j++) { // Used to discriminate between the classical // two solutions of the intersection of two circles. int disc; if(j+1<_circles.count()) { disc=j+1; } else if(i+1<j) { disc=i+1; } else { disc=i-1; } Point2D p=_circles.at(i).intersect(_circles.at(j), ok, _circles.at(disc)); if(ok) { pAver+=p; pDev+=p*p; n++; } } } if(n>0) { pAver/=n; pDev/=n; pDev-=pAver * pAver; } else { App::stream() << tr("No intersection") << endl; return false; } sOut << pAver.x() << " " << pAver.y() << " " << sqrt(pDev.x()) << " " << sqrt(pDev.y()) << endl; } else { App::stream() << tr("At least two distances are required to triangulate.") << endl; return false; } break; case TriangulateAzimuth: if(_lines.count()>=2) { bool ok; int n=0; Point2D pAver(0, 0), pDev(0, 0); for(int i=0; i<_lines.count(); i++) { for(int j=i+1; j<_lines.count(); j++) { Point2D p=_lines.at(i).intersect(_lines.at(j), ok); if(ok) { pAver+=p; pDev+=p*p; n++; } } } if(n>0) { pAver/=n; pDev/=n; pDev-=pAver * pAver; } else { App::stream() << tr("No intersection") << endl; return false; } sOut << pAver.x() << " " << pAver.y() << " " << sqrt(pDev.x()) << " " << sqrt(pDev.y()) << endl; } else { App::stream() << tr("At least two azimuth are required to triangulate.") << endl; return false; } break; case Average: if(_averageCount>0) { _average/=(double)_averageCount; sOut << _average.toString(20) << endl; } else { App::stream() << tr("No point available to calculate average") << endl; return false; } break; case ToKML: _kml->save(_kmlFileName); delete _kml; break; case FromKML: { GoogleEarthKML kml; XMLHeader hdr(&kml); if(hdr.xml_restoreFile(_kmlFileName, 0, XMLClass::XmlFile)!=XMLClass::NoError) { App::stream() << tr("Error while reading file %1").arg(_kmlFileName) << endl; return false; } QList<NamedPoint> list=kml.document().points(); QString str; for(QList<NamedPoint>::iterator it=list.begin(); it!=list.end(); it++) { sOut << (*it).toString(20) << endl; } } break; case FromDistances: { Node * origin=_fromDistanceFactory.node(_origin); if(!origin) { App::stream() << tr("gpcoord: origin node '%1' does not exist").arg(_origin) << endl; return false; } Node * north=_fromDistanceFactory.node(_north); if(!north) { App::stream() << tr("gpcoord: north node '%1' does not exist").arg(_north) << endl; return false; } Node * eastward=_fromDistanceFactory.node(_eastward); if(!eastward) { App::stream() << tr("gpcoord: eastward node '%1' does not exist").arg(_eastward) << endl; return false; } _fromDistanceFactory.aggregate(_distanceStddev); _fromDistanceFactory.setCoordinates(origin, north, eastward); if(!_refPoints.isEmpty() ) { _fromDistanceFactory.setPriorCoordinates(_refPoints, _priorPrecision); } QList<Node *> nodes=_fromDistanceFactory.nodes(); for(QList<Node *>::iterator it=nodes.begin(); it!=nodes.end(); it++) { Node * n=*it; QSet<Point2D> coordinates=_fromDistanceFactory.solutions(n->name()); for(QSet<Point2D>::iterator its=coordinates.begin(); its!=coordinates.end(); its++) { sOut << "RAW " << its->toString() << " 0 " << n->name() << endl; } Covariance cov=_fromDistanceFactory.covariance(n->name()); sOut << "ELLIPSE " << cov.stddev2D().toString() << endl; sOut << "MEAN " << cov.mean(0) << " " << cov.mean(1) << " 0 " << n->name() << endl; } } break; } return true; }