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

📄 maplayer.cpp

📁 一个英国人写的GIS查看/编辑工具。支持标准的shapefile地图文件格式和coverage地图文件格式。同时可以编辑相应的dbf文件。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//////////////////////////////////////////////////////
//
// NRDB Pro - Spatial database and mapping application
//
// Copyright (c) 1989-2004 Richard D. Alexander
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//
// NRDB Pro is part of the Natural Resources Database Project 
// 
// Homepage: http://www.nrdb.co.uk/
// Users' Forum: http://nrdb.mypalawan.info/
// 

#include "stdafx.h"
#include <strstrea.h>

#include "nrdb.h"
#include "maplayer.h"
#include "viewmap.h"
#include "importodbc.h"
#include "bdimportexport.h"
#include "dlgprogress.h"
#include "mainfrm.h"
#include "comboboxsymbol.h"
#include "dlgaddoverlay.h"
#include "docmap.h"

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

CString CMapLayerArray::m_sError;
double CMapLayoutArray::m_dLayoutVersion;

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

CMapLayerObj::CMapLayerObj()
{
   m_pMapObject = NULL;
   m_nDataType = 0;
   m_lFeature = 0;
   m_dValue = AFX_RFX_DOUBLE_PSEUDO_NULL;
   m_dX = 0; 
   m_dY = 0;
   m_rect = CRect(0,0,0,0);
   m_lDate = 0;
}

CMapLayerObj::CMapLayerObj(CMapLayerObj& rSrc)
{
   m_nDataType = rSrc.m_nDataType;
   m_lFeature = rSrc.m_lFeature;   
   m_dValue = rSrc.m_dValue;
   m_lDate = rSrc.m_lDate;

   m_pMapObject = NULL;   
}

CMapLayerObj::~CMapLayerObj()
{   
   FreeMem();
};

void CMapLayerObj::FreeMem()
{
   if (m_pMapObject == NULL) return;

   if (m_nDataType == BDMAPLINES)
   {
     delete ((CLongLines*)m_pMapObject);
   } 
   else if (m_nDataType == BDCOORD)
   {
     delete ((CCoord*)m_pMapObject);
   }
   else if (m_nDataType == BDIMAGE)
   {
      delete ((CImageFile*)m_pMapObject);
   }
   m_pMapObject = NULL;
};

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

CMapLayer::CMapLayer(BOOL bMapLines)
{
   // Initialise variables   

   m_lFType = 0;   
   m_pQuery = NULL;   
   m_bExtentChecked = FALSE;
   m_bOnLoad = FALSE;

   // Set best fit as the default for map lines

   if (bMapLines) m_prop.m_nTextPos = BestFit;

   
}

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

CMapLayer::CMapLayer(CMapLayer& rSrc)
{
   m_lFType = rSrc.m_lFType;   
   m_aAttr.Copy(rSrc.m_aAttr);
   m_prop = rSrc.m_prop;   
   if (rSrc.m_pQuery == NULL) m_pQuery = NULL;
   else m_pQuery = new CQuery(*rSrc.m_pQuery);   
   m_alFeatures.Copy(rSrc.m_alFeatures);   
 
   m_bExtentChecked = FALSE;
   m_bOnLoad = FALSE;


}

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

CMapStyle::CMapStyle()
{
   m_crLine = RGB(0,0,0);
   m_crFill = RGB(64,64,64);
   m_nPattern = BS_SOLID;
   m_nHatch = 0;
   m_nLineStyle = PS_SOLID;   
   m_nLineWidth = 1;
   m_nSymbol = CComboBoxSymbol::circle;   
   m_dSymSize = 1;            
}

