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 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; }
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; }