void wxGISMapView::PanStop(wxPoint MouseLocation) { ReleaseMouse(); wxCoord x = m_StartMouseLocation.x - MouseLocation.x; wxCoord y = m_StartMouseLocation.y - MouseLocation.y; wxRect rect = m_pGISDisplay->GetDeviceFrame();//GetClientRect(); if(x == 0 && y == 0) { x = m_StartMouseLocation.x - (rect.GetLeft() + rect.GetWidth() / 2); y = m_StartMouseLocation.y - (rect.GetTop() + rect.GetHeight() / 2); } rect.Offset(x, y); if(m_pGISDisplay) { OGREnvelope Env = m_pGISDisplay->TransformRect(rect); //set clip geom //FillClipGeometry(GetClientRect(), x, y); if(Env.IsInit())//set new bounds Do(Env); m_nDrawingState = enumGISMapDrawing; } }
void wxGISMapView::OnMouseWheel(wxMouseEvent& event) { //event.Skip(false); DestroyDrawThread(); int nDirection = event.GetWheelRotation(); int nDelta = event.GetWheelDelta(); int nFactor = nDirection / nDelta; m_nDrawingState = enumGISMapWheeling; m_nFactor += ZOOM_FACTOR * (double)nFactor; if(m_pGISDisplay) { double dZoom = 1; if(m_nFactor < 0) dZoom = fabs(1.0 / (m_nFactor - 1)); else if(m_nFactor > 0) dZoom = 1 + m_nFactor; wxClientDC CDC(this); m_pGISDisplay->WheelingDraw(dZoom, &CDC); //draw scale text OGREnvelope Env = CreateEnvelopeFromZoomFactor(dZoom); if(Env.IsInit()) { double sScale = GetScaleRatio( Env, CDC ); wxString sFormatScale = NumberScale(sScale); sFormatScale.Prepend(wxT("1 : ")); DrawToolTip(CDC, sFormatScale); } } //if(!m_timer.IsRunning()) m_timer.Start(TM_WHEELING); }
bool wxGISDrawingLayer::Draw(wxGISEnumDrawPhase DrawPhase, ITrackCancel* const pTrackCancel) { wxCHECK_MSG(m_pDisplay, false, wxT("Display pointer is NULL")); wxCriticalSectionLocker lock(m_CritSect); OGREnvelope stDisplayExtentRotated = m_pDisplay->GetBounds(true); OGREnvelope stFeatureDatasetExtentRotated = m_oLayerExtent; //rotate featureclass extent if (!IsDoubleEquil(m_pDisplay->GetRotate(), 0.0)) { wxRealPoint dfCenter = m_pDisplay->GetBoundsCenter(); RotateEnvelope(stFeatureDatasetExtentRotated, m_pDisplay->GetRotate(), dfCenter.x, dfCenter.y);//dCenterX, dCenterY); } //if envelopes don't intersect exit if (!stDisplayExtentRotated.Intersects(stFeatureDatasetExtentRotated)) return false; //get intersect envelope to fill vector data OGREnvelope stDrawBounds = stDisplayExtentRotated; stDrawBounds.Intersect(stFeatureDatasetExtentRotated); if (!stDrawBounds.IsInit()) return false; IProgressor* pProgress = NULL; if (NULL != pTrackCancel) { pProgress = pTrackCancel->GetProgressor(); } if (NULL != pProgress) { pProgress->SetRange(m_aoShapes.size()); } //draw shapes for (size_t i = 0; i < m_aoShapes.size(); ++i) { if (NULL != pProgress) { pProgress->SetValue(i); } if (pTrackCancel != NULL && !pTrackCancel->Continue()) return true; if (m_aoShapes[i] != NULL) { m_aoShapes[i]->Draw(m_pDisplay); } } //draw enumGISShapeStateSelected //draw enumGISShapeStateRotated //draw enumGISShapeStatePoints return true; }
void wxGISMapView::OnTimer( wxTimerEvent& event ) { //event.Skip(); //wxSafeYield(this, true); #ifdef __WXGTK__ wxWakeUpIdle(); #endif switch(m_nDrawingState) { case enumGISMapZooming: { //stop zooming action if(m_pGISDisplay && !wxGetMouseState().LeftIsDown()) //user release mouse button, so draw contents { wxRect rc = GetClientRect(); m_pGISDisplay->SetDeviceFrame(rc); m_pGISDisplay->SetDerty(true); m_nDrawingState = enumGISMapDrawing; CreateAndRunDrawThread(); //wxCommandEvent evt(wxEVT_COMMAND_STARTDRAWING);wxEVT_COMMAND_DATA_SENT //GetEventHandler()->ProcessEvent( evt ); // if(!m_pMapDrawingThread)//m_nDrawingState = enumGISMapDrawing // { // StartDraingThread(); // } m_timer.Stop(); //Thaw(); } } break; case enumGISMapWheeling: m_nDrawingState = enumGISMapWheelingStop; return; case enumGISMapWheelingStop: //stop wheeling action if(m_pGISDisplay) { double dZoom = 1; if(m_nFactor < 0) dZoom = fabs(1.0 / (m_nFactor - 1)); else if(m_nFactor > 0) dZoom = 1 + m_nFactor; OGREnvelope Env = CreateEnvelopeFromZoomFactor(dZoom); if(Env.IsInit())//set new bounds Do(Env); m_nDrawingState = enumGISMapDrawing; } m_nFactor = 0; m_timer.Stop(); return; break; case enumGISMapFlashing: if(m_staFlashGeoms.empty()) { m_nDrawingState = enumGISMapDrawing; m_pGISDisplay->SetDrawCache(m_pGISDisplay->GetLastCacheID(), true); m_timer.Stop(); } else { Flash(m_eFlashStyle); } break; case enumGISMapDrawing: break;//not stop timer case enumGISMapNone: default: m_timer.Stop(); break; }; Refresh(); }
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; }