IProjection CoordinateSystemConnector::getProjection(ConventionalCoordinateSystem *csycc) { QString projection = _odf->value("CoordSystem","Projection"); if (projection == "?") { QString type = _odf->value("CoordSystem","Type"); if ( type == "LatLon") { projection = type; GeodeticDatum *gdata = new GeodeticDatum(); gdata->fromCode("DWGS84"); csycc->setDatum(gdata); } else return IProjection(); } QString code = name2Code(projection, "projection"); Resource resource(QUrl(QString("ilwis://tables/projection?code=%1").arg(code)), itPROJECTION); if ( code == sUNDEF) { kernel()->issues()->log(TR("Couldnt find projection %1").arg(projection)); return IProjection(); } IProjection proj; if(!proj.prepare(resource)) return IProjection(); bool ok; double falseEasting = _odf->value("Projection","False Easting").toDouble(&ok); if ( ok) proj->setParameter(Projection::pvX0, falseEasting); double falseNorthing = _odf->value("Projection","False Northing").toDouble(&ok); if ( ok) proj->setParameter(Projection::pvY0, falseNorthing); double centralMeridian = _odf->value("Projection","Central Meridian").toDouble(&ok); if ( ok) proj->setParameter(Projection::pvLON0, centralMeridian); double centralParllel = _odf->value("Projection","Central Parallel").toDouble(&ok); if ( ok) proj->setParameter(Projection::pvLAT0, centralParllel); double standardParllel = _odf->value("Projection","Standard Parallel 1").toDouble(&ok); if ( ok) proj->setParameter(Projection::pvLAT1, standardParllel); standardParllel = _odf->value("Projection","Standard Parallel 2").toDouble(&ok); if ( ok) proj->setParameter(Projection::pvLAT2, standardParllel); double lattitudeOfTrueScale = _odf->value("Projection","Latitude of True Scale").toDouble(&ok); if ( ok) proj->setParameter(Projection::pvLATTS, lattitudeOfTrueScale); double scaleFactor = _odf->value("Projection","Scale Factor").toDouble(&ok); if ( ok) proj->setParameter(Projection::pvK0, scaleFactor); int gzone = _odf->value("Projection","Zone").toInt(&ok); if ( ok) proj->setParameter(Projection::pvZONE, gzone); QString hemisphere = _odf->value("Projection","Northern Hemisphere"); if ( hemisphere != sUNDEF && code == "utm") proj->setParameter(Projection::pvNORTH, hemisphere); return proj; }
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; }
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; }