bool GeorefConnector::loadGeoref(const IniFile &odf, IlwisObject *data ) {
    QString type = odf.value("GeoRef","Type");
    if ( type == "?") {
        kernel()->issues()->log(TR("Invalid Georef section in %1").arg(odf.fileinfo().baseName()));
        return false;
    }
    bool ok1, ok2;
    quint32 lines = odf.value("GeoRef","Lines").toInt(&ok1);
    quint32 columns = odf.value("GeoRef","Columns").toInt(&ok2);
    if ( !(ok1 & ok2)) {
        return ERROR2(ERR_INVALID_PROPERTY_FOR_2,"Lines/Columns","Georeference");
    }

    GeoReference *grf = static_cast<GeoReference *>(data);
    grf->size(Size(columns, lines,1));
    if ( type == "GeoRefCorners") {
        //_type = itCORNERSGEOREF;
        return loadGeorefCorners(odf, data);
    } else if ( type == "GeoRefSubMap") {
        QString name = odf.value("GeoRefSubMap","GeoRef");
        QUrl resource = mastercatalog()->name2url(name, itGEOREF);
        IniFile odf;
        odf.setIniFile(resource);
        return loadGeoref(odf,data);
    }
    //TODO tiepoints georef
    return false;
}
bool GeorefConnector::loadGeorefCorners(const IniFile& odf, IlwisObject *data) {
    GeoReference *grf = static_cast<GeoReference *>(data);
    QString csyName = odf.value("GeoRef","CoordSystem");
    QUrl path = mastercatalog()->name2url(csyName, itCOORDSYSTEM);
    ICoordinateSystem csy;
    if(!csy.prepare(path.toLocalFile())) {
        kernel()->issues()->log(TR("Couldnt find coordinate system %1, loading unknown").arg(csyName),IssueObject::itWarning);
        QString resource = QString("ilwis://file/unknown.csy");
        if(!csy.prepare(resource)) {
            kernel()->issues()->log(TR("Cound find coordinate system unknown, corrupt system file"));
            return false;
        }
    }

    grf->coordinateSystem(csy);
    double maxx = odf.value("GeoRefCorners","MaxX").toDouble();
    double maxy = odf.value("GeoRefCorners","MaxY").toDouble();
    double minx = odf.value("GeoRefCorners","MinX").toDouble();
    double miny = odf.value("GeoRefCorners","MinY").toDouble();
    if ( maxx == rUNDEF || maxy == rUNDEF || minx == rUNDEF || miny == rUNDEF) {
        kernel()->issues()->log(TR("Uninitialized boundaries for georeference %1").arg(_resource.name()));
        return false;
    }

    grf->impl<CornersGeoReference>()->setEnvelope(Box2D<double>(Coordinate(minx, miny), Coordinate(maxx, maxy)));
    return true;
}
Ejemplo n.º 3
0
GeoReference  *GeoReference::create(const QString& type) {
    GeoReference *georef = new GeoReference();
    GeoRefImplementationFactory *grfFac = kernel()->factory<GeoRefImplementationFactory>("ilwis::georefimplementationfactory");
    GeoRefImplementation *impl = grfFac->create(type);
    if ( !impl) {
        ERROR1(ERR_COULDNT_CREATE_OBJECT_FOR_1,type);
        return 0;
    }
    georef->impl(impl);
    return georef;
}
Ejemplo n.º 4
0
bool GeorefConnector::loadGeorefCorners(const IniFile& odf, IlwisObject *data) {
    GeoReference *grf = static_cast<GeoReference *>(data);
    QString csyName = odf.value("GeoRef","CoordSystem");
    ICoordinateSystem csy;
    if ( csyName.toLower() == "latlonwgs84.csy"){
        Resource resource = mastercatalog()->name2Resource("code=epsg:4326", itCOORDSYSTEM);
        if(!csy.prepare(resource))
            return false;
    }else {
        if ( csyName == "unknown.csy" || csyName == "" || csyName == sUNDEF){
            Resource resource = mastercatalog()->name2Resource("code=csy:unknown", itCOORDSYSTEM);
            if(!csy.prepare(resource)) {
                return false;
            }
        }else {

            QUrl path = mastercatalog()->name2url(csyName, itCOORDSYSTEM);
            if( !csy.prepare(path.toString())) {
                kernel()->issues()->log(TR("Couldn't find coordinate system %1, defaulting to unknown").arg(csyName),IssueObject::itWarning);
                Resource resource = mastercatalog()->name2Resource("code=csy:unknown", itCOORDSYSTEM);
                if(!csy.prepare(resource)) {
                    return false;
                }
            }
        }
    }

    grf->coordinateSystem(csy);
    double maxx = odf.value("GeoRefCorners","MaxX").toDouble();
    double maxy = odf.value("GeoRefCorners","MaxY").toDouble();
    double minx = odf.value("GeoRefCorners","MinX").toDouble();
    double miny = odf.value("GeoRefCorners","MinY").toDouble();
    if ( maxx == rUNDEF || maxy == rUNDEF || minx == rUNDEF || miny == rUNDEF) {
        kernel()->issues()->log(TR("Uninitialized boundaries for georeference %1").arg(_resource.name()));
        return false;
    }

    grf->envelope(Envelope(Coordinate(minx, miny), Coordinate(maxx, maxy)));
    bool centerOfCornerPixels = (odf.value("GeoRefCorners","CornersOfCorners").compare("No") == 0);
    grf->centerOfPixel(centerOfCornerPixels);
    grf->compute();
    return true;
}
Ejemplo n.º 5
0
bool GeorefConnector::loadGeoref(const IniFile &odf, IlwisObject *data ) {
    QString type = odf.value("GeoRef","Type");
    if ( type == "?") {
        kernel()->issues()->log(TR("Invalid Georef section in %1").arg(odf.url()));
        return false;
    }
    bool ok1, ok2;
    quint32 lines = odf.value("GeoRef","Lines").toInt(&ok1);
    quint32 columns = odf.value("GeoRef","Columns").toInt(&ok2);
    if ( !(ok1 & ok2)) {
        // no consistency in how lines/columns are spelled ( casing). Mostely the above casing is used, but not always
        // so we try again
        lines = odf.value("GeoRef","lines").toInt(&ok1);
        columns = odf.value("GeoRef","columns").toInt(&ok2);
        if ( !(ok1 & ok2))
            return ERROR2(ERR_INVALID_PROPERTY_FOR_2,"Lines/Columns","Georeference");
    }

    GeoReference *grf = static_cast<GeoReference *>(data);
    grf->size(Size<>(columns, lines,1));
    if ( type == "GeoRefCorners") {
        return loadGeorefCorners(odf, data);
    } else if ( type == "GeoRefSubMap") {
        QString name = odf.value("GeoRefSubMap","GeoRef");
        QUrl resource = mastercatalog()->name2url(name, itGEOREF);
        IniFile odf;
        odf.setIniFile(resource.toLocalFile());
        bool ok = loadGeoref(odf,data);
        if (!ok)
            return false;
        grf->size(Size<>(columns, lines,1)); // we dont want the size of the parent georef
        grf->compute();
        return true;
    } else if ( type == "GeoRefCTP"){
        return loadGeorefTiepoints(odf, grf);
    }
    return false;
}
Ejemplo n.º 6
0
bool GeorefConnector::storeMetaData(IlwisObject *obj)
{
    Ilwis3Connector::storeMetaData(obj, itGEOREF);
    GeoReference *grf = static_cast<GeoReference *>(obj);
    QString localPath;
    if ( grf->coordinateSystem()->code() == "unknown")
        localPath = "unknown.csy";
    else{
        localPath = Resource::toLocalFile(grf->coordinateSystem()->source().url(),true, "csy");
        if ( localPath == sUNDEF){
            QString path = context()->workingCatalog()->filesystemLocation().toLocalFile() + "/";
            QString name = grf->coordinateSystem()->name();
            if ( !grf->coordinateSystem()->isAnonymous()) {
                int index = name.indexOf(".csy");
                if ( index != -1){
                    name = QFileInfo(name).baseName();
                    name = name.replace(QRegExp("[/ .'\"]"),"_");
                    name += ".csy";
                }else
                    name = name.replace(QRegExp("[/ .'\"]"),"_");
            }
            localPath = path + name;
        }
    }
    _odf->setKeyValue("GeoRef","CoordSystem", QFileInfo(localPath).fileName());
    Size<> sz = grf->size();
    _odf->setKeyValue("GeoRef","Lines", QString::number(sz.ysize()));
    _odf->setKeyValue("GeoRef","Columns", QString::number(sz.xsize()));
    //CornersGeoReference *cgrf = dynamic_cast<CornersGeoReference *>(grf);
    if ( grf->grfType<CornersGeoReference>()) {
        QSharedPointer<CornersGeoReference> cgrf = grf->as<CornersGeoReference>();
        _odf->setKeyValue("GeoRef","CornersOfCorners", cgrf->centerOfPixel() ? "No" : "Yes");
        _odf->setKeyValue("GeoRef","Type", "GeoRefCorners");
        Coordinate cmin = cgrf->envelope().min_corner();
        Coordinate cmax = cgrf->envelope().max_corner();
        _odf->setKeyValue("GeoRefCorners", "MinX", QString::number(cmin.x));
        _odf->setKeyValue("GeoRefCorners", "MinY", QString::number(cmin.y));
        _odf->setKeyValue("GeoRefCorners", "MaxX", QString::number(cmax.x));
        _odf->setKeyValue("GeoRefCorners", "MaxY", QString::number(cmax.y));

        std::vector<double> matrix = cgrf->matrix();
        _odf->setKeyValue("GeoRefSmpl", "a11", QString::number(matrix[0]));
        _odf->setKeyValue("GeoRefSmpl", "a22", QString::number(matrix[3]));
        _odf->setKeyValue("GeoRefSmpl", "a12", "0");
        _odf->setKeyValue("GeoRefSmpl", "a21", "0");

         std::vector<double> support = cgrf->support();
         _odf->setKeyValue("GeoRefSmpl", "b1", QString::number(support[0]));
         _odf->setKeyValue("GeoRefSmpl", "b2", QString::number(support[1]));

         _odf->store("grf", source().toLocalFile());
        return true;

    }

    return false;

}
bool GeorefConnector::storeMetaData(IlwisObject *obj)
{
    Ilwis3Connector::storeMetaData(obj, itGEOREF);
    GeoReference *grf = static_cast<GeoReference *>(obj);
    _odf->setKeyValue("GeoRef","CoordSystem",Resource::toLocalFile(grf->coordinateSystem()->source().url(),true));
    Size sz = grf->size();
    _odf->setKeyValue("GeoRef","Lines", QString::number(sz.ysize()));
    _odf->setKeyValue("GeoRef","Columns", QString::number(sz.xsize()));
    //CornersGeoReference *cgrf = dynamic_cast<CornersGeoReference *>(grf);
    if ( grf->grfType<CornersGeoReference>()) {
        QSharedPointer<CornersGeoReference> cgrf = grf->impl<CornersGeoReference>();
        _odf->setKeyValue("GeoRef","CornersOfCorners", cgrf->isCornersOfCorners() ? "Yes" : "No");
        _odf->setKeyValue("GeoRef","Type", "GeoRefCorners");
        Coordinate cmin = cgrf->envelope().min_corner();
        Coordinate cmax = cgrf->envelope().max_corner();
        _odf->setKeyValue("GeoRefCorners", "MinX", QString::number(cmin.x()));
        _odf->setKeyValue("GeoRefCorners", "MinY", QString::number(cmin.y()));
        _odf->setKeyValue("GeoRefCorners", "MaxX", QString::number(cmax.x()));
        _odf->setKeyValue("GeoRefCorners", "MaxY", QString::number(cmax.y()));

        std::vector<double> matrix = cgrf->matrix();
        _odf->setKeyValue("GeoRefSmpl", "a11", QString::number(matrix[0]));
        _odf->setKeyValue("GeoRefSmpl", "a22", QString::number(matrix[3]));
        _odf->setKeyValue("GeoRefSmpl", "a12", "0");
        _odf->setKeyValue("GeoRefSmpl", "a21", "0");

         std::vector<double> support = cgrf->support();
         _odf->setKeyValue("GeoRefSmpl", "b1", QString::number(support[0]));
         _odf->setKeyValue("GeoRefSmpl", "b2", QString::number(support[1]));

        _odf->store();
        return true;

    }

    return false;

}
bool GeorefSerializerV1::loadMetaData(IlwisObject *obj, const IOOptions &options)
{
    if (!VersionedSerializer::loadMetaData(obj, options))
        return false;

    VersionedDataStreamFactory *factory = kernel()->factory<VersionedDataStreamFactory>("ilwis::VersionedDataStreamFactory");
    if (!factory)
        return false;

    quint64 type;
    QString version;
    _stream >> type;
    _stream >> version;

    std::unique_ptr<DataInterface> csyStreamer(factory->create(version, itCOORDSYSTEM,_stream));
    if ( !csyStreamer)
        return false;
    GeoReference *grf = static_cast<GeoReference *>(obj);
    ICoordinateSystem csy(type);
    csyStreamer->loadMetaData(csy.ptr(),options);


    quint32 xsize, ysize, zsize;
    _stream >> xsize >> ysize >> zsize;

    bool centerofpixels;
    _stream >> centerofpixels;

    QString typeName;
    _stream >> typeName;
    if ( typeName == CornersGeoReference::typeName()){
        double minx, miny, maxx, maxy;
        _stream >> minx >> miny >> maxx >> maxy;
        CornersGeoReference *cornersgrf = new CornersGeoReference();
        cornersgrf->envelope(Envelope(Coordinate(minx, miny), Coordinate(maxx, maxy)));
        grf->impl(cornersgrf);
    } else if ( typeName == CTPGeoReference::typeName() ){
IlwisObject *InternalIlwisObjectFactory::createGeoreference(const Resource& resource, const IOOptions &options) const {
    GeoReference *cgrf;
    if ( resource.code() == "undetermined"){
        Resource resnew = resource;
        resnew.name(sUNDEF); // this will force a new object with a new id
        resnew.setId(i64UNDEF);
        cgrf = createFromResource<GeoReference>(resource, options);
        cgrf->create("undetermined");
    } else if ( resource.code().indexOf("type=") != -1){ //
        cgrf = createGrfFromCode(resource);
        if (cgrf == 0)
            ERROR2(ERR_ILLEGAL_VALUE_2,"georef code", resource.code());

    }else {
        cgrf = createFromResource<GeoReference>(resource, options);
        cgrf->create("corners");
        cgrf->name( resource["name"].toString());


        ICoordinateSystem csy;
        bool ok;
        if ( resource.hasProperty("coordinatesystem")){
            quint64 id = resource["coordinatesystem"].toULongLong(&ok);
            if ( ok) {
                csy = mastercatalog()->get(id);
            } else
                csy =  resource["coordinatesystem"].value<ICoordinateSystem>();

            cgrf->coordinateSystem(csy);
        }

		if (resource.hasProperty("envelope")) {
			QSharedPointer< CornersGeoReference> spGrf = cgrf->as< CornersGeoReference>();
			spGrf->internalEnvelope(resource["envelope"].value<Envelope>());
		}if (resource.hasProperty("size"))
            cgrf->size(resource["size"].value<Size<>>());
        if ( resource.hasProperty("centerofpixel"))
            cgrf->centerOfPixel(resource["centerofpixel"].toBool());
    }

    return cgrf;
}
bool GeorefSerializerV1::store(IlwisObject *obj, const IOOptions &options)
{
    if (!VersionedSerializer::store(obj, options))
        return false;
    VersionedDataStreamFactory *factory = kernel()->factory<VersionedDataStreamFactory>("ilwis::VersionedDataStreamFactory");
    if (!factory)
        return false;

    GeoReference *grf = static_cast<GeoReference *>(obj);
    std::unique_ptr<DataInterface> csyStreamer(factory->create(Version::IlwisVersion, itCOORDSYSTEM,_stream));
    if ( !csyStreamer)
        return false;
    csyStreamer->store(grf->coordinateSystem().ptr(),options);

    _stream << grf->size().xsize() << grf->size().ysize() << grf->size().zsize();
    _stream << grf->centerOfPixel();

    if ( grf->grfType<CornersGeoReference>()){
        _stream << CornersGeoReference::typeName();
        Envelope envelope = grf->envelope();
        _stream << envelope.min_corner().x << envelope.min_corner().y << envelope.max_corner().x << envelope.max_corner().y;
    } else if ( grf->grfType<CTPGeoReference>()){
        _stream << CTPGeoReference::typeName();
        QSharedPointer<PlanarCTPGeoReference> ctpgrf = grf->as<PlanarCTPGeoReference>();
        int nrOfControlPoints = ctpgrf->nrControlPoints();
        _stream << nrOfControlPoints;
        for(int i =0; i < nrOfControlPoints; ++i){
            _stream << ctpgrf->controlPoint(i).llLocation().x << ctpgrf->controlPoint(i).llLocation().y;
            _stream << ctpgrf->controlPoint(i).x << ctpgrf->controlPoint(i).y;
            _stream << ctpgrf->controlPoint(i).gridLocation().x << ctpgrf->controlPoint(i).gridLocation().y;
            _stream << ctpgrf->controlPoint(i).isActive();
        }
        _stream << (int)ctpgrf->transformation();
    } else if ( grf->grfType<UndeterminedGeoReference>()){
         _stream << UndeterminedGeoReference::typeName();
    }
    return true;

}
GeoReference *InternalIlwisObjectFactory::createGrfFromCode(const Resource& resource) const{
    QString code = resource.code();
//    int index = code.indexOf(":");
//    if ( index != -1)
//        code = code.mid(index + 1);
    QStringList parts = code.split(",");
    std::map<QString, QString> parameters;
    for(auto part : parts){
       int index = part.indexOf("=");
       QString key = part.left(index).trimmed();
       QString value = part.mid(index + 1).trimmed();
       parameters[key] = value;
    }
    bool isCorners = parameters["type"] == "corners";
    GeoReference *cgrf = 0;
    ICoordinateSystem csy;
    Envelope env;
    Size<> sz;
    if ( isCorners){
       cgrf = createFromResource<GeoReference>(resource, IOOptions());
       cgrf->create("corners");
       cgrf->name(ANONYMOUS_PREFIX + QString::number(cgrf->id()));
    }
    if ( cgrf == 0)
        return 0;

    for(auto kvp : parameters){
        if ( kvp.first == "csy"){
            bool ok;
            quint64 id = kvp.second.toULongLong(&ok);
            if ( ok){
                csy .prepare(id);
            }else {
                QString name = kvp.second;
                if ( name.left(4) == "epsg" ||  name.left(5) == "proj4")
                    name = "code=" + name;
                csy.prepare(kvp.second);
            }
            if (!csy.isValid())
                return 0;
        }
        if ( kvp.first == "envelope"){
            QString coordstring = kvp.second;
            QStringList coords = coordstring.split(" ");
            if (coords.size()!= 4)
                return 0;
            bool ok1, ok2;
            env += Coordinate(coords[0].toDouble(&ok1), coords[1].toDouble(&ok2));
            if (!ok1 || !ok2)
                return 0;
            env += Coordinate(coords[2].toDouble(&ok1), coords[3].toDouble(&ok2));
            if (!ok1 || !ok2)
                return 0;
        }
        if ( kvp.first == "gridsize"){
            QStringList dims = kvp.second.split(" ");
            sz = Size<>(dims[0].toUInt(), dims[1].toUInt(),1);

        }
        if ( kvp.first == "name"){
            cgrf->name(kvp.second);
        }
        if ( kvp.first == "cornerofcorners")
            cgrf->centerOfPixel(kvp.second.compare("yes") != 0);
    }
    if ( parameters.find("name") == parameters.end())
        cgrf->name(ANONYMOUS_PREFIX + QString::number(cgrf->id()));
    if ( csy.isValid() && env.isValid() && sz.isValid()){
        cgrf->coordinateSystem(csy);
		QSharedPointer< CornersGeoReference> spGrf = cgrf->as< CornersGeoReference>();
		spGrf->internalEnvelope(env);
        cgrf->size(sz);
        cgrf->compute();
        return cgrf;
    }
    return 0;
}