FeatureDrawing SimplePointSetter::setSpatialAttributes(const SPFeatureI &feature, QVector<QVector3D> &vertices, QVector<QVector3D> &) const { Envelope env = _rootDrawer->attribute("coverageenvelope").value<Envelope>(); double size = env.xlength() / 150.0; const UPGeometry& geometry = feature->geometry(); int n = geometry->getNumGeometries(); FeatureDrawing drawing(itPOINT); for(int geom = 0; geom < n; ++geom ){ const geos::geom::Geometry *subgeom = geometry->getGeometryN(geom); if (!subgeom) continue; const geos::geom::Coordinate *crd = subgeom->getCoordinate(); Coordinate coord = *crd; if ( coordinateConversionNeeded()){ coord = _targetSystem->coord2coord(_sourceSystem, *crd); } drawing._indices.push_back(VertexIndex(vertices.size(),5,GL_LINE_STRIP,feature->featureid())); double z = coord.z == rUNDEF || std::isnan(coord.z)? 0 : coord.z; vertices.push_back(QVector3D(coord.x + size, coord.y + size, z)); vertices.push_back(QVector3D(coord.x - size, coord.y + size, z)); vertices.push_back(QVector3D(coord.x - size, coord.y - size, z)); vertices.push_back(QVector3D(coord.x + size, coord.y - size, z)); vertices.push_back(QVector3D(coord.x + size, coord.y + size, z)); drawing._center = QVector3D(coord.x, coord.y, coord.z); } return drawing; }
bool FeatureConnector::loadBinaryPolygons37(FeatureCoverage *fcoverage, ITable& tbl) { QString datafile = _odf->value("PolygonMapStore","DataPol"); datafile = context()->workingCatalog()->filesystemLocation().toLocalFile() + "/" + datafile; QFile file(datafile); if (!file.exists()){ kernel()->issues()->log(TR(ERR_MISSING_DATA_FILE_1).arg(file.fileName())); return false; } if(!file.open(QIODevice::ReadOnly )){ kernel()->issues()->log(TR(ERR_COULD_NOT_OPEN_READING_1).arg(file.fileName())); return false; } QDataStream stream(&file); int nrPolygons = fcoverage->featureCount(itPOLYGON); SPAttributeRecord record( new AttributeRecord(tbl,FEATUREIDCOLUMN)); bool isNumeric = _odf->value("BaseMap","Range") != sUNDEF; for(int j=0; j < nrPolygons; ++j) { Polygon pol; readRing(stream, pol.outer()); double value; quint32 numberOfHoles; stream.readRawData((char *)&value, 8); stream.readRawData((char *)&numberOfHoles, 4); pol.inners().resize(numberOfHoles); for(quint32 i=0; i< numberOfHoles;++i) readRing(stream, pol.inners()[i]); if ( isNumeric) { tbl->cell(COVERAGEKEYCOLUMN, j, QVariant(j)); tbl->cell(FEATUREVALUECOLUMN, j, QVariant(value)); SPFeatureI feature = fcoverage->newFeature({pol}); tbl->cell(FEATUREIDCOLUMN, j, QVariant(feature->featureid())); } else { quint32 itemId = value; tbl->cell(COVERAGEKEYCOLUMN, j, QVariant(itemId)); SPFeatureI feature = fcoverage->newFeature({pol}); tbl->cell(FEATUREIDCOLUMN, j, QVariant(feature->featureid())); } } file.close(); return true; }
bool FeatureConnector::loadBinarySegments(FeatureCoverage *fcoverage) { BinaryIlwis3Table mpsTable; if ( !mpsTable.load(_odf)) { return ERROR1(ERR_COULD_NOT_OPEN_READING_1,_odf->fileinfo().fileName()) ; } int colCoords = mpsTable.index("Coords"); int colItemId = mpsTable.index("SegmentValue"); bool isNumeric = _odf->value("BaseMap","Range") != sUNDEF; ITable tbl = fcoverage->attributeTable(); // if ( isNumeric) // in other case nr of record already has been set as it is based on a real table // tbl->setRows(mpsTable.rows()); double value; for(quint32 i= 0; i < mpsTable.rows(); ++i) { std::vector<Coordinate > coords; mpsTable.get(i,colCoords,coords); Line2D<Coordinate2d > line; line.resize(coords.size()); std::copy(coords.begin(), coords.end(), line.begin()); mpsTable.get(i, colItemId,value); if ( isNumeric) { tbl->cell(COVERAGEKEYCOLUMN, i, QVariant(i)); tbl->cell(FEATUREVALUECOLUMN, i, QVariant(value)); SPFeatureI feature = fcoverage->newFeature({line}); tbl->cell(FEATUREIDCOLUMN, i, QVariant(feature->featureid())); } else { quint32 itemId = value; tbl->cell(COVERAGEKEYCOLUMN, i, QVariant(itemId)); SPFeatureI feature = fcoverage->newFeature({line}); tbl->cell(FEATUREIDCOLUMN, i, QVariant(feature->featureid())); } } return true; }
FeatureDrawing SimplePolygonSetter::setSpatialAttributes(const SPFeatureI &feature, QVector<QVector3D> &vertices, QVector<QVector3D> &normals) const { IlwisTesselator tesselator; const UPGeometry& geometry = feature->geometry(); int n = geometry->getNumGeometries(); FeatureDrawing drawing(itPOLYGON); for(int geom = 0; geom < n; ++geom ){ const geos::geom::Geometry *subgeom = geometry->getGeometryN(geom); if (!subgeom) continue; tesselator.tesselate(_targetSystem,_sourceSystem, subgeom,feature->featureid(), vertices, drawing._indices); } return drawing; }
bool FeatureConnector::loadBinaryPolygons30(FeatureCoverage *fcoverage, ITable& tbl) { BinaryIlwis3Table polTable; if ( !polTable.load(_odf)) { return ERROR1(ERR_COULD_NOT_OPEN_READING_1,_odf->fileinfo().fileName()) ; } BinaryIlwis3Table topTable; if ( !topTable.load(_odf,"top")) { return ERROR1(ERR_COULD_NOT_OPEN_READING_1,_odf->fileinfo().fileName()) ; } qint32 colValue = polTable.index("PolygonValue"); qint32 colTopStart = polTable.index("TopStart"); qint32 colArea = polTable.index("Area"); int nrPolygons = polTable.rows(); bool isNumeric = _odf->value("BaseMap","Range") != sUNDEF; double v; for(int i = 0; i < nrPolygons; ++i) { polTable.get(i,colArea, v); if ( v < 0) continue; polTable.get(i,colTopStart,v); qint32 index = v; std::vector<std::vector<Coordinate2d>> rings; if (getRings(index, topTable, polTable, rings)) { if ( rings.size() == 0) continue; Polygon polygon; polygon.outer().resize(rings[0].size()); std::copy(rings[0].begin(), rings[0].end(), polygon.outer().begin()); for(int j = 1; j < rings.size(); ++j) { polygon.inners()[j-1].resize(rings[j].size()); std::copy(rings[j].begin(), rings[j].end(), polygon.inners()[j-1].begin()); } polTable.get(i, colValue, v); if ( isNumeric) { tbl->cell(COVERAGEKEYCOLUMN, i, QVariant(i)); tbl->cell(FEATUREVALUECOLUMN, i, QVariant(v)); fcoverage->newFeature({polygon}); } else { quint32 itemId = v; tbl->cell(COVERAGEKEYCOLUMN, i, QVariant(itemId)); SPFeatureI feature = fcoverage->newFeature({polygon}); tbl->cell(FEATUREIDCOLUMN, i, QVariant(feature->featureid())); } } } return true; }
bool FeatureConnector::loadBinaryPoints(FeatureCoverage *fcoverage) { BinaryIlwis3Table mppTable; if ( !mppTable.load(_odf)) { return ERROR1(ERR_COULD_NOT_OPEN_READING_1,_odf->fileinfo().fileName()) ; } // two cases; the old case; 2 columns for x and y. and the new case one column for coord int coordColumnX = mppTable.index("x"); int coordColumnY = mppTable.index("y"); int coordColumn = mppTable.index("Coordinate"); int colItemId = mppTable.index("Name"); ITable tbl = fcoverage->attributeTable(); bool newCase = coordColumnX == iUNDEF; for(quint32 i= 0; i < mppTable.rows(); ++i) { Coordinate c; double itemIdT; if ( newCase) { mppTable.get(i, coordColumn, c); } else { double x,y; mppTable.get(i, coordColumnX, x); mppTable.get(i, coordColumnY, y); c = Coordinate(x,y); } mppTable.get(i, colItemId,itemIdT); quint32 itemId = itemIdT; tbl->cell(COVERAGEKEYCOLUMN, i, QVariant(itemId)); SPFeatureI feature = fcoverage->newFeature({c}); tbl->cell(FEATUREIDCOLUMN, i, QVariant(feature->featureid())); } return true; }