////////////////////////////////////////////////////////////////////////////// //文件: 格式转换类 //主要功能: // 读取KML格式 // //程序编写: 2025-8-21 // // ///////////////////////////////////////////////////////////////////////////// #pragma once #include ".\otherformat.h" #include ".\EmbellishBaseLib.h" #include "afxcoll.h" #include "..\Layer.h" #include "..\Xy.h" #include "..\Utils.h" #include "..\GdbxDefine.h" namespace NFormatReader { class CKMLFile : public CEmbellishBaseLib { public: CKMLFile(void); virtual ~CKMLFile(void); private: struct KMLInfo { double m_dScaleFactor; //比例因子,当前图件的比例值,1:m_dScaleFactor CString m_kmlXmlns; //kml版本 目前有2.1 2.2 2.3 CString m_kmlXmlnsA; //kml版本 目前有2.2 2.3 CString m_kmlXmlnsG; //kml版本 目前有2.2 2.3 CString m_fileEncCoding; //文件编码格式(utf-8) CRect8 m_modelSpace; int m_version; //读取的版本号 }; struct KMLPoint { double x; //经度 double y; //纬度 double z; //高程 }; struct PointStyle { double m_scale; COLORREF m_pointColor; COLORREF m_lableColor; COLORREF m_lineColor;//线段全局样式也可能在这 2.1版本 COLORREF m_polyColor; CString m_id; CString m_iconUrl; void clear() { m_scale = 0; m_pointColor = -1; m_lableColor = -1; m_lineColor = -1; m_polyColor = -1; m_id = ""; m_iconUrl = ""; } }; struct KMLStyleMap { CString m_id; CString m_pairKey; // CString m_pairStyleUrl; //样式名称 点集使用 std::unordered_map m_pointStyle; }; struct KMLPlacemark { double m_lineWidth; COLORREF m_lineColor; COLORREF m_polyColor; CString m_name; CString m_styleUrl; std::vector m_point; void clear() { m_lineWidth = 0; m_name = ""; m_lineColor = -1; m_polyColor = -1; m_point.clear(); } }; struct KMLDocument { CString m_layerName; KMLStyleMap m_styleInfo; //每个Document会有一个样式 }; KMLInfo m_info; public: int Read(CFile& fr, short ver = -1); //XML文件读写 int Read(LPCTSTR lpszPathName, short ver = -1); int SetMapUnit(int gm_unit); protected: int ReadData(CFile& fr, short ver = -1); //XML文件读写(详细字段) int ReadKMLInfoHead(CFile& fr, short ver, void* pXmlParse); //kml的基本信息 int ReadKMLDocument(CFile& fr, short ver = -1); int ReadKMLPlacemark(CFile& fr, const KMLDocument &dInfo, short ver = -1); int ReadKMLStyle(CFile& fr, KMLPlacemark &info, short ver = -1); int ReadKMLStyle(CFile& fr, PointStyle &pInfo, short ver = -1); int ReadKMLLineStyle(CFile& fr, KMLPlacemark &info, short ver = -1); int ReadKMLPolyStyle(CFile& fr, KMLPlacemark &info, short ver = -1); int ReadKMLIconStyle(CFile& fr, PointStyle &info, short ver = -1); int ReadKMLColorStyle(CFile& fr, COLORREF& color, short ver = -1); int InitMapInfo(); int DrawKMLLine(const KMLPlacemark &pInfo, const KMLDocument &dInfo); //绘制线段 int DrawKMLPolygon(const KMLPlacemark &pInfo, const KMLDocument &dInfo); //绘制多边形 int DrawKMLPoint(const KMLPlacemark &pInfo, const KMLDocument &dInfo); //绘制点 private: void DeSerialize(CArchive& ar); vector SplitByLine(const CString& input); //Layers 按照 \r\n 分割字符串为多个部分 CString ChangeEncoding(const CString &str, const CString &enc, int type = 0); //编码转换 CString Utf8ToGb2312(const CString& utf8Str, int type = 0); //转码 wchar_t* ReplaceLineBreaks(wchar_t* pWideChar, int type = 0); //去除字符中的\\r\\n COLORREF KMLColorToCOLORREF(const CString& colorStr); }; };