CMapProperties::CMapProperties()
{      
   m_colorText = RGB(0,0,0);      
   m_bOverlap = FALSE;
   m_bScaleFont = FALSE;
   m_nTextPos = CMapLayer::BestFit;
   m_bBestFitSym = FALSE;   
   m_bShowLayerName = TRUE;
   m_bVisible = TRUE;
   m_nSepColour = 0;
   m_bRangeColour = FALSE;
   m_bAutoColour = FALSE;
   m_bAutoSize = FALSE;
   m_bPolygon = TRUE;
   m_dAutoMin = 0;
   m_dAutoMax = 0;

   memset(&m_logfont,0,sizeof(LOGFONT));
   m_logfont.lfHeight = -11;
   m_logfont.lfPitchAndFamily = 18;
   m_logfont.lfCharSet = NRDB_CHARSET;
   strcpy(m_logfont.lfFaceName, BDString(IDS_DEFAULTFONT));      

   memset(&m_logfontC,0,sizeof(LOGFONT));
   m_logfontC.lfHeight = -8;
   m_logfontC.lfPitchAndFamily = 12;   
   m_logfontC.lfCharSet = NRDB_CHARSET;
   strcpy(m_logfontC.lfFaceName, BDString(IDS_DEFAULTFONT));         
}

/////////////////////////////////////////////////////////////////////////////
// Copy the map property attributes
//

CMapStyle::CMapStyle(CMapStyle& rSrc)
{
   *this = rSrc;
}


CMapStyle& CMapStyle::operator=(const CMapStyle& rSrc)
{
   m_crLine = rSrc.m_crLine;
   m_crFill = rSrc.m_crFill;
   m_nPattern = rSrc.m_nPattern;
   m_nHatch = rSrc.m_nHatch;
   m_nLineStyle = rSrc.m_nLineStyle;
   m_nLineWidth = rSrc.m_nLineWidth;
   m_nSymbol = rSrc.m_nSymbol;
   m_dSymSize = rSrc.m_dSymSize;   
   
   return *this;
}

BOOL CMapStyle::operator==(const CMapStyle& rSrc)
{
   return m_crLine == rSrc.m_crLine &&
   m_crFill == rSrc.m_crFill &&
   m_nPattern == rSrc.m_nPattern &&
   m_nHatch == rSrc.m_nHatch &&
   m_nLineStyle == rSrc.m_nLineStyle &&
   m_nLineWidth == rSrc.m_nLineWidth &&
   m_nSymbol == rSrc.m_nSymbol &&
   m_dSymSize == rSrc.m_dSymSize;   
}

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

void CMapStyle::AsXML(CXMLObj* pXMLStyle)
{
   CXMLObj *pXMLObj = NULL;

   pXMLStyle->m_sName = "style";

   // Brush

   pXMLStyle = pXMLStyle->m_pChild = new CXMLObj;
   pXMLStyle->m_sName = "brushstyle";

   pXMLObj = pXMLStyle->m_pChild = new CXMLObj;   
   pXMLObj->m_sName = "pattern";
   pXMLObj->m_sValue.Format("%i", m_nPattern);

   pXMLObj = pXMLObj->m_pNext = new CXMLObj;
   pXMLObj->m_sName = "hatch";
   pXMLObj->m_sValue.Format("%i", m_nHatch);

   pXMLObj = pXMLObj->m_pNext = new CXMLObj;
   pXMLObj->m_sName = "colour";
   pXMLObj->m_sValue.Format("%i", m_crFill);

   // Line

   pXMLStyle = pXMLStyle->m_pNext = new CXMLObj;
   pXMLStyle->m_sName = "linestyle";

   pXMLObj = pXMLStyle->m_pChild = new CXMLObj;
   pXMLObj->m_sName = "line";
   pXMLObj->m_sValue.Format("%i", m_nLineStyle);

   pXMLObj = pXMLObj->m_pNext = new CXMLObj;
   pXMLObj->m_sName = "width";
   pXMLObj->m_sValue.Format("%i", m_nLineWidth);

   pXMLObj = pXMLObj->m_pNext = new CXMLObj;
   pXMLObj->m_sName = "colour";
   pXMLObj->m_sValue.Format("%i", m_crLine);

   // Symbol

   pXMLStyle = pXMLStyle->m_pNext = new CXMLObj;
   pXMLStyle->m_sName = "symbolstyle";

   pXMLObj = pXMLStyle->m_pChild = new CXMLObj;
   pXMLObj->m_sName = "symbol";
   pXMLObj->m_sValue.Format("%i", m_nSymbol);

   pXMLObj = pXMLObj->m_pNext = new CXMLObj;
   pXMLObj->m_sName = "size";
   pXMLObj->m_sValue.Format("%lf", m_dSymSize);

}

