Box2D<double> GeoReference::pixel2Coord(const Box2D<qint32> &box) const { if ( !box.isValid()) { ERROR2(ERR_INVALID_PROPERTY_FOR_2,"size", "box"); return Box2D<double>(); } Coordinate c1 = pixel2Coord(box.min_corner()); Coordinate c2 = pixel2Coord(box.max_corner()); return Box2D<double>(c1,c2); }
Box2D<qint32> GeoReference::coord2Pixel(const Box2D<double> &box) const { if ( !box.isValid()) { ERROR2(ERR_INVALID_PROPERTY_FOR_2,"size", "box"); return Box2D<qint32>(); } Pixel p1 = coord2Pixel(box.min_corner()); Pixel p2 = coord2Pixel(box.max_corner()); return Box2D<qint32>(p1,p2); }
CellID Grid::getCellID(const Eigen::Vector2f &position, bool insert) { static Box2D box; box.min_corner()[0] = std::floor((position[0] / cellSize)) * cellSize; box.min_corner()[1] = std::floor((position[1] / cellSize)) * cellSize; box.max_corner()[0] = box.min_corner()[0] + cellSize; box.max_corner()[1] = box.min_corner()[1] + cellSize; Eigen::Vector2f centroid = boost::geometry::return_centroid<Eigen::Vector2f>(box); CellID cellID = std::make_pair(static_cast<int>(centroid[0]), static_cast<int>(centroid[1])); if (insert) { boost::unordered_map<CellID, SharedCell>::iterator c = cells.find(cellID); if (c == cells.end()) { SharedCell cell(new Cell(cellID)); cells[cellID] = cell; } } return cellID; }
bool CoverageConnector::storeMetaData(IlwisObject *obj, IlwisTypes type, const DataDefinition& datadef) { bool ok = Ilwis3Connector::storeMetaData(obj, type); if ( !ok) return false; Coverage *coverage = static_cast<Coverage *>(obj); const ICoordinateSystem csy = coverage->coordinateSystem(); if (!csy.isValid()) return ERROR2(ERR_NO_INITIALIZED_2, "CoordinateSystem", coverage->name()); QString localName = Resource::toLocalFile(csy->source().url(),true); if ( localName == sUNDEF) { localName = CoordinateSystemConnector::createCsyFromCode(csy->code()); } if ( localName == sUNDEF) { return ERROR2(ERR_NO_INITIALIZED_2, "CoordinateSystem", coverage->name()); } _odf->setKeyValue("BaseMap","CoordSystem", localName); Box2D<double> bounds = coverage->envelope(); if(!bounds.isValid()) return ERROR2(ERR_NO_INITIALIZED_2, "Bounds", coverage->name()); _odf->setKeyValue("BaseMap","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')); const IDomain dom = datadef.domain(); if (!dom.isValid()) return ERROR2(ERR_NO_INITIALIZED_2, "Domain", coverage->name()); calcStatics(obj,NumericStatistics::pBASIC); if ( dom->ilwisType() == itNUMERICDOMAIN) { quint16 digits = coverage->statistics().significantDigits(); qint32 delta = coverage->statistics()[NumericStatistics::pDELTA]; if ( delta >= 0 && delta < 256 && digits == 0){ if ( delta >= 0 && delta < 256 && digits == 0){ if ( datadef.domain()->code() == "boolean"){ QString domInfo = QString("bool.dom;Byte;bool;0;;"); _odf->setKeyValue("BaseMap","DomainInfo",domInfo); _odf->setKeyValue("BaseMap","Range","0:1:offset=-1"); _odf->setKeyValue("BaseMap","Domain","bool.dom"); } else{ QString domInfo = QString("Image.dom;Byte;image;0;;"); _odf->setKeyValue("BaseMap","DomainInfo",domInfo); _odf->setKeyValue("BaseMap","Range","0:255:offset=0"); _odf->setKeyValue("BaseMap","MinMax","0:255"); _odf->setKeyValue("BaseMap","Domain","Image.dom"); } } } else { const NumericStatistics& stats = coverage->statistics(); int digits = stats.significantDigits(); RawConverter conv(stats[NumericStatistics::pMIN], stats[NumericStatistics::pMAX],pow(10, - digits)); QString rangeString = QString("%1:%2:%3:offset=%4").arg(stats[NumericStatistics::pMIN]).arg(stats[NumericStatistics::pMAX]).arg(conv.scale()).arg(conv.offset()); _odf->setKeyValue("BaseMap","Range",rangeString); _odf->setKeyValue("BaseMap","Domain","value.dom"); _odf->setKeyValue("BaseMap","MinMax",QString("%1:%2").arg(stats[NumericStatistics::pMIN]).arg(stats[NumericStatistics::pMAX])); QString domInfo = QString("value.dom;Long;value;0;-9999999.9:9999999.9:0.1:offset=0"); _odf->setKeyValue("BaseMap","DomainInfo",domInfo); } } if ( dom->ilwisType() == itITEMDOMAIN) { QString source = Resource::toLocalFile(dom->source().url(), true); if ( dom->valueType() == itTHEMATICITEM && coverage->ilwisType() == itRASTER) { IThematicDomain themdom = dom.get<ThematicDomain>(); if ( themdom.isValid()) { QString domInfo = QString("%1;Byte;class;%2;;").arg(source).arg(themdom->count()); _odf->setKeyValue("BaseMap","DomainInfo",domInfo); _odf->setKeyValue("BaseMap","Domain",source); } } else if(dom->valueType() == itINDEXEDITEM) { QString domName = _odf->fileinfo().fileName(); QString domInfo = QString("%1;Long;UniqueID;0;;").arg(domName); _odf->setKeyValue("BaseMap","DomainInfo",domInfo); _odf->setKeyValue("BaseMap","Domain",domName); } else if ( dom->valueType() == itNAMEDITEM) { INamedIdDomain iddom = dom.get<NamedIdDomain>(); QString domName = _odf->fileinfo().fileName(); int index; if ( (index=domName.lastIndexOf("."))!= -1) { domName = domName.left(index); } QString domInfo = QString("%1;;Int;id;%2;;").arg(domName).arg(iddom->count()); _odf->setKeyValue("BaseMap","DomainInfo",domInfo); _odf->setKeyValue("BaseMap","Domain",domName); iddom->connectTo(QUrl(),"domain","ilwis3", IlwisObject::cmOUTPUT); iddom->store(Ilwis::IlwisObject::smMETADATA | Ilwis::IlwisObject::smBINARYDATA); } } ITable attTable = coverage->attributeTable(); if ( attTable.isValid()) { QScopedPointer<TableConnector> conn(createTableConnector(attTable, coverage, type)); conn->storeMetaData(attTable.ptr()); } return true; }
cell AMX_NATIVE_CALL Natives::CreateDynamicPolygon(AMX *amx, cell *params) { CHECK_PARAMS(7, "CreateDynamicPolygon"); if (core->getData()->getGlobalMaxItems(STREAMER_TYPE_AREA) == core->getData()->areas.size()) { return 0; } if (static_cast<int>(params[4] >= 2 && static_cast<int>(params[4]) % 2)) { Utility::logError("CreateDynamicPolygon: Number of points must be divisible by two"); return 0; } int areaID = Item::Area::identifier.get(); Item::SharedArea area(new Item::Area); area->amx = amx; area->areaID = areaID; area->type = STREAMER_AREA_TYPE_POLYGON; Utility::convertArrayToPolygon(amx, params[1], params[4], boost::get<Polygon2D>(area->position)); area->height = Eigen::Vector2f(amx_ctof(params[2]), amx_ctof(params[3])); Box2D box = boost::geometry::return_envelope<Box2D>(boost::get<Polygon2D>(area->position)); area->size = static_cast<float>(boost::geometry::comparable_distance(box.min_corner(), box.max_corner())); Utility::addToContainer(area->worlds, static_cast<int>(params[5])); Utility::addToContainer(area->interiors, static_cast<int>(params[6])); Utility::addToContainer(area->players, static_cast<int>(params[7])); core->getGrid()->addArea(area); core->getData()->areas.insert(std::make_pair(areaID, area)); return static_cast<cell>(areaID); }