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

📄 dlgprojection.cpp

📁 一个英国人写的GIS查看/编辑工具。支持标准的shapefile地图文件格式和coverage地图文件格式。同时可以编辑相应的dbf文件。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
      if (dlg.GetZone() > 0) projection.m_dFalseNorthing = 0; // Northern hemisphere
      else projection.m_dFalseNorthing = 10000000; // Southern hemisphere
      projection.m_dLatitudeOrigin = 0;
      projection.m_dLongitudeOrigin = -177+(abs(dlg.GetZone())-1)*6;
      projection.m_dScaleFactorAtOrigin = UTM_SCALEFACTOR;
      projection.m_dSemiMajorAxis = CEllipsoid::m_aEllipsoids[UTM_INDEX].m_dSemiMajorAxis;
      CEllipsoid ellipsoid = CEllipsoid::m_aEllipsoids[UTM_INDEX];
      projection.m_dSemiMinorAxis = ellipsoid.GetSemiMinorAxis();
      projection.m_lScaleCoords = 1;
      projection.m_dMaxEasting = AFX_RFX_DOUBLE_PSEUDO_NULL;
      projection.m_dMinEasting = AFX_RFX_DOUBLE_PSEUDO_NULL;
      projection.m_dMaxNorthing = AFX_RFX_DOUBLE_PSEUDO_NULL;
      projection.m_dMinNorthing = AFX_RFX_DOUBLE_PSEUDO_NULL;
      projection.m_sName = CEllipsoid::m_aEllipsoids[UTM_INDEX].m_psName;
                 

      BDEnd(BDHandle());
      if (BDProjection(BDHandle(), &projection, BDADD))
      {         
         BDEnd(BDHandle());
         CDialog::OnOK();                  
      }
            
      
   }
   m_bUTMTip = TRUE;
   return 0;
}

/////////////////////////////////////////////////////////////////////////////

void CDlgProjection::OnAdd() 
{
   if (AddEdit(TRUE, m_lMaxId+1))
   {
      m_lMaxId++;
   }
   m_bUpdate = FALSE;
}

/////////////////////////////////////////////////////////////////////////////

void CDlgProjection::OnEdit() 
{
   int index = m_cbProjections.GetCurSel();
   if (index != CB_ERR)
   {
      // Retrieve value from the database

      AddEdit(FALSE, m_cbProjections.GetItemData(index));           
   };
   m_bUpdate = FALSE;
}

/////////////////////////////////////////////////////////////////////////////

void CDlgProjection::OnDelete() 
{
   CBDProjection projection;

   int index = m_cbProjections.GetCurSel();
   if (index != CB_ERR)
   {
      projection.m_nID = m_cbProjections.GetItemData(index);
      
      BDProjection(BDHandle(), &projection, BDDELETE);
      BDEnd(BDHandle());      

      Update(FALSE);      

      m_cbProjections.SetCurSel(max(0,index-1));
      
      // Store the new default
      UpdateDefault();      

      // Update attributes
      OnSelchangeName();	
      
   }   
   m_bUpdate = FALSE;
}

/////////////////////////////////////////////////////////////////////////////

BOOL CDlgProjection::AddEdit(BOOL bAdd, long lId)
{
   BOOL bOK = FALSE;

   CBDProjection projection;

   // Retrieve values from controls

  if (m_eName.GetValue(projection.m_sName, FALSE) && 
      m_eSemiMajorAxis.GetValue(projection.m_dSemiMajorAxis) &&
      m_eSemiMinorAxis.GetValue(projection.m_dSemiMinorAxis) &&
      m_eLatitudeOrigin.GetValue(projection.m_dLatitudeOrigin, -90, 90) &&
      m_eLongitudeOrigin.GetValue(projection.m_dLongitudeOrigin,-180,180) &&
      m_eFalseEasting.GetValue(projection.m_dFalseEasting) &&
      m_eFalseNorthing.GetValue(projection.m_dFalseNorthing) &&	      
	   m_eScaleFactor.GetValue(projection.m_dScaleFactorAtOrigin) &&       
      m_eMinEasting.GetValue(projection.m_dMinEasting, -1e20, 1e20, TRUE) &&
      m_eMaxEasting.GetValue(projection.m_dMaxEasting, projection.m_dMinEasting, 1e20, TRUE) &&
      m_eMinNorthing.GetValue(projection.m_dMinNorthing, -1e20, 1e20, TRUE) &&
      m_eMaxNorthing.GetValue(projection.m_dMaxNorthing, projection.m_dMinNorthing, 1e20, TRUE))      
  {
     projection.m_bDefault = TRUE;
     projection.m_nID = lId;
     

     // Latitude/longitude

     if (m_bLatLon)
     {
        projection.m_dSemiMajorAxis = LATLON_ID;
        projection.m_dSemiMinorAxis = LATLON_ID;
        projection.m_dLatitudeOrigin = 0;        
        projection.m_dFalseEasting = 0;
        projection.m_dFalseNorthing = 0;
	     projection.m_dScaleFactorAtOrigin = 0;

        BDProjection()->LatLonToTransMercator(projection.m_dMinNorthing, projection.m_dMinEasting, &projection.m_dMinEasting, &projection.m_dMinNorthing);
        BDProjection()->LatLonToTransMercator(projection.m_dMaxNorthing, projection.m_dMaxEasting, &projection.m_dMaxEasting, &projection.m_dMaxNorthing);
     }
 
     int iFlag = BDADD;
     if (!bAdd) iFlag = BDUPDATE;
     
     if (BDProjection(BDHandle(), &projection, iFlag))
     {
        bOK = TRUE;
     }
     BDEnd(BDHandle());
  }	     	     	     	     	      	

  Update(FALSE);

  return bOK;
}

