void ConventionalCoordinateSystem::setEllipsoid(const IEllipsoid &ell) { _ellipsoid = ell; if ( _projection.isValid() && ell.isValid()){ _projection->setParameter(Projection::pvELLCODE,ell->toProj4()); } }
bool CoordinateSystemConnector::loadMetaData(IlwisObject* data) { Ilwis3Connector::loadMetaData(data); CoordinateSystem *csy = static_cast<CoordinateSystem *>(data); QString ellipsoideName; IEllipsoid ell = getEllipsoid(); GeodeticDatum *datum = getDatum(ellipsoideName); if ( !ell.isValid() && ellipsoideName != sUNDEF){ QString ellres = QString("ilwis://tables/ellipsoid?code=%1").arg(ellipsoideName); if (!ell.prepare(ellres)) { return ERROR1("No ellipsoid for this code %1",ellipsoideName); } } if ( type() == itCONVENTIONALCOORDSYSTEM ) { ConventionalCoordinateSystem *csycc = static_cast<ConventionalCoordinateSystem *>(csy); IProjection proj = getProjection(); if ( !proj.isValid()) { return ERROR1(ERR_NO_INITIALIZED_1, "projection"); } csycc->setDatum(datum); csycc->setEllipsoid(ell); csycc->setProjection(proj); proj->setCoordinateSystem(csycc); proj->setParameter(Projection::pvELLCODE, ell->toProj4()); csycc->prepare(); } else if ( type() == itUNKNOWN){ //TODO other types of csy } return true; }
void GeodeticDatum::fromCode(const QString &gcode) { InternalDatabaseConnection stmt; QString query = QString("Select * from datum where code='%1' or code='%2'").arg(gcode).arg('D' + gcode); // temporary workaround (only working for wgs84) because file datums.csv does not have datumnames that match the ones in epsg.pcs if (stmt.exec(query)) { if ( stmt.next()) { QString area = stmt.value(stmt.record().indexOf("area")).toString(); QString geocode = stmt.value(stmt.record().indexOf("code")).toString(); QString ellipsoid = stmt.value(stmt.record().indexOf("ellipsoid")).toString(); double dx = stmt.value(stmt.record().indexOf("dx")).toDouble(); double dy = stmt.value(stmt.record().indexOf("dy")).toDouble(); double dz = stmt.value(stmt.record().indexOf("dz")).toDouble(); setArea(area); code(geocode); setWktName(stmt.value(stmt.record().indexOf("wkt")).toString()); IEllipsoid ellips; ellips.prepare("code=ellipsoid:" + ellipsoid); set3TransformationParameters(dx, dy, dz, ellips); } else { kernel()->issues()->log(TR("No datum for this code %1").arg(gcode)); } } else { kernel()->issues()->logSql(stmt.lastError()); } }
bool CoordinateSystemConnector::loadMetaData(IlwisObject* data, const IOOptions& options) { Ilwis3Connector::loadMetaData(data, options); CoordinateSystem *csy = static_cast<CoordinateSystem *>(data); QString ellipsoideName; IEllipsoid ell = getEllipsoid(); GeodeticDatum *datum = getDatum(ellipsoideName); if ( !ell.isValid() && ellipsoideName != sUNDEF){ QString ellres = QString("ilwis://tables/ellipsoid?code=%1").arg(ellipsoideName); if (!ell.prepare(ellres)) { return ERROR1("No ellipsoid for this code %1",ellipsoideName); } } QString cb = _odf->value("CoordSystem", "CoordBounds"); QStringList cbparts = cb.split(" "); if ( cbparts.size() == 4 && cbparts[0] != "-1e+308") { bool ok1, ok2, ok3, ok4; Envelope box( Coordinate( cbparts[0].toDouble(&ok1), cbparts[1].toDouble(&ok2)), Coordinate( cbparts[2].toDouble(&ok3), cbparts[3].toDouble(&ok4))); if ( !( ok1 && ok2 && ok3 && ok4)) { return ERROR2(ERR_NO_INITIALIZED_2, TR("envelop"), csy->name()); } csy->envelope(box); } else { QString type = _odf->value("CoordSystem", "Type"); if ( type == "LatLon") { Envelope box(Coordinate(-180,-90), Coordinate(180,90)); csy->envelope(box); } } if ( type() == itCONVENTIONALCOORDSYSTEM ) { ConventionalCoordinateSystem *csycc = static_cast<ConventionalCoordinateSystem *>(csy); IProjection proj = getProjection(csycc); if ( !proj.isValid()) { return ERROR1(ERR_NO_INITIALIZED_1, "projection"); } csycc->setDatum(datum); csycc->setEllipsoid(ell); csycc->setProjection(proj); proj->setCoordinateSystem(csycc); proj->setParameter(Projection::pvELLCODE, ell->toProj4()); csycc->prepare(); } else if ( type() == itUNKNOWN){ //TODO: other types of csy } return true; }
void GeodeticDatum::set3TransformationParameters(const double x, const double y, const double z, const IEllipsoid & ellips) { _datumParams[dmDX] = x; _datumParams[dmDY] = y; _datumParams[dmDZ] = z; _mode = dtMolodensky; code(QString("+towgs84=%1,%2,%3").arg(x).arg(y).arg(z)); getFromInternal(ellips->code()); // table datums.csv isn't yet complete; we can only do this for 3 parameter molodensky _isValid = true; }
GeodeticDatum *InternalIlwisObjectFactory::createDatum(const Resource& resource, const IOOptions &options) const { QString query; if ( resource.code() != sUNDEF) { QString code = resource.code(); if ( code != "") { query = QString("Select * from datum where code = '%1'").arg(code); } } if ( resource["area"] != sUNDEF) { QString name = resource.name(); QString area = resource["area"].toString(); query = QString("Select * from datum where name='%1' and area='%1'").arg(name, area); } if ( query == "") return 0; InternalDatabaseConnection db; if (db.exec(query) && db.next()) { GeodeticDatum *datum = new GeodeticDatum(); QSqlRecord rec = db.record(); datum->name(rec.field("name").value().toString()); datum->setDescription(rec.field("description").value().toString()); datum->setAuthority(rec.field("authority").value().toString()); datum->setArea(rec.field("area").value().toString()); datum->code(rec.field("code").value().toString()); QString ellips = rec.field("code").value().toString(); IEllipsoid ell; QString ellres = QString("code=ellipsoid:%1").arg(ellips); ell.prepare(ellres); datum->set3TransformationParameters(rec.field("dx").value().toDouble(), rec.field("dy").value().toDouble(), rec.field("dz").value().toDouble(), ell); return datum; } return 0; }
IEllipsoid CoordinateSystemConnector::getEllipsoid() { QString ell = _odf->value("CoordSystem","Ellipsoid"); if ( ell == "?") return IEllipsoid(); if ( ell == "User Defined") { double invf = _odf->value("Ellipsoid","1/f").toDouble(); double majoraxis = _odf->value("Ellipsoid","a").toDouble(); Ellipsoid *ellips = new Ellipsoid(); QString newName = ellips->setEllipsoid(majoraxis,invf);; ellips->name(newName); IEllipsoid ellipsoid(ellips); return ellipsoid; } IEllipsoid ellipsoid; QString code = name2Code(ell, "ellipsoid"); if ( code == sUNDEF) return IEllipsoid(); QString resource = QString("ilwis://tables/ellipsoid?code=%1").arg(code); ellipsoid.prepare(resource); return ellipsoid; }
bool CoordinateSystemConnector::storeMetaData(IlwisObject *data) { bool ok = true; if ((ok = Ilwis3Connector::storeMetaData(data, itCOORDSYSTEM)) == false){ return false; } ICoordinateSystem csy(static_cast<CoordinateSystem *>(data)); if (!csy.isValid() || !csy->isValid()){ return ERROR1(ERR_NO_INITIALIZED_1, "CoordinateSystem"); } Envelope bounds = csy->envelope(); if(!bounds.isValid()){ ERROR2(ERR_NO_INITIALIZED_2, "Bounds", csy->name()); return sUNDEF; } _odf->setKeyValue("CoordSystem","CoordBounds",QString("%1 %2 %3 %4"). arg(bounds.min_corner().x,10,'f'). arg(bounds.min_corner().y,10,'f'). arg(bounds.max_corner().x,10,'f'). arg(bounds.max_corner().y,10,'f')); if ( csy->isLatLon()) { _odf->setKeyValue("CoordSystem", "Datum", "WGS 1984"); _odf->setKeyValue("CoordSystem","Type","LatLon"); if ( csy.as<ConventionalCoordinateSystem>()->ellipsoid().isValid()){ IEllipsoid ell = csy.as<ConventionalCoordinateSystem>()->ellipsoid(); _odf->setKeyValue("CoordSystem","Ellipsoid","User Defined"); _odf->setKeyValue("Ellipsoid","1/f", 1.0 / ell->flattening()); _odf->setKeyValue("Ellipsoid","a", ell->majorAxis()); } }else{ IConventionalCoordinateSystem projectedCsy = csy.as<ConventionalCoordinateSystem>(); if( !projectedCsy->ellipsoid().isValid() || !projectedCsy->projection().isValid()){ ERROR2(ERR_NO_INITIALIZED_2, "Ellipsoid/Projection", csy->name()); return sUNDEF; } QString projectionName = Ilwis3Connector::code2name(projectedCsy->projection()->name(), "projection"); _odf->setKeyValue("CoordSystem","Type","Projection"); _odf->setKeyValue("CoordSystem","Projection",projectionName); QString ellipsoidName = projectedCsy->ellipsoid()->name(); //ellipsoidName = Ilwis3Connector::name2Code(ellipsoidName, "ellipsoid"); if ( ellipsoidName == sUNDEF){ ellipsoidName = "User Defined"; _odf->setKeyValue("Ellipsoid","a",projectedCsy->ellipsoid()->majorAxis() ); _odf->setKeyValue("Ellipsoid","1/f",projectedCsy->ellipsoid()->flattening() ); }else ellipsoidName = Ilwis3Connector::code2name(ellipsoidName, "ellipsoid"); _odf->setKeyValue("CoordSystem","Ellipsoid",ellipsoidName); IProjection projection = projectedCsy->projection(); if ( projection->isSet(Projection::pvAZIMCLINE)) _odf->setKeyValue("Projection",prjParam2IlwisName(Projection::pvAZIMCLINE),projection->parameter(Projection::pvAZIMCLINE).toDouble()); if ( projection->isSet(Projection::pvAZIMYAXIS)) _odf->setKeyValue("Projection",prjParam2IlwisName(Projection::pvAZIMYAXIS),projection->parameter(Projection::pvAZIMYAXIS).toDouble()); if ( projection->isSet(Projection::pvHEIGHT)) _odf->setKeyValue("Projection",prjParam2IlwisName(Projection::pvHEIGHT),projection->parameter(Projection::pvHEIGHT).toDouble()); if ( projection->isSet(Projection::pvK0)) _odf->setKeyValue("Projection",prjParam2IlwisName(Projection::pvK0),projection->parameter(Projection::pvK0).toDouble()); if ( projection->isSet(Projection::pvLAT0)) _odf->setKeyValue("Projection",prjParam2IlwisName(Projection::pvLAT0),projection->parameter(Projection::pvLAT0).toDouble()); if ( projection->isSet(Projection::pvLAT1)) _odf->setKeyValue("Projection",prjParam2IlwisName(Projection::pvLAT1),projection->parameter(Projection::pvLAT1).toDouble()); if ( projection->isSet(Projection::pvLAT2)) _odf->setKeyValue("Projection",prjParam2IlwisName(Projection::pvLAT2),projection->parameter(Projection::pvLAT2).toDouble()); if ( projection->isSet(Projection::pvLATTS)) _odf->setKeyValue("Projection",prjParam2IlwisName(Projection::pvLATTS),projection->parameter(Projection::pvLATTS).toDouble()); if ( projection->isSet(Projection::pvLON0)) _odf->setKeyValue("Projection",prjParam2IlwisName(Projection::pvLON0),projection->parameter(Projection::pvLON0).toDouble()); if ( projection->isSet(Projection::pvNORIENTED)) _odf->setKeyValue("Projection",prjParam2IlwisName(Projection::pvNORIENTED),projection->parameter(Projection::pvNORIENTED).toString()); if ( projection->isSet(Projection::pvNORTH)) _odf->setKeyValue("Projection",prjParam2IlwisName(Projection::pvNORTH),projection->parameter(Projection::pvNORTH).toString()); if ( projection->isSet(Projection::pvX0)) _odf->setKeyValue("Projection",prjParam2IlwisName(Projection::pvX0),projection->parameter(Projection::pvX0).toDouble()); if ( projection->isSet(Projection::pvY0)) _odf->setKeyValue("Projection",prjParam2IlwisName(Projection::pvY0),projection->parameter(Projection::pvY0).toDouble()); if ( projection->isSet(Projection::pvZONE)) _odf->setKeyValue("Projection",prjParam2IlwisName(Projection::pvZONE),projection->parameter(Projection::pvZONE).toInt()); } _odf->store("csy", source().toLocalFile()); return true; }
QString IlwisObjectModel::getProperty(const QString &propertyname) { try{ QString property = ResourceModel::getProperty(propertyname); if ( property != sUNDEF) return property; if ( !_ilwisobject.isValid()) return ""; if ( propertyname == "latlonenvelope" || propertyname == "envelope"){ if (hasType(_ilwisobject->ilwisType(), itCOVERAGE)){ return _ilwisobject.as<Coverage>()->envelope(propertyname == "latlonenvelope").toString(); } if ( hasType(_ilwisobject->ilwisType(), itCOORDSYSTEM)){ return _ilwisobject.as<CoordinateSystem>()->envelope(propertyname == "latlonenvelope").toString(); } } if ( propertyname == "pixelsize"){ return pixSizeString(); } if ( propertyname == "centerpixelboundingbox"){ return centerPixelLocation(); } if ( propertyname == "parentdomain"){ return parentDomain(); } if ( propertyname == "valuetype"){ return valueType(); } if ( propertyname == "recordcount"){ if ( hasType(_ilwisobject->ilwisType(), itTABLE)){ return QString::number(_ilwisobject.as<Table>()->recordCount()); } } if ( propertyname == "columncount"){ if ( hasType(_ilwisobject->ilwisType(), itTABLE)){ return QString::number(_ilwisobject.as<Table>()->columnCount()); } } if ( propertyname == "polygoncount"){ if ( hasType(_ilwisobject->ilwisType(), itFEATURE)){ IFeatureCoverage features = _ilwisobject.as<FeatureCoverage>(); return QString::number(features->featureCount(itPOLYGON)); } } if ( propertyname == "linecount"){ if ( hasType(_ilwisobject->ilwisType(), itFEATURE)){ IFeatureCoverage features = _ilwisobject.as<FeatureCoverage>(); return QString::number(features->featureCount(itLINE)); } } if ( propertyname == "pointcount"){ if ( hasType(_ilwisobject->ilwisType(), itFEATURE)){ IFeatureCoverage features = _ilwisobject.as<FeatureCoverage>(); return QString::number(features->featureCount(itPOINT)); } } if ( propertyname == "featurecount"){ if ( hasType(_ilwisobject->ilwisType(), itFEATURE)){ IFeatureCoverage features = _ilwisobject.as<FeatureCoverage>(); return QString::number(features->featureCount()); } } if ( propertyname == "majoraxis"){ if ( hasType(_ilwisobject->ilwisType(), itELLIPSOID)){ IEllipsoid ellipsoid = _ilwisobject.as<Ellipsoid>(); return QString::number(ellipsoid->majorAxis()); } } if ( propertyname == "minoraxis"){ if ( hasType(_ilwisobject->ilwisType(), itELLIPSOID)){ IEllipsoid ellipsoid = _ilwisobject.as<Ellipsoid>(); return QString::number(ellipsoid->minorAxis()); } } if ( propertyname == "flattening"){ if ( hasType(_ilwisobject->ilwisType(), itELLIPSOID)){ IEllipsoid ellipsoid = _ilwisobject.as<Ellipsoid>(); return QString::number(ellipsoid->flattening()); } } if ( propertyname == "excentricity"){ if ( hasType(_ilwisobject->ilwisType(), itELLIPSOID)){ IEllipsoid ellipsoid = _ilwisobject.as<Ellipsoid>(); return QString::number(ellipsoid->excentricity()); } } if (propertyname == "proj4def"){ IlwisTypes objectype = _ilwisobject->ilwisType(); if ( hasType( objectype, itPROJECTION | itCONVENTIONALCOORDSYSTEM)){ IProjection proj; if ( hasType(objectype, itCONVENTIONALCOORDSYSTEM)){ IConventionalCoordinateSystem csyProj = _ilwisobject.as<ConventionalCoordinateSystem>(); if ( csyProj.isValid()){ proj = csyProj->projection(); } }else proj = _ilwisobject.as<Projection>(); if ( proj.isValid()){ return proj->toProj4(); } } } return ""; } catch(const ErrorObject& ){ // no exceptions may escape here } return ""; }