///////////////////////////////////////////////////////////////////////////////
//
// Converts an xml object to a map style object
//

BOOL CMapStyle::XMLAs(CXMLObj* pXMLObj)
{
   BOOL bOK = TRUE;
   
   m_nLineStyle = pXMLObj->GetInteger("linestyle", "line");
   m_nLineWidth = pXMLObj->GetInteger("linestyle", "width");
   m_crLine = pXMLObj->GetInteger("linestyle", "colour");
   m_crFill = pXMLObj->GetInteger("brushstyle", "colour");
   m_nPattern = pXMLObj->GetInteger("brushstyle", "pattern");
   m_nHatch = pXMLObj->GetInteger("brushstyle", "hatch");
   m_nSymbol = pXMLObj->GetInteger("symbolstyle", "symbol");
   m_dSymSize = pXMLObj->GetDouble("symbolstyle", "size");     

   return bOK;
}

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

CString CMapStyle::AsString()
{
   CString s;

   s.Format("%li,%li,%li,%li,%li,%li,%li,%lf", m_crFill, m_crLine, m_nLineStyle, 
            m_nLineWidth, m_nPattern, m_nHatch, m_nSymbol, m_dSymSize);
   return s;

}

BOOL CMapStyle::StringAs(CString s)
{
   if (sscanf(s, "%li, %li,%li,%li,%li,%li,%li,%lf", &m_crFill, &m_crLine, &m_nLineStyle, 
            &m_nLineWidth, &m_nPattern, &m_nHatch, &m_nSymbol, &m_dSymSize) == 8)
   {
      // Skip passed 

      for (int i = 0; i < 8; i++)
      {
         int j = s.Find(',');
         s = s.Mid(j+1);
      }      

      return TRUE;
   }
   return FALSE;
};

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

BOOL CStyleSchemes::XMLAs(CXMLObj* pXMLObj)
{   
   CMapStyle style;
   BOOL bOK = TRUE;

   RemoveAll();

   if (pXMLObj->m_sName == "styleschemes")
   {
      CXMLObj *pXMLScheme = pXMLObj->m_pChild;

      while (pXMLScheme != NULL && bOK)
      {
         if (pXMLScheme->m_sName == "stylescheme")
         {
            CStyleScheme scheme;
            scheme.m_sName = pXMLScheme->GetAttr("name");

            CXMLObj *pXMLStyle = pXMLScheme->m_pChild;
            while (pXMLStyle != NULL && bOK)
            {
               if (pXMLStyle->m_sName == "style")
               {
                  if (style.XMLAs(pXMLStyle))
                  {
                     scheme.m_aStyle.Add(style);
                  } else
                  {
                     bOK = FALSE;
                  }
               }
               pXMLStyle = pXMLStyle->m_pNext;
            }
            Add(scheme);
         }
         pXMLScheme = pXMLScheme->m_pNext;
      }
   }

   return bOK;
}

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

CMapGrid::CMapGrid()
{
   memset(&m_logfont,0,sizeof(LOGFONT));
   m_logfont.lfHeight = -8;
   m_logfont.lfPitchAndFamily = 18;
   m_logfont.lfCharSet = NRDB_CHARSET;
   strcpy(m_logfont.lfFaceName, BDString(IDS_DEFAULTFONT));      

   m_nType = defaultgrid;
   m_nDegLat = 1;
   m_nMinLat = 0;
   m_nSecLat = 0;
   m_nDegLng = 1;
   m_nMinLng = 0;
   m_nSecLng = 0;

   m_style.m_crLine = RGB(166,202,240);
}

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

