void ExportMultipleDatasetsSelect(wxWindow* pWnd, wxVector<IGxDataset*> &paDatasets) { wxCHECK_RET(paDatasets.size() > 1, wxT("The input dataset array is empty")); wxGxContainerDialog dlg(pWnd, wxID_ANY, _("Select output")); dlg.SetAllFilters(false); dlg.ShowExportFormats(true); wxGxObject* pGxSrcObj = dynamic_cast<wxGxObject*>(paDatasets[0]); wxGISEnumDatasetType eType = paDatasets[0]->GetType(); int eSubType = paDatasets[0]->GetSubType(); bool bDefaultSet = false; int eDefaulSubType = 0; if (eType == enumGISFeatureDataset) { for (size_t i = enumVecUnknown + 1; i < enumVecMAX; ++i) { wxGISEnumVectorDatasetType eCurrentSubType = (wxGISEnumVectorDatasetType)i; if (eCurrentSubType != eSubType && IsFileDataset(enumGISFeatureDataset, eCurrentSubType)) { if (bDefaultSet) { dlg.AddFilter(new wxGxFeatureDatasetFilter(eCurrentSubType), false); } else { dlg.AddFilter(new wxGxFeatureDatasetFilter(eCurrentSubType), true); bDefaultSet = true; eDefaulSubType = eCurrentSubType; } } } if (eSubType != enumVecPostGIS) { dlg.AddFilter(new wxGxFeatureDatasetFilter(enumVecPostGIS), false); } } else if (eType == enumGISRasterDataset) { //for (size_t i = enumRasterUnknown + 1; i < enumRasterMAX; ++i) //{ // wxGISEnumRasterDatasetType eCurrentSubType = (wxGISEnumRasterDatasetType)i; // if (eCurrentSubType != eSubType && IsFileDataset(enumGISRasterDataset, eCurrentSubType)) // { // if (bDefaultSet) // { // dlg.AddFilter(new wxGxRasterDatasetFilter(eCurrentSubType), false); // } // else // { // dlg.AddFilter(new wxGxRasterDatasetFilter(eCurrentSubType), true); // bDefaultSet = true; // eDefaulSubType = eCurrentSubType; // } // } //} //if (eSubType != enumRasterPostGIS) //{ // dlg.AddFilter(new wxGxRasterDatasetFilter(enumRasterPostGIS), false); //} } else if (eType == enumGISTableDataset) { for (size_t i = enumTableUnknown + 1; i < enumTableMAX; ++i) { wxGISEnumTableDatasetType eCurrentSubType = (wxGISEnumTableDatasetType)i; if (eCurrentSubType != eSubType && IsFileDataset(enumGISTableDataset, eCurrentSubType)) { if (bDefaultSet) { dlg.AddFilter(new wxGxTableDatasetFilter(eCurrentSubType), false); } else { dlg.AddFilter(new wxGxTableDatasetFilter(eCurrentSubType), true); bDefaultSet = true; eDefaulSubType = eCurrentSubType; } } } if (eSubType != enumTablePostgres) { dlg.AddFilter(new wxGxTableDatasetFilter(enumTablePostgres), false); } } dlg.AddShowFilter(new wxGxFolderFilter()); dlg.AddShowFilter(new wxGxRemoteDBSchemaFilter()); dlg.ShowCreateButton(true); wxGxObject* pGxParentObj = pGxSrcObj->GetParent(); wxString sStartLoc; if (pGxParentObj) { while (NULL != pGxParentObj) { wxGxObjectContainer* pGxCont = wxDynamicCast(pGxParentObj, wxGxObjectContainer); if (NULL != pGxCont && pGxCont->CanCreate(enumGISFeatureDataset, eDefaulSubType)) { break; } else { pGxParentObj = pGxParentObj->GetParent(); } } if (pGxParentObj) { sStartLoc = pGxParentObj->GetFullName(); } } wxGISAppConfig oConfig = GetConfig(); if (oConfig.IsOk()) { if (eType == enumGISFeatureDataset) { sStartLoc = oConfig.Read(enumGISHKCU, dlg.GetAppName() + wxT("/lastpath/expm_vector_ds/path"), sStartLoc); } else if (eType == enumGISRasterDataset) { sStartLoc = oConfig.Read(enumGISHKCU, dlg.GetAppName() + wxT("/lastpath/expm_raster_ds/path"), sStartLoc); } else if (eType == enumGISTableDataset) { sStartLoc = oConfig.Read(enumGISHKCU, dlg.GetAppName() + wxT("/lastpath/expm_table_ds/path"), sStartLoc); } } if (!sStartLoc.IsEmpty()) dlg.SetStartingLocation(sStartLoc); if (dlg.ShowModal() == wxID_OK) { wxGxObjectFilter* pFilter = dlg.GetCurrentFilter(); if (NULL == pFilter) { wxMessageBox(_("Unexpected error"), _("Error"), wxCENTRE | wxOK | wxICON_ERROR, pWnd); wxLogError(_("Null wxGxObjectFilter returned")); return; } CPLString sPath = dlg.GetPath(); wxString sCatalogPath = dlg.GetLocation()->GetFullName(); if (oConfig.IsOk()) { if (eType == enumGISFeatureDataset) { oConfig.Write(enumGISHKCU, dlg.GetAppName() + wxT("/lastpath/expm_vector_ds/path"), sCatalogPath); } else if (eType == enumGISRasterDataset) { oConfig.Write(enumGISHKCU, dlg.GetAppName() + wxT("/lastpath/expm_raster_ds/path"), sCatalogPath); } else if (eType == enumGISTableDataset) { oConfig.Write(enumGISHKCU, dlg.GetAppName() + wxT("/lastpath/expm_table_ds/path"), sCatalogPath); } } //TODO: Now we create the copies (new names) instead of overwrite, but should show table with exist names and new names. If user set the same name - overwrite // |----------------|------------------| // | dataset1 | dataset1 (1) | // | dataset2 | dataset2 (1) | // | dataset3 | dataset3 (2) | // |----------------|------------------| wxVector<EXPORTED_DATASET> paExportDatasets; for (size_t i = 0; i < paDatasets.size(); ++i) { wxGxObject* pGxSrcDatasetObj = dynamic_cast<wxGxObject*>(paDatasets[i]); if (NULL == pGxSrcDatasetObj) { continue; } wxString sNewName = CheckUniqName(sPath, pGxSrcDatasetObj->GetBaseName(), pFilter->GetExt()); EXPORTED_DATASET ds = { sNewName, paDatasets[i] }; paExportDatasets.push_back(ds); } if (eType == enumGISFeatureDataset) { ExportMultipleVectorDatasets(pWnd, sPath, pFilter, paExportDatasets); } else if (eType == enumGISRasterDataset) { ExportMultipleRasterDatasets(pWnd, sPath, pFilter, paExportDatasets); } else if (eType == enumGISTableDataset) { ExportMultipleTableDatasets(pWnd, sPath, pFilter, paExportDatasets); } } }
bool SubrasterByVector(wxGISFeatureDatasetSPtr pSrcFeatureDataSet, wxGISRasterDatasetSPtr pSrcRasterDataSet, CPLString &szDstFolderPath, wxGxRasterFilter* pFilter, GDALDataType eOutputType, int nBandCount, int *panBandList, bool bUseCounter, int nCounterBegin, int nFieldNo, double dfOutResX, double dfOutResY, bool bCopyNodata, bool bSkipSourceMetadata, char** papszOptions, ITrackCancel* pTrackCancel) { //check if openned or/and open dataset if(!pSrcFeatureDataSet->IsOpened()) { if(!pSrcFeatureDataSet->Open(true)) { if(pTrackCancel) pTrackCancel->PutMessage(_("Source vector dataset open failed"), -1, enumGISMessageErr); return false; } } if(!pSrcRasterDataSet->IsOpened()) { if(!pSrcRasterDataSet->Open(true)) { if(pTrackCancel) pTrackCancel->PutMessage(_("Source raster dataset open failed"), -1, enumGISMessageErr); return false; } } const OGRSpatialReferenceSPtr pSrsSRS = pSrcFeatureDataSet->GetSpatialReference(); const OGRSpatialReferenceSPtr pDstSRS = pSrcRasterDataSet->GetSpatialReference(); OGRCoordinateTransformation *poCT(NULL); bool bSame = pSrsSRS == NULL || pDstSRS == NULL || pSrsSRS->IsSame(pDstSRS.get()); if( !bSame ) { poCT = OGRCreateCoordinateTransformation( pSrsSRS.get(), pDstSRS.get() ); if(poCT == NULL) { const char* err = CPLGetLastErrorMsg(); wxString sWarn = wxString::Format(_("Create OGRCreateCoordinateTransformation failed! GDAL error: %s"), wxString(err, wxConvUTF8).c_str()); wxLogWarning(sWarn); if(pTrackCancel) pTrackCancel->PutMessage(sWarn, -1, enumGISMessageWarning); } } IProgressor* pProgressor(NULL); if(pTrackCancel) { pProgressor = pTrackCancel->GetProgressor(); pTrackCancel->PutMessage(wxString::Format(_("Start clip '%s' by geometry from '%s'"), wxString(pSrcRasterDataSet->GetPath(), wxConvUTF8).c_str(), wxString(pSrcFeatureDataSet->GetPath(), wxConvUTF8).c_str()), -1, enumGISMessageNorm); } int nCounter(0); if(pProgressor) pProgressor->SetRange(pSrcFeatureDataSet->GetFeatureCount()); /* -------------------------------------------------------------------- */ /* Build band list to translate */ /* -------------------------------------------------------------------- */ if( nBandCount == 0 ) { nBandCount = pSrcRasterDataSet->GetBandCount(); if( nBandCount == 0 ) { if(pTrackCancel) pTrackCancel->PutMessage(_("Input file has no bands, and so cannot be translated."), -1, enumGISMessageErr); return false; } panBandList = (int *) CPLMalloc(sizeof(int)*nBandCount); for(size_t i = 0; i < nBandCount; ++i ) panBandList[i] = i + 1; } else { for(size_t i = 0; i < nBandCount; ++i ) { if( panBandList[i] > pSrcRasterDataSet->GetBandCount() ) { if(pTrackCancel) pTrackCancel->PutMessage(wxString::Format(_("Band %d requested, but only bands 1 to %d available."), panBandList[i], pSrcRasterDataSet->GetBandCount()), -1, enumGISMessageErr); return false; } } } bool bDefaultfilter(false); if(pFilter == NULL) { pFilter = new wxGxRasterFilter(enumRasterTiff); bDefaultfilter = true; } CPLString szDriver(pFilter->GetDriver().mb_str()); CPLString szExt(pFilter->GetExt().mb_str()); CPLString szBaseName = CPLGetBasename(pSrcRasterDataSet->GetPath()); GDALDriver* pDriver = (GDALDriver*)GDALGetDriverByName( szDriver ); if( pDriver == NULL ) { if(pTrackCancel) pTrackCancel->PutMessage(wxString::Format(_("Output driver '%s' not recognised."), szDriver.c_str()), -1, enumGISMessageErr); if(bDefaultfilter) wxDELETE(pFilter); return false; } pSrcFeatureDataSet->Reset(); OGRFeatureSPtr pFeature; size_t nNameCounter(nCounterBegin); while((pFeature = pSrcFeatureDataSet->Next()) != NULL) { if(pTrackCancel && !pTrackCancel->Continue()) { wxString sErr(_("Interrupted by user")); CPLString sFullErr(sErr.mb_str()); CPLError( CE_Warning, CPLE_AppDefined, sFullErr ); if(pTrackCancel) pTrackCancel->PutMessage(wxString(sFullErr, wxConvLocal), -1, enumGISMessageErr); if(bDefaultfilter) wxDELETE(pFilter); return false; } OGRGeometry *pGeom = pFeature->GetGeometryRef(); if(wkbFlatten(pSrcFeatureDataSet->GetGeometryType()) != wkbUnknown && !pGeom) continue; OGRGeometry *pNewGeom(NULL); if( !bSame && poCT ) { if(pGeom) { pNewGeom = pGeom->clone(); OGRErr eErr = pNewGeom->transform(poCT); if(eErr != OGRERR_NONE) wxDELETE(pNewGeom); } } else pNewGeom = pGeom->clone(); OGREnvelope GeomEnv; pNewGeom->getEnvelope(&GeomEnv); OGREnvelope RasterEnv = pSrcRasterDataSet->GetEnvelope(); GeomEnv.Intersect(RasterEnv); if(GeomEnv.IsInit()) { CPLString szPath; if(bUseCounter) { szPath.Printf("%s_%d", szBaseName.c_str(), nNameCounter++); CPLString sNewName(CheckUniqName(szDstFolderPath, szPath, szExt).mb_str(wxConvUTF8)); szPath = CPLFormFilename(szDstFolderPath, sNewName, szExt); } else { CPLString szName = pFeature->GetFieldAsString(nFieldNo); CPLString sNewName(CheckUniqName(szDstFolderPath, szName, szExt).mb_str(wxConvUTF8)); szPath = CPLFormFilename(szDstFolderPath, sNewName, szExt); } CreateSubRaster(pSrcRasterDataSet, GeomEnv, pNewGeom, pDriver, szPath, eOutputType, nBandCount, panBandList, dfOutResX, dfOutResY, bCopyNodata, bSkipSourceMetadata, papszOptions, pTrackCancel); } nCounter++; if(pProgressor) pProgressor->SetValue(nCounter); } if(poCT) OCTDestroyCoordinateTransformation(poCT); if(bDefaultfilter) wxDELETE(pFilter); return true; }