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; }
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; }
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; }
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; }
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; }