📄 readerwritergdal.cpp
字号:
osg::notify(osg::INFO) << "not found any usable bands in file."<<std::endl; } //GDALOpen(dataset); if (imageData) { osg::Image* image = new osg::Image; image->setFileName(fileName.c_str()); image->setImage(s,t,r, internalFormat, pixelFormat, dataType, (unsigned char *)imageData, osg::Image::USE_NEW_DELETE); if (texCoordRange) image->setUserData(texCoordRange); image->flipVertical(); return image; } return 0; } ReadResult local_readHeightField(const std::string& fileName, const osgDB::ReaderWriter::Options* options) { //std::string ext = osgDB::getFileExtension(fileName); //if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED; initGDAL(); std::auto_ptr<GDALDataset> dataset((GDALDataset*)GDALOpen(fileName.c_str(),GA_ReadOnly)); if (!dataset.get()) return ReadResult::FILE_NOT_HANDLED; int dataWidth = dataset->GetRasterXSize(); int dataHeight = dataset->GetRasterYSize(); int windowX = 0; int windowY = 0; int windowWidth = dataWidth; int windowHeight = dataHeight; int destX = 0; int destY = 0; int destWidth = osg::minimum(dataWidth,4096); int destHeight = osg::minimum(dataHeight,4096); osgDB::ImageOptions::TexCoordRange* texCoordRange = 0; const osgDB::ImageOptions* imageOptions = dynamic_cast<const osgDB::ImageOptions*>(options); if (imageOptions) { osg::notify(osg::INFO)<<"Got ImageOptions"<<std::endl; int margin = 0; switch(imageOptions->_sourceImageWindowMode) { case(osgDB::ImageOptions::RATIO_WINDOW): { double desiredX = (double)dataWidth * imageOptions->_sourceRatioWindow.windowX; double desiredY = (double)dataHeight * imageOptions->_sourceRatioWindow.windowY; double desiredWidth = (double)dataWidth * imageOptions->_sourceRatioWindow.windowWidth; double desiredHeight = (double)dataHeight * imageOptions->_sourceRatioWindow.windowHeight; windowX = osg::maximum((int)(floor(desiredX))-margin,0); windowY = osg::maximum((int)(floor(desiredY))-margin,0); windowWidth = osg::minimum((int)(ceil(desiredX + desiredWidth))+margin,dataWidth)-windowX; windowHeight = osg::minimum((int)(ceil(desiredY + desiredHeight))+margin,dataHeight)-windowY; texCoordRange = new osgDB::ImageOptions::TexCoordRange; texCoordRange->set((desiredX-(double)windowX)/(double)windowWidth, ((double)(windowY+windowHeight) -(desiredY+desiredHeight))/(double)windowHeight, (desiredWidth)/(double)windowWidth, (desiredHeight)/(double)windowHeight); osg::notify(osg::INFO)<<"tex coord range "<<texCoordRange->_x<<" "<<texCoordRange->_y<<" "<<texCoordRange->_w<<" "<<texCoordRange->_h<<std::endl; } break; case(osgDB::ImageOptions::PIXEL_WINDOW): windowX = imageOptions->_sourcePixelWindow.windowX; windowY = imageOptions->_sourcePixelWindow.windowY; windowWidth = imageOptions->_sourcePixelWindow.windowWidth; windowHeight = imageOptions->_sourcePixelWindow.windowHeight; break; default: // leave source window dimensions as whole image. break; } switch(imageOptions->_destinationImageWindowMode) { case(osgDB::ImageOptions::RATIO_WINDOW): destX = (unsigned int)(floor((double)dataWidth * imageOptions->_destinationRatioWindow.windowX)); destY = (unsigned int)(floor((double)dataHeight * imageOptions->_destinationRatioWindow.windowY)); destWidth = (unsigned int)(ceil((double)dataWidth * (imageOptions->_destinationRatioWindow.windowX + imageOptions->_destinationRatioWindow.windowWidth)))-windowX; destHeight = (unsigned int)(ceil((double)dataHeight * (imageOptions->_destinationRatioWindow.windowY + imageOptions->_destinationRatioWindow.windowHeight)))-windowY; break; case(osgDB::ImageOptions::PIXEL_WINDOW): destX = imageOptions->_destinationPixelWindow.windowX; destY = imageOptions->_destinationPixelWindow.windowY; destWidth = imageOptions->_destinationPixelWindow.windowWidth; destHeight = imageOptions->_destinationPixelWindow.windowHeight; break; default: // leave source window dimensions as whole image. break; } } // windowX = 0; // windowY = 0; // windowWidth = destWidth;// windowHeight = destHeight; osg::notify(osg::INFO) << " windowX = "<<windowX<<std::endl; osg::notify(osg::INFO) << " windowY = "<<windowY<<std::endl; osg::notify(osg::INFO) << " windowWidth = "<<windowWidth<<std::endl; osg::notify(osg::INFO) << " windowHeight = "<<windowHeight<<std::endl; osg::notify(osg::INFO) << std::endl; osg::notify(osg::INFO) << " destX = "<<destX<<std::endl; osg::notify(osg::INFO) << " destY = "<<destY<<std::endl; osg::notify(osg::INFO) << " destWidth = "<<destWidth<<std::endl; osg::notify(osg::INFO) << " destHeight = "<<destHeight<<std::endl; osg::notify(osg::INFO) << std::endl; osg::notify(osg::INFO) << " GetRaterCount() "<< dataset->GetRasterCount()<<std::endl; osg::notify(osg::INFO) << " GetProjectionRef() "<< dataset->GetProjectionRef()<<std::endl; double geoTransform[6]; osg::notify(osg::INFO) << " GetGeoTransform == "<< dataset->GetGeoTransform(geoTransform)<<" == CE_None"<<std::endl; osg::notify(osg::INFO) << " GetGeoTransform "<< std::endl; osg::notify(osg::INFO) << " Origin = "<<geoTransform[0]<<" "<<geoTransform[3]<<std::endl; osg::notify(osg::INFO) << " Pixel X = "<<geoTransform[1]<<" "<<geoTransform[4]<<std::endl; osg::notify(osg::INFO) << " Pixel Y = "<<geoTransform[2]<<" "<<geoTransform[5]<<std::endl; double TopLeft[2],BottomLeft[2],BottomRight[2],TopRight[2]; TopLeft[0] = geoTransform[0]; TopLeft[1] = geoTransform[3]; BottomLeft[0] = TopLeft[0]+geoTransform[2]*(dataHeight-1); BottomLeft[1] = TopLeft[1]+geoTransform[5]*(dataHeight-1); BottomRight[0] = BottomLeft[0]+geoTransform[1]*(dataWidth-1); BottomRight[1] = BottomLeft[1]+geoTransform[4]*(dataWidth-1); TopRight[0] = TopLeft[0]+geoTransform[1]*(dataWidth-1); TopRight[1] = TopLeft[1]+geoTransform[4]*(dataWidth-1); double rotation = atan2(geoTransform[2], geoTransform[1]); osg::notify(osg::INFO)<<"GDAL rotation = "<<rotation<<std::endl; osg::notify(osg::INFO) << "TopLeft "<<TopLeft[0]<<"\t"<<TopLeft[1]<<std::endl; osg::notify(osg::INFO) << "BottomLeft "<<BottomLeft[0]<<"\t"<<BottomLeft[1]<<std::endl; osg::notify(osg::INFO) << "BottomRight "<<BottomRight[0]<<"\t"<<BottomRight[1]<<std::endl; osg::notify(osg::INFO) << "TopRight "<<TopRight[0]<<"\t"<<TopRight[1]<<std::endl; osg::notify(osg::INFO)<<" GDALGetGCPCount "<<dataset->GetGCPCount()<<std::endl; int numBands = dataset->GetRasterCount(); GDALRasterBand* bandGray = 0; GDALRasterBand* bandRed = 0; GDALRasterBand* bandGreen = 0; GDALRasterBand* bandBlue = 0; GDALRasterBand* bandAlpha = 0; for(int b=1;b<=numBands;++b) { GDALRasterBand* band = dataset->GetRasterBand(b); osg::notify(osg::INFO) << " Band "<<b<<std::endl; osg::notify(osg::INFO) << " GetOverviewCount() = "<< band->GetOverviewCount()<<std::endl; osg::notify(osg::INFO) << " GetColorTable() = "<< band->GetColorTable()<<std::endl; osg::notify(osg::INFO) << " DataTypeName() = "<< GDALGetDataTypeName(band->GetRasterDataType())<<std::endl; osg::notify(osg::INFO) << " ColorIntepretationName() = "<< GDALGetColorInterpretationName(band->GetColorInterpretation())<<std::endl; osg::notify(osg::INFO) << std::endl; osg::notify(osg::INFO) << " GetNoDataValue() = "<< band->GetNoDataValue()<<std::endl; osg::notify(osg::INFO) << " GetMinimum() = "<< band->GetMinimum()<<std::endl; osg::notify(osg::INFO) << " GetMaximum() = "<< band->GetMaximum()<<std::endl; osg::notify(osg::INFO) << " GetOffset() = "<< band->GetOffset()<<std::endl; osg::notify(osg::INFO) << " GetScale() = "<< band->GetScale()<<std::endl; osg::notify(osg::INFO) << " GetUnitType() = '"<< band->GetUnitType()<<"'"<<std::endl; if (band->GetColorInterpretation()==GCI_GrayIndex) bandGray = band; else if (band->GetColorInterpretation()==GCI_RedBand) bandRed = band; else if (band->GetColorInterpretation()==GCI_GreenBand) bandGreen = band; else if (band->GetColorInterpretation()==GCI_BlueBand) bandBlue = band; else if (band->GetColorInterpretation()==GCI_AlphaBand) bandAlpha = band; else bandGray = band; } GDALRasterBand* bandSelected = 0; if (!bandSelected && bandGray) bandSelected = bandGray; else if (!bandSelected && bandAlpha) bandSelected = bandAlpha; else if (!bandSelected && bandRed) bandSelected = bandRed; else if (!bandSelected && bandGreen) bandSelected = bandGreen; else if (!bandSelected && bandBlue) bandSelected = bandBlue; if (bandSelected) { osg::HeightField* hf = new osg::HeightField; hf->allocate(destWidth,destHeight); bandSelected->RasterIO(GF_Read,windowX,windowY,windowWidth,windowHeight,(void*)(&(hf->getHeightList().front())),destWidth,destHeight,GDT_Float32,0,0); // now need to flip since the OSG's origin is in lower left corner. osg::notify(osg::INFO)<<"flipping"<<std::endl; unsigned int copy_r = hf->getNumRows()-1; for(unsigned int r=0;r<copy_r;++r,--copy_r) { for(unsigned int c=0;c<hf->getNumColumns();++c) { float temp = hf->getHeight(c,r); hf->setHeight(c,r,hf->getHeight(c,copy_r)); hf->setHeight(c,copy_r,temp); } } hf->setOrigin(osg::Vec3(BottomLeft[0],BottomLeft[1],0)); hf->setXInterval(sqrt(geoTransform[1]*geoTransform[1] + geoTransform[2]*geoTransform[2])); hf->setYInterval(sqrt(geoTransform[4]*geoTransform[4] + geoTransform[5]*geoTransform[5])); hf->setRotation(osg::Quat(rotation, osg::Vec3d(0.0, 0.0, 1.0))); return hf; } return ReadResult::FILE_NOT_HANDLED; } void initGDAL() const { static bool s_initialized = false; if (!s_initialized) { s_initialized = true; GDALAllRegister(); } } mutable OpenThreads::ReentrantMutex _serializerMutex; };// now register with Registry to instantiate the above// reader/writer.osgDB::RegisterReaderWriterProxy<ReaderWriterGDAL> g_readerWriter_GDAL_Proxy;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -