wxThread::ExitCode wxGxContentView::Entry() { while (!GetThread()->TestDestroy()) { long nID = wxNOT_FOUND; m_CritSectFillMeta.Enter(); if (m_anFillMetaIDs.GetCount() > 0) { nID = m_anFillMetaIDs[0]; m_anFillMetaIDs.RemoveAt(0); } m_CritSectFillMeta.Leave(); if (nID == wxNOT_FOUND) { wxThread::Sleep(950); } else { IGxDataset* pDSet = dynamic_cast<IGxDataset*>(m_pCatalog->GetRegisterObject(nID)); if (NULL != pDSet) { pDSet->FillMetadata(true); m_pCatalog->ObjectChanged(nID); } } } return (wxThread::ExitCode)wxTHREAD_NO_ERROR; // success }
void wxGxMapView::OnSelectionChanged(IGxSelection* Selection, long nInitiator) { if(nInitiator == GetId()) return; GxObjectArray* pGxObjectArray = m_pSelection->GetSelectedObjects(); if(pGxObjectArray == NULL || pGxObjectArray->size() == 0) return; IGxObject* pGxObj = pGxObjectArray->at(pGxObjectArray->size() - 1); if(m_pParentGxObject == pGxObj) return; IGxDataset* pGxDataset = dynamic_cast<IGxDataset*>(pGxObj); if(pGxDataset == NULL) return; wxGISDataset* pwxGISDataset = pGxDataset->GetDataset(); if(pwxGISDataset == NULL) return; wxGISEnumDatasetType type = pwxGISDataset->GetType(); wxGISLayer* pwxGISLayer = NULL; switch(type) { case enumGISFeatureDataset: pwxGISLayer = new wxGISFeatureLayer(pwxGISDataset); break; case enumGISRasterDataset: pwxGISLayer = new wxGISRasterLayer(pwxGISDataset); break; default: break; } if(pwxGISLayer) pwxGISLayer->SetName(pGxObj->GetName()); //the pOGRLayer will live while IGxObject live. IGxObject( from IGxSelection ) store IwxGISDataset, and destroy it then catalog destroyed wsDELETE(pwxGISDataset); //OGRLayer* pOGRLayer = pwxGISDataset->GetDataset(); //if(pOGRLayer == NULL) //{ // return; //} ClearLayers(); if(pwxGISLayer && pwxGISLayer->IsValid()) AddLayer(pwxGISLayer);//m_GISMap. m_pParentGxObject = pGxObj; wxGISMapView::Refresh(); }
bool wxGxMapView::Applies(IGxSelection* Selection) { if(Selection == NULL) return false; GxObjectArray* pGxObjectArray = Selection->GetSelectedObjects(); for(size_t i = 0; i < pGxObjectArray->size(); i++) { IGxDataset* pGxDataset = dynamic_cast<IGxDataset*>( pGxObjectArray->at(i) ); if(pGxDataset != NULL) { wxGISEnumDatasetType type = pGxDataset->GetType(); switch(type) { case enumGISRasterDataset: case enumGISFeatureDataset: return true; case enumGISTableDataset: break; } } } return false; }
bool wxGISGPSubRasterByVectorTool::Execute(ITrackCancel* pTrackCancel) { if(!Validate()) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Unexpected error occurred"), -1, enumGISMessageErr); return false; } IGxObjectContainer* pGxObjectContainer = dynamic_cast<IGxObjectContainer*>(m_pCatalog); if(!pGxObjectContainer) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Error getting catalog object"), -1, enumGISMessageErr); return false; } wxString sSrcVecPath = m_paParam[0]->GetValue(); IGxObject* pGxObject = pGxObjectContainer->SearchChild(sSrcVecPath); if(!pGxObject) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Error getting source vector object"), -1, enumGISMessageErr); return false; } IGxDataset* pGxDataset = dynamic_cast<IGxDataset*>(pGxObject); if(!pGxDataset) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Source object is of incompatible type"), -1, enumGISMessageErr); return false; } wxGISFeatureDatasetSPtr pSrcFeatureDataSet = boost::dynamic_pointer_cast<wxGISFeatureDataset>(pGxDataset->GetDataset()); if(!pSrcFeatureDataSet) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Source vector dataset is of incompatible type"), -1, enumGISMessageErr); return false; } wxString sSrcRasterPath = m_paParam[1]->GetValue(); pGxObject = pGxObjectContainer->SearchChild(sSrcRasterPath); if(!pGxObject) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Error getting source raster object"), -1, enumGISMessageErr); return false; } pGxDataset = dynamic_cast<IGxDataset*>(pGxObject); if(!pGxDataset) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Source object is of incompatible type"), -1, enumGISMessageErr); return false; } wxGISRasterDatasetSPtr pSrcRasterDataSet = boost::dynamic_pointer_cast<wxGISRasterDataset>(pGxDataset->GetDataset()); if(!pSrcRasterDataSet) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Source raster dataset is of incompatible type"), -1, enumGISMessageErr); return false; } wxString sDstPath = m_paParam[2]->GetValue(); IGxObject* pGxDstObject = pGxObjectContainer->SearchChild(sDstPath); if(!pGxDstObject) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Error get destination object"), -1, enumGISMessageErr); return false; } CPLString szDstPath = pGxDstObject->GetInternalName(); bool bRes = true; wxGxRasterFilter* pFilter = new wxGxRasterFilter(enumRasterTiff); GDALDataType eOutputType = GDT_Byte; int nBandCount = 0; int *panBandList = NULL; bool bUseCounter = false; int nCounterBegin = -1; int nFieldNo = 0; double dfOutResX = -1; double dfOutResY = -1; bool bCopyNodata = false; bool bSkipSourceMetadata = false; char** papszOptions = NULL; papszOptions = CSLAddNameValue(papszOptions, "DEST_RESAMPLING", "near"); papszOptions = CSLAddNameValue(papszOptions, "COMPRESS", "LZW"); papszOptions = CSLAddNameValue(papszOptions, "PREDICTOR", "2"); bRes = SubrasterByVector(pSrcFeatureDataSet, pSrcRasterDataSet, szDstPath, pFilter, eOutputType, nBandCount, panBandList, bUseCounter, nCounterBegin, nFieldNo, dfOutResX, dfOutResY, bCopyNodata, bSkipSourceMetadata, papszOptions, pTrackCancel); if(pGxObjectContainer) { IGxObject* pParentLoc = pGxObjectContainer->SearchChild(sDstPath); if(pParentLoc) pParentLoc->Refresh(); } return bRes; }
void wxGxContentView::OnObjectChanged(wxGxCatalogEvent& event) { //wxLogDebug(wxT("ContentView Object %d Change"), event.GetObjectID()); if(event.GetObjectID() == m_nParentGxObjectID) { wxGxObject* pGxObject = m_pCatalog->GetRegisterObject(event.GetObjectID()); wxGxObjectContainer* pObjectContainer = wxDynamicCast(pGxObject, wxGxObjectContainer); if(pObjectContainer != NULL) { wxBusyCursor wait; if(GetItemCount() > 0 && !pObjectContainer->HasChildren()) { ResetContents(); } else if(GetItemCount() == 0 && pObjectContainer->HasChildren()) { RefreshAll(); return; } } } bool bItemsHaveChanges = false; for(long i = 0; i < GetItemCount(); ++i) { LPITEMDATA pItemData = (LPITEMDATA)GetItemData(i); if(pItemData == NULL) continue; if(pItemData->nObjectID != event.GetObjectID()) continue; wxGxObject* pGxObject = m_pCatalog->GetRegisterObject(event.GetObjectID()); IGxObjectUI* pObjUI = dynamic_cast<IGxObjectUI*>(pGxObject); wxIcon icon_small, icon_large; if(pObjUI != NULL) { icon_small = pObjUI->GetSmallImage(); icon_large = pObjUI->GetLargeImage(); } bool bChangeIcon = false; int pos = GetIconPos(icon_small, icon_large); bChangeIcon = pItemData->iImageIndex != pos; pItemData->iImageIndex = pos; wxString sName; if(m_pCatalog->GetShowExt()) sName = pGxObject->GetName(); else sName = pGxObject->GetBaseName(); wxString sType = pGxObject->GetCategory(); if (GetItemText(i, 0) != sName) { SetItem(i, 0, sName, pos); if (m_currentSortCol == 0) { bItemsHaveChanges = true; } } else if(bChangeIcon) { SetItemImage(i, pos); } if(m_current_style == enumGISCVReport) { if (GetItemText(i, 1) != sType) { SetItem(i, 1, sType); if (m_currentSortCol == 1) { bItemsHaveChanges = true; } } IGxDataset* pDSet = dynamic_cast<IGxDataset*>(pGxObject); if(pDSet) { if (pDSet->IsMetadataFilled()) { if (pDSet->GetSize() > 0) SetItem(i, 2, wxFileName::GetHumanReadableSize(pDSet->GetSize())); if (pDSet->GetModificationDate().IsValid()) SetItem(i, 3, pDSet->GetModificationDate().Format()); } else { wxCriticalSectionLocker locker(m_CritSectFillMeta); m_anFillMetaIDs.Add(pGxObject->GetId()); } } } } if(bItemsHaveChanges) { SORTDATA sortdata = {m_bSortAsc, m_currentSortCol}; SortItems(GxObjectCVCompareFunction, (long)&sortdata); SetColumnImage(m_currentSortCol, m_bSortAsc ? 0 : 1); } // wxListCtrl::Refresh(); }
bool wxGISGPCreateOverviewsTool::Execute(ITrackCancel* pTrackCancel) { if(!Validate()) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Unexpected error occurred"), -1, enumGISMessageErr); return false; } IGxObjectContainer* pGxObjectContainer = dynamic_cast<IGxObjectContainer*>(m_pCatalog); if(!pGxObjectContainer) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Error getting catalog object"), -1, enumGISMessageErr); return false; } wxString sSrcPath = m_paParam[0]->GetValue(); IGxObject* pGxObject = pGxObjectContainer->SearchChild(sSrcPath); if(!pGxObject) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Error getting source object"), -1, enumGISMessageErr); return false; } IGxDataset* pGxDataset = dynamic_cast<IGxDataset*>(pGxObject); if(!pGxDataset) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Source object is of incompatible type"), -1, enumGISMessageErr); return false; } wxGISRasterDatasetSPtr pSrcDataSet = boost::dynamic_pointer_cast<wxGISRasterDataset>(pGxDataset->GetDataset()); if(!pSrcDataSet) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Source dataset is of incompatible type"), -1, enumGISMessageErr); return false; } if(!pSrcDataSet->IsOpened()) if(!pSrcDataSet->Open(true)) return false; GDALDataset* poGDALDataset = pSrcDataSet->GetRaster(); if(!poGDALDataset) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Error getting raster"), -1, enumGISMessageErr); return false; } wxString sResampleMethod = m_paParam[1]->GetValue(); wxString sCompress = m_paParam[2]->GetValue(); CPLSetConfigOption( "COMPRESS_OVERVIEW", sCompress.mb_str() ); if(pSrcDataSet->GetSubType() == enumRasterImg) { CPLSetConfigOption( "USE_RRD", "YES" ); CPLSetConfigOption( "HFA_USE_RRD", "YES" ); } else CPLSetConfigOption( "USE_RRD", "NO" ); wxArrayString saLevels = m_paParam[3]->GetValue().GetArrayString(); int anOverviewList[25] = {0}; int nLevelCount = saLevels.GetCount(); for(size_t i = 0; i < saLevels.GetCount(); ++i) { int nLevel = wxAtoi(saLevels[i]); anOverviewList[i] = nLevel; } CPLErr eErr = poGDALDataset->BuildOverviews( sResampleMethod.mb_str(), nLevelCount, anOverviewList, 0, NULL, ExecToolProgress, (void*)pTrackCancel ); if(eErr != CE_None) { if(pTrackCancel) { const char* pszErr = CPLGetLastErrorMsg(); pTrackCancel->PutMessage(wxString::Format(_("BuildOverviews failed! GDAL error: %s"), wxString(pszErr, wxConvUTF8).c_str()), -1, enumGISMessageErr); } return false; } pSrcDataSet->SetHasOverviews(true); return true; }
bool wxGISGPCreateOverviewsTool::Validate(void) { wxString sPath = m_paParam[0]->GetValue(); if(sPath.CmpNoCase(m_sInputPath) != 0) { if(m_paParam[0]->GetIsValid()) { //fill fields list IGxObjectContainer* pGxObjectContainer = dynamic_cast<IGxObjectContainer*>(m_pCatalog); if(!pGxObjectContainer) { m_paParam[0]->SetIsValid(false); m_paParam[0]->SetMessage(wxGISEnumGPMessageError, _("The GxCatalog is undefined type (not inherited from IGxObjectContainer)")); return false; } IGxObject* pGxObject = pGxObjectContainer->SearchChild(sPath); if(!pGxObject) { m_paParam[0]->SetIsValid(false); m_paParam[0]->SetMessage(wxGISEnumGPMessageError, wxString::Format(_("There is no GxObject for path %s"), sPath.c_str())); return false; } IGxDataset* pGxDataset = dynamic_cast<IGxDataset*>(pGxObject); if(!pGxDataset) { m_paParam[0]->SetIsValid(false); m_paParam[0]->SetMessage(wxGISEnumGPMessageError, wxString::Format(_("The input path is not GxDataset (Path %s)"), sPath.c_str())); return false; } wxGISRasterDatasetSPtr pSrcRaster = boost::dynamic_pointer_cast<wxGISRasterDataset>(pGxDataset->GetDataset()); if(!pSrcRaster) { m_paParam[0]->SetIsValid(false); m_paParam[0]->SetMessage(wxGISEnumGPMessageError, wxString::Format(_("The input path is not RasterDataset (Path %s)"), sPath.c_str())); return false; } if(!pSrcRaster->IsOpened()) { if(!pSrcRaster->Open(true)) { m_paParam[0]->SetIsValid(false); m_paParam[0]->SetMessage(wxGISEnumGPMessageError, wxString::Format(_("Failed open input path: %s"), sPath.c_str())); return false; } } int anOverviewList[25] = {0}; int nLevelCount = GetOverviewLevels(pSrcRaster, anOverviewList); wxArrayString saLevels; for(size_t i = 0; i < nLevelCount; ++i) saLevels.Add(wxString::Format(wxT("%d"), anOverviewList[i])); m_paParam[3]->SetValue(saLevels); m_paParam[3]->SetAltered(true); m_sInputPath = sPath; } } if(m_paParam[3]->GetAltered()) { if(m_paParam[3]->GetValue().GetArrayString().GetCount() <= 0) { m_paParam[3]->SetIsValid(false); m_paParam[3]->SetMessage(wxGISEnumGPMessageError, wxString(_("The levels list is empty"))); return false; } else { m_paParam[3]->SetIsValid(true); m_paParam[3]->SetMessage(wxGISEnumGPMessageOk); } } return true; //PHOTOMETRIC_OVERVIEW {RGB,YCBCR,MINISBLACK,MINISWHITE,CMYK,CIELAB,ICCLAB,ITULAB} //INTERLEAVE_OVERVIEW {PIXEL|BAND} //JPEG_QUALITY_OVERVIEW }
bool wxGISGPProjectVectorTool::Execute(ITrackCancel* pTrackCancel) { if(!Validate()) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Unexpected error occurred"), -1, enumGISMessageErr); return false; } IGxObjectContainer* pGxObjectContainer = dynamic_cast<IGxObjectContainer*>(m_pCatalog); if(!pGxObjectContainer) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Error getting catalog object"), -1, enumGISMessageErr); return false; } //get source wxString sSrcPath = m_paParam[0]->GetValue(); IGxObject* pGxObject = pGxObjectContainer->SearchChild(sSrcPath); if(!pGxObject) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Error get source object"), -1, enumGISMessageErr); return false; } IGxDataset* pGxDataset = dynamic_cast<IGxDataset*>(pGxObject); if(!pGxDataset) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("The source object is of incompatible type"), -1, enumGISMessageErr); return false; } wxGISFeatureDatasetSPtr pSrcDataSet = boost::dynamic_pointer_cast<wxGISFeatureDataset>(pGxDataset->GetDataset()); if(!pSrcDataSet) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("The source dataset is of incompatible type"), -1, enumGISMessageErr); return false; } if(!pSrcDataSet->IsOpened()) if(!pSrcDataSet->Open()) return false; OGRFeatureDefn *pDef = pSrcDataSet->GetDefinition(); if(!pDef) { if(pTrackCancel) pTrackCancel->PutMessage(_("Error reading dataset definition"), -1, enumGISMessageErr); //wsDELETE(pSrcDataSet); return false; } //get spatial reference wxString sWKT = m_paParam[1]->GetValue().MakeString(); if(sWKT.IsEmpty()) { if(pTrackCancel) pTrackCancel->PutMessage(_("Unsupported Spatial Reference"), -1, enumGISMessageErr); return false; } CPLString szWKT(sWKT.mb_str()); OGRSpatialReference NewSpaRef; const char* szpWKT = szWKT.c_str(); if(NewSpaRef.importFromWkt((char**)&szpWKT) != OGRERR_NONE) { if(pTrackCancel) pTrackCancel->PutMessage(_("Unsupported Spatial Reference"), -1, enumGISMessageErr); return false; } //get destination wxString sDstPath = m_paParam[2]->GetValue(); //check overwrite & do it! if(!OverWriteGxObject(pGxObjectContainer->SearchChild(sDstPath), pTrackCancel)) return false; IGxObject* pGxDstObject = GetParentGxObjectFromPath(sDstPath, pGxObjectContainer, pTrackCancel); if(!pGxDstObject) return false; CPLString szDestPath = pGxDstObject->GetInternalName(); wxFileName sDstFileName(sDstPath); wxString sName = sDstFileName.GetName(); wxGISGPGxObjectDomain* pDomain = dynamic_cast<wxGISGPGxObjectDomain*>(m_paParam[2]->GetDomain()); IGxObjectFilter* pFilter = pDomain->GetFilter(m_paParam[2]->GetSelDomainValue()); if(!pFilter) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Error getting selected destination filter"), -1, enumGISMessageErr); return false; } bool bRes = Project(pSrcDataSet, szDestPath, sName, pFilter, &NewSpaRef, pTrackCancel); //CPLString szPath = pGxDstObject->GetInternalName(); //wxString sName = sDstFileName.GetName(); // //wxGISGPGxObjectDomain* pDomain = dynamic_cast<wxGISGPGxObjectDomain*>(m_paParam[1]->GetDomain()); //IGxObjectFilter* pFilter = pDomain->GetFilter(pDomain->GetSelFilter()); //if(!pFilter) //{ // //add messages to pTrackCancel // if(pTrackCancel) // pTrackCancel->PutMessage(_("Error getting selected destination filter"), -1, enumGISMessageErr); // return false; //} // //bool bHasErrors = ExportFormat(pSrcDataSet, szPath, sName, pFilter, NULL, pTrackCancel); if(pGxDstObject) pGxDstObject->Refresh(); return bRes; }
bool wxGISGPShapeToTextTool::Execute(ITrackCancel* pTrackCancel) { if(!Validate()) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Unexpected error occurred"), -1, enumGISMessageErr); return false; } IGxObjectContainer* pGxObjectContainer = dynamic_cast<IGxObjectContainer*>(m_pCatalog); if(!pGxObjectContainer) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Error getting catalog object"), -1, enumGISMessageErr); return false; } wxString sSrcPath = m_paParam[0]->GetValue(); IGxObject* pGxObject = pGxObjectContainer->SearchChild(sSrcPath); if(!pGxObject) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Error get source object"), -1, enumGISMessageErr); return false; } IGxDataset* pGxDataset = dynamic_cast<IGxDataset*>(pGxObject); if(!pGxDataset) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("The source object is of incompatible type"), -1, enumGISMessageErr); return false; } wxGISFeatureDatasetSPtr pSrcDataSet = boost::dynamic_pointer_cast<wxGISFeatureDataset>(pGxDataset->GetDataset()); if(!pSrcDataSet) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("The source dataset is of incompatible type"), -1, enumGISMessageErr); return false; } if(!pSrcDataSet->IsOpened()) if(!pSrcDataSet->Open()) return false; OGRFeatureDefn *pDef = pSrcDataSet->GetDefinition(); if(!pDef) { if(pTrackCancel) pTrackCancel->PutMessage(_("Error reading dataset definition"), -1, enumGISMessageErr); return false; } bool bSwap = m_paParam[2]->GetValue(); wxString sMask = m_paParam[1]->GetValue(); m_CFormat.Create(sMask, bSwap); if(!m_CFormat.IsOk()) { if(pTrackCancel) pTrackCancel->PutMessage(_("Invalid format mask"), -1, enumGISMessageErr); return false; } wxString sDstPath = m_paParam[3]->GetValue(); //check overwrite & do it! if(!OverWriteGxObject(pGxObjectContainer->SearchChild(sDstPath), pTrackCancel)) return false; IGxObject* pGxDstObject = GetParentGxObjectFromPath(sDstPath, pGxObjectContainer, pTrackCancel); if(!pGxDstObject) return false; CPLString szPath = pGxDstObject->GetInternalName(); wxFileName sDstFileName(sDstPath); wxString sName = sDstFileName.GetFullName(); bool bRes = GeometryVerticesToTextFile(pSrcDataSet, CPLFormFilename(szPath, sName.mb_str(wxConvUTF8), NULL), m_CFormat, NULL, pTrackCancel); if(pGxDstObject) pGxDstObject->Refresh(); return bRes; }
bool wxGISGPCompStatTool::Execute(ITrackCancel* pTrackCancel) { if(!Validate()) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Unexpected error occurred"), -1, enumGISMessageErr); return false; } IGxObjectContainer* pGxObjectContainer = dynamic_cast<IGxObjectContainer*>(m_pCatalog); if(!pGxObjectContainer) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Error getting catalog object"), -1, enumGISMessageErr); return false; } wxString sSrcPath = m_paParam[0]->GetValue(); IGxObject* pGxObject = pGxObjectContainer->SearchChild(sSrcPath); if(!pGxObject) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Error getting source object"), -1, enumGISMessageErr); return false; } IGxDataset* pGxDataset = dynamic_cast<IGxDataset*>(pGxObject); if(!pGxDataset) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Source object is of incompatible type"), -1, enumGISMessageErr); return false; } wxGISRasterDatasetSPtr pSrcDataSet = boost::dynamic_pointer_cast<wxGISRasterDataset>(pGxDataset->GetDataset()); if(!pSrcDataSet) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Source dataset is of incompatible type"), -1, enumGISMessageErr); return false; } if(!pSrcDataSet->Open(false)) return false; GDALDataset* poGDALDataset = pSrcDataSet->GetRaster(); if(!poGDALDataset) { //add messages to pTrackCancel if(pTrackCancel) pTrackCancel->PutMessage(_("Error getting raster"), -1, enumGISMessageErr); return false; } bool bApproxOK = m_paParam[1]->GetValue(); for(int nBand = 0; nBand < poGDALDataset->GetRasterCount(); nBand++ ) { double dfMin(0), dfMax(255), dfMean(127), dfStdDev(2); CPLErr eErr; if(pTrackCancel) pTrackCancel->PutMessage(wxString::Format(_("Proceed band %d"), nBand + 1), -1, enumGISMessageInfo); GDALRasterBand* pBand = poGDALDataset->GetRasterBand(nBand + 1); eErr = pBand->ComputeStatistics(bApproxOK, &dfMin, &dfMax, &dfMean, &dfStdDev, ExecToolProgress, (void*)pTrackCancel); if(eErr != CE_None) { if(pTrackCancel) { const char* pszErr = CPLGetLastErrorMsg(); pTrackCancel->PutMessage(wxString::Format(_("ComputeStatistics failed! GDAL error: %s"), wxString(pszErr, wxConvUTF8).c_str()), -1, enumGISMessageErr); } return false; } pTrackCancel->PutMessage(wxString::Format(_("Band %d: min - %.2f, max - %.2f, mean - %.2f, StdDev - %.2f"), nBand + 1, dfMin, dfMax, dfMean, dfStdDev), -1, enumGISMessageNorm); // eErr = pBand->SetStatistics(dfMin, dfMax, dfMean, dfStdDev); //if(eErr != CE_None) //{ // if(pTrackCancel) // { // const char* pszErr = CPLGetLastErrorMsg(); // pTrackCancel->PutMessage(wxString::Format(_("ComputeStatistics failed! GDAL error: %s"), wgMB2WX(pszErr)), -1, enumGISMessageErr); // } // return false; // } } //poGDALDataset->FlushCache(); pSrcDataSet->SetHasStatistics(true); return true; }