/////////////////////////////////////////////////////////////////////////////

void CDlgProjection::UpdateDefault()
{
   CBDProjection projection;

   // Remove previous default

   projection.m_nID = m_lDefaultId;
   if (BDProjection(BDHandle(), &projection, BDSELECT))  
   {
      projection.m_bDefault = FALSE;
      BDEnd(BDHandle());
      BDProjection(BDHandle(), &projection, BDUPDATE);
   };
   BDEnd(BDHandle());


   // Set new default

   int index = m_cbProjections.GetCurSel();
   if (index != CB_ERR)
   {
      // Retrieve new default

      projection.m_nID = m_cbProjections.GetItemData(index);
      m_lDefaultId = projection.m_nID;

      // Update controls

      if (BDProjection(BDHandle(), &projection, BDSELECT))  
      {
         projection.m_bDefault = TRUE;
         BDEnd(BDHandle());
         BDProjection(BDHandle(), &projection, BDUPDATE);
      };
      BDEnd(BDHandle());
   };
}

/////////////////////////////////////////////////////////////////////////////

void CDlgProjection::OnSelchangeEllipsoid() 
{
   m_bLatLon = FALSE;

   //m_eName.SetWindowText("");	

   int index = m_cbEllipsoid.GetCurSel();
   if (index != CB_ERR)
   {
      int i = m_cbEllipsoid.GetItemData(index);
      CEllipsoid* pEllipsoid = (CEllipsoid*)(&CEllipsoid::m_aEllipsoids[i]);

      if (fabs(pEllipsoid->GetSemiMajorAxis()) > 0.001)
      {
         m_eSemiMajorAxis.SetValue(pEllipsoid->GetSemiMajorAxis(),ELLIPSOIDDP);
         m_eSemiMinorAxis.SetValue(pEllipsoid->GetSemiMinorAxis(),ELLIPSOIDDP);
      }      
      else 
      {
         m_eSemiMajorAxis.SetWindowText("");
         m_eSemiMinorAxis.SetWindowText("");
      }         
      
      // Determine if LatLon

      if (fabs(pEllipsoid->GetSemiMajorAxis() - LATLON_ID) < 0.001)
      {       
         m_bLatLon = TRUE;         
      }      
   }	

   // Disable controls if latlon

   m_eSemiMajorAxis.EnableWindow(!m_bLatLon);
   m_eSemiMinorAxis.EnableWindow(!m_bLatLon);
   m_eLatitudeOrigin.EnableWindow(!m_bLatLon);  
   m_eFalseEasting.EnableWindow(!m_bLatLon);
   m_eFalseNorthing.EnableWindow(!m_bLatLon);
	m_eScaleFactor.EnableWindow(!m_bLatLon);
   m_eLongitudeOrigin.EnableWindow(!m_bLatLon);

   m_bUpdate = TRUE;	
}


/////////////////////////////////////////////////////////////////////////////

void CDlgProjection::OnOK() 
{
   if (m_bUpdate)
   {
      if (AfxMessageBox(BDString(IDS_NOTSAVED), MB_YESNO|MB_DEFBUTTON2) == IDNO)
      {
         return;
      }
   }   

   // Store coordinate display preference

   CBDMain main;
	BDMain(BDHandle(), &main, BDGETINIT);
   main.m_bCoordAsLatLon = m_ckCoordAsLatLon.GetCheck();
   BDMain(BDHandle(), &main, BDUPDATE);
   BDGetSettings() = main; 

	CDialog::OnOK();
}

/////////////////////////////////////////////////////////////////////////////

void CDlgProjection::OnChange() 
{
	m_bUpdate = TRUE;	
}

/////////////////////////////////////////////////////////////////////////////
//
// Set the default extent to the current view in the map

void CDlgProjection::OnSetExtent()
{
   CRect rect;
   CDocMap* pDocMap = BDGetDocMap();


   if (pDocMap != NULL)
   {
      // Get Extent

      CViewMap* pViewMap = pDocMap->GetViewMap();

      pViewMap->GetClientRect(&rect);

      double dMinX = pViewMap->GetfXInv(rect.left);
      double dMaxX = pViewMap->GetfXInv(rect.right);
      double dMinY = pViewMap->GetfYInv(rect.top);
      double dMaxY = pViewMap->GetfYInv(rect.bottom);

      if (m_bLatLon)
      {
         BDProjection()->TransMercatorToLatLon(dMinX, dMinY, &dMinY, &dMinX);
         BDProjection()->TransMercatorToLatLon(dMaxX, dMaxY, &dMaxY, &dMaxX);         
      };      

      if (dMinY > dMaxY) swap(dMinY, dMaxY);

      m_eMinEasting.SetValue(dMinX);
      m_eMaxEasting.SetValue(dMaxX);

      m_eMinNorthing.SetValue(dMinY);
      m_eMaxNorthing.SetValue(dMaxY);

      OnEdit();
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -