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; }
bool GeorefConnector::loadGeorefTiepoints(const IniFile& odf, GeoReference *grf) { QString csyName = odf.value("GeoRef","CoordSystem"); QUrl path = mastercatalog()->name2url(csyName, itCOORDSYSTEM); ICoordinateSystem csy; if(!csy.prepare(path.toString())) { return ERROR2(ERR_COULD_NOT_LOAD_2, "coordinate system",csyName); } grf->coordinateSystem(csy); QSharedPointer<PlanarCTPGeoReference> grfctp(grf->as<PlanarCTPGeoReference>()); BinaryIlwis3Table tbl; tbl.load(_odf); std::vector<int> colindexes(10, iUNDEF); enum ColIndexID{ciiX=0, ciiY=1, ciiZ=2, ciiLAT=3, ciiLON=4, ciiXP=5, ciiYP=6, ciiACT=7, ciiDX=8, ciiDY=9, ciiNEVER=10}; colindexes[ciiX] = tbl.index("X"); colindexes[ciiY] = tbl.index("Y"); colindexes[ciiZ] = tbl.index("Z"); colindexes[ciiXP] = tbl.index("Col"); colindexes[ciiYP] = tbl.index("Row"); colindexes[ciiACT] = tbl.index("Active"); //colindexes[ciiDX] = tbl.index("DCol"); //colindexes[ciiDY] = tbl.index("DRow"); for(int rec = 0; rec < tbl.rows(); ++rec){ double x=rUNDEF; tbl.get(rec,colindexes[ciiX],x); double y=rUNDEF; tbl.get(rec,colindexes[ciiY],y); double z=0; if (colindexes[ciiZ] != iUNDEF) { tbl.get(rec,colindexes[ciiZ],z); } double xp=rUNDEF; tbl.get(rec,colindexes[ciiXP],xp); double yp=rUNDEF; tbl.get(rec,colindexes[ciiYP],yp); double active=1; tbl.get(rec,colindexes[ciiACT],active); ControlPoint ctp(Coordinate(x,y,z),Pixeld(xp,yp)); ctp.active(active != 0); grfctp->setControlPoint(ctp); } QString transf = odf.value("GeoRefCTP", "Transformation"); PlanarCTPGeoReference::Transformation transformation; if (transf == "Conform") transformation = PlanarCTPGeoReference::tCONFORM; else if (transf == "Affine") transformation = PlanarCTPGeoReference::tAFFINE; else if (transf == "SecondOrder") transformation = PlanarCTPGeoReference::tSECONDORDER; else if (transf == "FullSecondOrder") transformation = PlanarCTPGeoReference::tFULLSECONDORDER; else if (transf == "ThirdOrder") transformation = PlanarCTPGeoReference::tTHIRDORDER; else if (transf == "Projective") transformation = PlanarCTPGeoReference::tPROJECTIVE; grfctp->transformation(transformation); grfctp->compute(); return true; }
bool CoverageConnector::loadMetaData(Ilwis::IlwisObject *data) { Ilwis3Connector::loadMetaData(data); Coverage *coverage = static_cast<Coverage *>(data); QString csyName = _odf->value("BaseMap","CoordSystem"); if ( csyName.toLower() == "latlonwgs84.csy") csyName = "code=epsg:4326"; ICoordinateSystem csy; if ( !csy.prepare(csyName)) { kernel()->issues()->log(csyName,TR("Coordinate system couldnt be initialized, defaulting to 'unknown'"),IssueObject::itWarning); QString resource = QString("ilwis://file/unknown.csy"); if (!csy.prepare(resource)) { kernel()->issues()->log(TR("Fallback to 'unknown failed', corrupt system files defintion")); return false; } } coverage->setCoordinateSystem(csy); QString attfile = _odf->value("BaseMap", "AttributeTable"); QString basemaptype = _odf->value("BaseMap", "Type"); // feature coverages always have an attribute table; rasters might have if ( basemaptype != "Map" || attfile != sUNDEF) { ITable attTable = prepareAttributeTable(attfile, basemaptype); if (!attTable.isValid()) return false; coverage->attributeTable(attTable); } QString cbounds = _odf->value("BaseMap","CoordBounds"); QStringList parts = cbounds.split(" "); if ( parts.size() == 4) { double minx = parts[0].toDouble(); double miny = parts[1].toDouble(); double maxx = parts[2].toDouble(); double maxy = parts[3].toDouble(); Box2D<double> env(Coordinate(minx, miny), Coordinate(maxx, maxy)); coverage->envelope(env); } else { kernel()->issues()->log(TR(ERR_INVALID_PROPERTY_FOR_2).arg("Coordinate boundaries", data->name()), IssueObject::itWarning); } return true; }
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; }
void LayerManager::linkAcceptMessage(const QVariantMap& parameters) { try { if (parameters.contains("linktype")) { QString linktype = parameters["linktype"].toString(); if (linktype == "zoomextent") { bool ok; QString env = parameters["envelope"].toString(); if (env == "") { QVariantMap extent = parameters["envelope"].toMap(); if (extent.contains("maxx")) { env = QString("%1,%2,%3,%4").arg(extent["minx"].toDouble()).arg(extent["miny"].toDouble()).arg(extent["maxx"].toDouble()).arg(extent["maxy"].toDouble()); } } quint64 csyid = parameters["csyid"].toULongLong(&ok); if (!ok) return; if (rootLayer()->screenCsy()->id() != csyid) { ICoordinateSystem csy; if (!csy.prepare(csyid)) return; QStringList parts = env.split(","); if (parts.size() == 4 || parts.size() == 6) { bool ok1, ok2; Coordinate crd1(parts[0].toDouble(&ok1), parts[1].toDouble(&ok2)); if (!ok1 || !ok2) return; Coordinate crd2(parts[2].toDouble(&ok1), parts[3].toDouble(&ok2)); if (!ok1 || !ok2) return; crd1 = rootLayer()->screenCsy()->coord2coord(csy, crd1); crd2 = rootLayer()->screenCsy()->coord2coord(csy, crd2); if (!crd1.isValid() || !crd2.isValid()) return; env = QString("%1,%2,%3,%4").arg(crd1.x).arg(crd1.y).arg(crd2.x).arg(crd2.y); } } QString cmd = QString("setviewextent(%1, %2)").arg(modelId()).arg(env); addCommand(cmd); } } } catch (const ErrorObject&) {} }
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; }
bool InternalIlwisObjectFactory::createCoverage(const Resource& resource, Coverage *coverage, const IOOptions &options) const { if (!coverage->prepare()) return false; //coverage->setName(QString("%1%2").arg(ANONYMOUS_PREFIX).arg(coverage->id())); ICoordinateSystem csy; QString typnm = resource["coordinatesystem"].typeName(); if (typnm == "Ilwis::ICoordinateSystem") csy = resource["coordinatesystem"].value<Ilwis::ICoordinateSystem>(); else if( typnm == "QString" && resource["coordinatesystem"].toString() != sUNDEF ) { Resource newresource = resource.property2Resource("coordinatesystem", itCOORDSYSTEM); if ( newresource.isValid()) { if (!csy.prepare(newresource,options)) return false; } } else if ( typnm == "qulonglong"){ if(!csy.prepare(resource["coordinatesystem"].value<quint64>())) return 0; } if ( csy.isValid()){ coverage->coordinateSystem(csy); } Envelope bounds; QString envType = resource["envelope"].typeName(); if ( envType == "Ilwis::Box<double>" || envType == "Ilwis::Envelope") { bounds = resource["envelope"].value<Envelope>(); }else if (QString(resource["envelope"].typeName()) == "QString" && resource["envelope"].toString() != sUNDEF) { bounds = Envelope(resource["envelope"].toString()); } if ( bounds.isValid()) { coverage->envelope(bounds); } if ( resource.ilwisType() == itRASTER) { IDomain dom; QString tpname = resource["domain"].typeName(); if (tpname == "Ilwis::IDomain") dom = resource["domain"].value<Ilwis::IDomain>(); else if( tpname == "QString" && resource["domain"].toString() != sUNDEF ) { Resource newresource = resource.property2Resource("domain", itDOMAIN); if ( newresource.isValid()) { if (!dom.prepare(newresource, options)) return false; } } else if ( tpname == "qulonglong"){ if(!dom.prepare(resource["domain"].value<quint64>())) return 0; } if ( dom.isValid()){ RasterCoverage *raster = static_cast<RasterCoverage *>(coverage); raster->datadefRef().domain(dom); } } return true; }