MapHelper.h
上传用户:qinfarui
上传日期:2022-08-10
资源大小:362k
文件大小:7k
源码类别:

GIS编程

开发平台:

Visual C++

  1. #if !defined _MAP_HELPER_H
  2. #define _MAP_HELPER_H
  3. //////////////////////////////////////////////////////////////////////////
  4. // MapHelper.h - Utility routines for working with the MapObjects control
  5. // 
  6. ///////////////////////////////////////////////////////////////////////////
  7. // Interesting Macros
  8. #include <afxctl.h>
  9. #include <afxpriv.h>
  10. //
  11. // Perform precise integer division.  Cast the result to the type of
  12. // integer that you need.
  13. //
  14. #define DIV(a, b)       (((a)*(b) < 0) ? (((double)(a) / (double)(b)) - 0.5)  
  15.                                        : (((double)(a) / (double)(b)) + 0.5))
  16. #define MULT(a, b)      (((a)*(b) < 0) ? (((double)(a) * (double)(b)) - 0.5)  
  17.                                        : (((double)(a) * (double)(b)) + 0.5))
  18. #define MULDIV(a, b, c) (((a)*(b)*(c) < 0) ?                                  
  19.                            (((double)(a) * (double)(b) / (double)(c)) - 0.5)  
  20.                          : (((double)(a) * (double)(b) / (double)(c)) + 0.5))
  21. //
  22. // Convert from radians to degrees and back
  23. //
  24. #define RAD2DEG(r) ((r)*57.2957795131)
  25. #define DEG2RAD(d) ((d)/57.2957795131)
  26. //
  27. // Iterate through collections.  
  28. //
  29. // ObjType The type of a single object, i.e., "CMoMapLayer"
  30. // obj The iterator variable.  It's attached to each object in the
  31. // collection in turn.
  32. // objs A reference to the collection, i.e., "const CMoLayers layers".
  33. //
  34. // The following code demonstrates the use of the macros:
  35. //
  36. // CMoLayers layers(m_map.GetLayers());
  37. // FOR_EACH_IN(CMoMapLayer, layer, layers)
  38. //   TRACE("%sn", layer.GetName());
  39. // END_FOR
  40. //
  41. #define FOR_EACH_IN(ObjType, obj, objs)
  42. LPUNKNOWN pUnk = objs.Get_NewEnum();
  43. ASSERT(pUnk);
  44. IEnumVARIANT* pEnumVariant = 0;
  45. pUnk->QueryInterface(IID_IEnumVARIANT, (void**)&pEnumVariant);
  46. pUnk->Release();
  47. ULONG c;
  48. VARIANT v;
  49. ObjType obj;
  50. while (pEnumVariant->Next(1, &v, &c) == 0 && c == 1)
  51. {
  52. obj.AttachDispatch(v.pdispVal);
  53. #define END_FOR
  54. }
  55. pEnumVariant->Release();
  56. ///////////////////////////////////////////////////////////////////////////
  57. // Utilities
  58. //
  59. CString GetFileDirectory(const CString& path);
  60. CString GetFileName(const CString& path);
  61. CString GetFileExt(const CString& path);
  62. CString GetFileTitle(const CString& path);
  63. ///////////////////////////////////////////////////////////////////////////
  64. // Conversion
  65. //
  66. double DegreesToMiles(double x1r, double y1, double x2, double y2);
  67. ///////////////////////////////////////////////////////////////////////////
  68. // Miscellaneous
  69. //
  70. // GetIDispatch - get the IDispatch pointer for the map wrapper.
  71. //
  72. // GetAspectRatio - return the map's aspect ratio, i.e., width/height.
  73. //
  74. // Coordinate Transformation - Use these if MapObjects doesn't return
  75. // accurate results in the container you're using.
  76. //
  77. LPDISPATCH GetIDispatch(CMap1& map);
  78. double GetAspectRatio(CMap1& map);
  79. LPDISPATCH ToMapPoint(CMap1& map, long x, long y);
  80. void FromMapPoint(CMap1& map, CMoPoint& pt, long& x, long& y);
  81. double ToMapDistance(CMap1& map, long x);
  82. long FromMapDistance(CMap1& map, double& mapX);
  83. ///////////////////////////////////////////////////////////////////////////
  84. // Layer management
  85. //
  86. void AddLayer(CMap1& map);
  87. void AddLayer(CMap1& map, const CString& path, COLORREF color = -1, LPDISPATCH renderer = 0);
  88. void AddLabelLayer(CMap1& map, const CString& path, LPCTSTR labelField, COLORREF color);
  89. void AddImageLayer(CMap1& map, const CString& path);
  90. short GetLayerType(CMoLayers& layers, short layerNum);
  91. LPDISPATCH CreateStreetRenderer();
  92. ///////////////////////////////////////////////////////////////////////////
  93. // Zoom and Pan
  94. //
  95. void ZoomIn(CMap1& map);
  96. void ZoomOut(CMap1& map);
  97. void ZoomFull(CMap1& map);
  98. void Pan(CMap1& map);
  99. void Resize(CMap1& map, int cx, int cy, int border = 0); // use with OnSize
  100. ///////////////////////////////////////////////////////////////////////////
  101. // GeoDatasets
  102. //
  103. void SetValue(CMoFields& fields, LPCTSTR name, const LONG value);
  104. void SetValue(CMoFields& fields, LPCTSTR name, const double value);
  105. void SetValue(CMoFields& fields, LPCTSTR name, const COleDateTime& value);
  106. void SetValue(CMoFields& fields, LPCTSTR name, const LPCTSTR value);
  107. void SetValue(CMoFields& fields, LPCTSTR name, const BOOL value);
  108. void SetValue(CMoFields& fields, LPCTSTR name, const LPDISPATCH value);
  109. ///////////////////////////////////////////////////////////////////////////
  110. // Printing and Export
  111. //
  112. // AdjustToRatio - Adjust the rectangle so that it has the same aspect
  113. // ratio as specified.
  114. //
  115. // GetDeviceRect - Get the bounds of the specified device.
  116. //
  117. // OutputMap - Export map to old style Windows metafile.  Not supported 
  118. // directly by MapObjects 1.0.
  119. //
  120. // FrameMap - Draw map to specified frame rectangle on the specified device.
  121. //
  122. CRect AdjustToRatio(const CRect& r, const double ratio, const UINT align = DT_CENTER|DT_VCENTER);
  123. CRect GetDeviceRect(CDC* pDC);
  124. void OutputMap(CMap1& map, CMetaFileDC* pDC);
  125. void FrameMap(CMap1& map, CDC* pDC, const CRect& dstRect, const UINT align = DT_VCENTER|DT_CENTER);
  126. ///////////////////////////////////////////////////////////////////////////
  127. // OLE Fonts
  128. //
  129. //
  130. // FONTDESC wrapper.  Automatic initialization
  131. //
  132. class CFontDesc : public tagFONTDESC
  133. {
  134. public:
  135. CFontDesc() 
  136. {
  137. cbSizeofstruct = sizeof(FONTDESC);
  138. lpstrName = OLESTR("Arial");
  139. // cySize = FONTSIZE(12);
  140. cySize.int64 = 120000;
  141. sWeight = FW_NORMAL;
  142. sCharset = ANSI_CHARSET;
  143. fItalic = FALSE;
  144. fUnderline = FALSE;
  145. fStrikethrough = FALSE;
  146. }
  147. };
  148. //
  149. // Wrapper for IFonts.  Similar to COleDispatchDriver except that
  150. // CreateDispatch isn't needed.
  151. //
  152. class CMoFont : public CFontHolder
  153. {
  154. public:
  155. CMoFont();
  156. CMoFont(LPFONTDISP pFontDisp);
  157. virtual ~CMoFont();
  158. void AttachDispatch(LPFONTDISP pFontDisp);
  159. // Attributes
  160. LPCTSTR GetName();
  161. void SetName(LPCTSTR faceName);
  162. long GetSize();
  163. void SetSize(long size);
  164. short GetWeight();
  165. void SetWeight(short weight);
  166. short GetCharSet();
  167. void SetCharSet(short charset);
  168. BOOL GetItalic();
  169. void SetItalic(BOOL italic);
  170. BOOL GetUnderline();
  171. void SetUnderline(BOOL underline);
  172. BOOL GetStrikeThrough();
  173. void SetStrikeThrough(BOOL strikeThrough);
  174. operator LPDISPATCH();
  175. operator LPFONTDISP();
  176. private:
  177. LPFONTDISP m_pDispatch;
  178. LPFONTDISP m_pFontDisp;
  179. void ReleaseDispatch(); // Call whenever InitializeFont is called
  180. };
  181. ///////////////////////////////////////////////////////////////////////////
  182. // Data Directory
  183. //
  184. // CDataDir is used to point to the sample data.  It defaults to 
  185. // "....data".
  186. // 
  187. //
  188. class CDataDir
  189. {
  190. public:
  191. CDataDir();
  192. virtual ~CDataDir() {}
  193. CString GetPath();
  194. void SetPath(LPCTSTR newPath);
  195. protected:
  196. CString m_path;
  197. };
  198. ///////////////////////////////////////////////////////////////////////////
  199. // Collection iterator
  200. //
  201. class CMoIterator
  202. {
  203. public:
  204. CMoIterator(COleDispatchDriver& collection);
  205. ~CMoIterator();
  206. BOOL Next(COleDispatchDriver& item);
  207. void Reset();
  208. void Skip(unsigned long numToSkip);
  209. private:
  210. CMoIterator() {} // must initialize with collection
  211. IEnumVARIANT* m_pEnumVariant;
  212. };
  213. IUnknown* CreateCOMObject(const GUID& clsid, IUnknown* pOuter = 0);
  214. #endif