CMapGrid::CMapGrid(CMapGrid& rSrc)
{
   m_logfont = rSrc.m_logfont;
   m_style = rSrc.m_style;
   m_nType = rSrc.m_nType;
   m_nDegLat = rSrc.m_nDegLat;
   m_nMinLat = rSrc.m_nMinLat;
   m_nSecLat = rSrc.m_nSecLat;
   m_nDegLng = rSrc.m_nDegLng;
   m_nMinLng = rSrc.m_nMinLng;
   m_nSecLng = rSrc.m_nSecLng;
}

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

CMapProperties::CMapProperties(CMapProperties& rSrc)
{      
   *this = rSrc;
}

CMapProperties& CMapProperties::operator=(CMapProperties& rSrc)
{
   m_sName = rSrc.m_sName;      
   m_colorText = rSrc.m_colorText;      
   m_bOverlap = rSrc.m_bOverlap;
   m_nTextPos = rSrc.m_nTextPos;
   m_sComment = rSrc.m_sComment;
   m_bAutoColour = rSrc.m_bAutoColour;
   m_bAutoSize = rSrc.m_bAutoSize;
   m_bPolygon = rSrc.m_bPolygon;
   m_bScaleFont = rSrc.m_bScaleFont;
   m_bBestFitSym = rSrc.m_bBestFitSym;
   m_bShowLayerName = rSrc.m_bShowLayerName;
   m_bVisible = rSrc.m_bVisible;
   m_nSepColour = rSrc.m_nSepColour;
   m_bRangeColour = rSrc.m_bRangeColour;
   m_dAutoMin = rSrc.m_dAutoMin;
   m_dAutoMax = rSrc.m_dAutoMax;
   m_logfont = rSrc.m_logfont;   
   m_logfontC = rSrc.m_logfontC;
   m_aColourFeature.Copy(rSrc.m_aColourFeature);
   m_aRangeColour = rSrc.m_aRangeColour;

   (CMapStyle&)*this = (CMapStyle&)rSrc;

   return *this;
}

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

CMapLayoutObj::CMapLayoutObj()
{
   m_rect = CRect(-1,-1,-1,-1);   
   memset(&m_logfont,0,sizeof(LOGFONT));
   m_logfont.lfHeight = -12;
   m_logfont.lfPitchAndFamily = 18;
   m_logfont.lfCharSet = NRDB_CHARSET;
   m_nType = CMapLayout::none;   
}

CMapLayoutObj& CMapLayoutObj::operator=(const class CMapLayoutObj& rSrc)
{
   m_rect = rSrc.m_rect;
   m_style = rSrc.m_style;
   m_logfont = rSrc.m_logfont;
   m_nType = rSrc.m_nType;
   m_sImageFile = rSrc.m_sImageFile;
   m_sText = rSrc.m_sText;

   return *this;
}

CMapLayoutObj::CMapLayoutObj(const CMapLayoutObj& rSrc)
{
   *this = rSrc;
}

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

CString CMapLayoutObj::GetTypeDesc()
{
   if (m_nType == CMapLayout::map) return BDString(IDS_MAP);
   if (m_nType == CMapLayout::legend) return BDString(IDS_LEGEND);
   if (m_nType == CMapLayout::title) return BDString(IDS_TITLE);
   if (m_nType == CMapLayout::arrow) return BDString(IDS_NORTHARROW);
   if (m_nType == CMapLayout::source) return BDString(IDS_COMMENTS);
   if (m_nType == CMapLayout::scalebar) return BDString(IDS_SCALEBAR);
   if (m_nType == CMapLayout::projection) return BDString(IDS_PROJECTION);
   if (m_nType == CMapLayout::box) return BDString(IDS_BORDER);
   if (m_nType == CMapLayout::picture) return BDString(IDS_IMAGE);
   if (m_nType == CMapLayout::text) return BDString(IDS_TEXT);   
   if (m_nType == CMapLayout::scale) return BDString(IDS_SCALE);   

   ASSERT(FALSE);
   return "";      
}

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

CMapLayout::CMapLayout()
{
   CMapLayoutObj layoutobj;

   layoutobj.m_nType = map;
   layoutobj.m_style.m_crLine = RGB(0,0,64);

⌨️ 快捷键说明

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