⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readerwritergdal.cpp

📁 最新osg包
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                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 + -