You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

190 lines
8.4 KiB
C

1 month ago
//////////////////////////////////////////////////////////////////////////////
//<2F>ļ<EFBFBD>: <20><>ʽת<CABD><D7AA><EFBFBD><EFBFBD>
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>:
// <09><>ȡGDBX<42><58>ʽ
//
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д: 2024-11-14
//
//
/////////////////////////////////////////////////////////////////////////////
#pragma once
#include ".\otherformat.h"
#include ".\EmbellishBaseLib.h"
#include "afxcoll.h"
#include "..\Layer.h"
#include "..\Xy.h"
#include "..\Utils.h"
#include "..\GdbxDefine.h"
#include "ProjectionLib/Projection.h"
namespace NFormatReader
{
class CGdbxFile :
public CEmbellishBaseLib
{
public:
CGdbxFile(void);
virtual ~CGdbxFile(void);
public:
int Read(CFile& fr, short ver = -1); //XML<4D>ļ<EFBFBD><C4BC><EFBFBD>д
int Read(LPCTSTR lpszPathName, short ver = -1);
int SetMapUnit(int gm_unit);
protected:
int ReadData(CFile& fr, short ver = -1); //XML<4D>ļ<EFBFBD><C4BC><EFBFBD>д(<28><>ϸ<EFBFBD>ֶ<EFBFBD>)
int ReadCoordSys(CFile& fr, short ver, void* pXmlParse); //ͶӰ
int ReadMapInfoHead(CFile& fr, short ver, void* pXmlParse); //<2F><>ͼ<EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>Ϣ
int ReadMeasure(CFile& fr, short ver, void* pXmlParse); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>;<EFBFBD><CDBE><EFBFBD>
int ReadSectionSymbols(CFile& fr, short ver); //<2F><><EFBFBD><EFBFBD>
int ReadSectionLayers(CFile& fr, short ver = -1); //ͼ<><CDBC>·<EFBFBD><C2B7>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int ReadRectInfo(void* pXmlParse, GDBXRectInfo * info); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
int ReadSectionLayersName(const CString &str); //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int ReadCustomTool(void* pXmlParse, GDBXCustomTool * info); //<2F><><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>Ϣ
int ReadRectangle(void* pXmlParse, GDBXCustomTool * info); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
int ReadEllipse(void* pXmlParse, GDBXCustomTool * info); //<2F><>Բ<EFBFBD><D4B2>Ϣ<EFBFBD><CFA2>Բ<EFBFBD><D4B2>
int ReadPolyline(void* pXmlParse, GDBXCustomTool * info); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
int ReadPolygon(void* pXmlParse, GDBXCustomTool * info); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
int ReadIsoFault(void* pXmlParse, GDBXCustomTool * info); //<2F>ϲ<EFBFBD><CFB2><EFBFBD>
int ReadLayers(void* pXmlParse, GDBXLayers * info); //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int ReadLayer(void* pXmlParse, GDBXLayerInfo * info); //<2F><>ǰͼ<C7B0><CDBC><EFBFBD><EFBFBD>Ϣ
int ReadLayerInfo(void* pXmlParse, GDBXLayerInfo * info); //<2F><>ǰͼ<C7B0><CDBC><EFBFBD><EFBFBD>Ϣ
int ReadGridInfo(void* pXmlParse, GDBXLLGridInfo * info); //<2F><>ǰͼ<C7B0><CDBC><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3><EFBFBD><EFBFBD>
int ReadText(void* pXmlParse, GDBXTextInfo * info); //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
int ReadText(void* pXmlParse, GDBXAnchor * info); //
int ReadText(void* pXmlParse, GDBXGMFONT * info); //
int ReadLableOffset(void* pXmlParse, GDBXLableOffset * info);
int ReadScale(void* pXmlParse, GDBXScaleInfo * info); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int ReadImage(void* pXmlParse, GDBXImageInfo * info); //ͼƬ<CDBC><C6AC>gif<69>ȣ<EFBFBD>
int ReadInserMap(void *pXmlParse, GDBXInserMapInfo *info); //ͼ<><CDBC>GDBX<42>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
int ReadWell(void* pXmlParse, GDBXWellInfo * info); //<2F><><EFBFBD>ž<EFBFBD>
int ReadTown(void* pXmlParse, GDBXRectInfo * info); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int ReadAnchorT(void* pXmlParse, GDBXRectInfo * info); //
int ReadFontInfo(void* pXmlParse, GDBXFontInfo * info); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
int ReadFillInfoModify(void* pXmlParse, GDBXFillInfo * info); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int ReadSegments(void* pXmlParse, GDBXSegments * info); //<2F>߶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int ReadSegMemoryBlock(CFile& fr, void* pXmlParse, GDBXMemoryBlock * info); //<2F>߶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(base64 ѹ<><D1B9>)
vector<GDBXLINETO> ReadBigPts(const GDBXSegments &info); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD>
vector<GDBXLINETO> ReadMemoryBlock(const GDBXMemoryBlock &info);
int ReadOilWater(void* pXmlParse, GDBXOilWaterInfo * info); //<2F><>ˮ<EFBFBD><CBAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int ReadOilWaterGroup(void* pXmlParse, GDBXOilWaterGroupInfo * info); //
int InitMapInfo(const GDBXMapInfo &info);
int InitProjection(const GDBXProjection &pro);
void *DrawGDBXRectF(const GDBXCustomTool &rInfo, const GDBXFillInfo &info); //<2F><><EFBFBD>Ʒ<EFBFBD><C6B7>ž<EFBFBD><C5BE><EFBFBD>
void *DrawGDBXEllipseF(const GDBXCustomTool &eInfo, const GDBXFillInfo &info); //<2F><><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD>Բ Բ Բ<><D4B2><EFBFBD><EFBFBD>
void *DrawGDBXPolylineF(const GDBXCustomTool &pInfo, const GDBXFillInfo &info, //<2F><><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const GDBXSegments &sInfo, const GDBXMemoryBlock &mInfo);
void *DrawGDBXPolygonF(const GDBXCustomTool &pInfo, const GDBXFillInfo &info, //<2F><><EFBFBD>Ʒ<EFBFBD><C6B7>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD><EFBFBD>
const GDBXSegments &sInfo, const GDBXMemoryBlock &mInfo);
int DrawGDBXRect(const GDBXCustomTool &rInfo, const GDBXFillInfo &info, //<2F><><EFBFBD>ƾ<EFBFBD><C6BE><EFBFBD>
const GDBXLayerInfo &lInfo);
int DrawGDBXEllipse(const GDBXCustomTool &eInfo, const GDBXFillInfo &info, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ Բ Բ<><D4B2><EFBFBD><EFBFBD>
const GDBXLayerInfo &lInfo);
int DrawGDBXPolyline(const GDBXCustomTool &pInfo, const GDBXFillInfo &info, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const GDBXSegments &sInfo, const GDBXMemoryBlock &mInfo, const GDBXLayerInfo &lInfo);
int DrawGDBXPolygon(const GDBXCustomTool &pInfo, const GDBXFillInfo &info, //<2F><><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>
const GDBXSegments &sInfo, const GDBXMemoryBlock &mInfo, const GDBXLayerInfo &lInfo);
int DrawGDBXIsoFault(const GDBXCustomTool &iInfo, const GDBXFillInfo &info, //<2F><><EFBFBD>ƶϲ<C6B6><CFB2><EFBFBD>
const GDBXSegments &sInfo, const GDBXMemoryBlock &mInfo, const GDBXLayerInfo &lInfo);
int DrawGDBXIsoLine(const GDBXCustomTool &iInfo, const GDBXFillInfo &info, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const GDBXSegments &sInfo, const GDBXMemoryBlock &mInfo, const GDBXLayerInfo &lInfo, const GDBXFontInfo &fInfo);
int DrawGDBXGrid(const GDBXLLGridInfo & gInfo, const GDBXFillInfo &info, //ͼ<><CDBC>()
const GDBXGMFONT &xMaInfo, const GDBXGMFONT &xMiInfo, const GDBXGMFONT &yMaInfo,
const GDBXGMFONT &yMiInfo, const GDBXLableOffset &lInfo, const GDBXLayerInfo &layerInfo);
int DrawGDBXScale(const GDBXScaleInfo &sInfo, const GDBXFillInfo &info, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const GDBXAnchor &aInfo, const GDBXLayerInfo &layerInfo);
int DrawGDBXImage(const GDBXImageInfo &iInfo, const GDBXFillInfo &info, //ͼƬ<CDBC><C6AC>gif<69>ȣ<EFBFBD>
const GDBXLayerInfo &layerInfo);
int DrawGDBXInserMap(const GDBXInserMapInfo &iInfo, const GDBXFillInfo &info, //ͼ<><CDBC>GDBX<42>ļ<EFBFBD>
const GDBXLayerInfo &layerInfo);
int DrawGDBXText(const GDBXTextInfo &tInfo, const GDBXFillInfo &info, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const GDBXAnchor &aInfo, const GDBXLayerInfo &layerInfo, const GDBXLLGridInfo & gInfo);
int DrawGDBXWell(const GDBXWellInfo &wInfo, const GDBXFontInfo &fInfo, //<2F><><EFBFBD>ƾ<EFBFBD>ͼ<EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>
const GDBXFillInfo & info, const GDBXLayerInfo &layerInfo);
int DrawGDBXTownAnchor(const GDBXTextInfo &textInfo, const GDBXAnchor &aInfo, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>
const GDBXAnchor & jaInfo, const GDBXFillInfo & info, const GDBXLayerInfo &layerInfo);
int DrawGDBXLegendAnchor(const GDBXAnchor & jaInfo, const GDBXFillInfo & info, //<2F><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>ͼ<EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>
const GDBXLayerInfo &layerInfo);
int DrawGDBXJGAnchor(const GDBXRectInfo &aInfo, const GDBXAnchor & jaInfo, //<2F><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const GDBXFillInfo &info, const GDBXLayerInfo &layerInfo);
int DrawGDBXOilWater(const GDBXOilWaterInfo &oilInfo, const GDBXOilWaterGroupInfo &owgInfo,
const GDBXFillInfo &info, const GDBXFontInfo &fInfo, const GDBXLayerInfo &layerInfo); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˮ<EFBFBD><CBAE><EFBFBD><EFBFBD>
private:
void DeSerialize(CArchive& ar);
vector<CString> SplitByLine(const CString& input); //Layers <20><><EFBFBD><EFBFBD> \r\n <20>ָ<EFBFBD><D6B8>ַ<EFBFBD><D6B7><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CString ChangeEncoding(const CString &str, const CString &enc, int type = 0); //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
CString Utf8ToGb2312(const CString& utf8Str, int type = 0); //ת<><D7AA>
wchar_t* ReplaceLineBreaks(wchar_t* pWideChar, int type = 0); //ȥ<><C8A5><EFBFBD>ַ<EFBFBD><D6B7>е<EFBFBD>\\r\\n
int StringToSize(const CString &str, CSize8 &size); //<2F>ַ<EFBFBD><D6B7><EFBFBD>-202682.400000,4875329.100000<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int StringToRect(const CString &str, CRect8 &rect); //<2F><><EFBFBD><EFBFBD>
int StringToRect(const CString &str, CRect8 &rect, int num);
bool IsOutsideModelSpace(double x0, double y0, const CRect8 &rect); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
BYTE* HexStringToByteArray(CString hexString, size_t& byteArraySize);
COLORREF PenColorReverse(uint64_t color);
CString SuperAndSubConversion(CString cmd, int& bScript); //<2F><><EFBFBD>±<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD>
/**
* libarchive <EFBFBD><EFBFBD>ѹ<EFBFBD>ļ<EFBFBD>
*
* \param gdbxPath gdbxȫ·<EFBFBD><EFBFBD>
* \param outPath <EFBFBD><EFBFBD>ѹ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>ȫ·<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<EFBFBD><EFBFBD>
* \return
*/
int GdbxExtractZip(const CString &gdbxPath, const CString &outPath);
int RemoveAllGDBXFile(); //ɾ<><C9BE><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
bool IsDirectoryExist(const CString& path);
private:
struct GDBXInfo
{
int m_version; //<2F><>ȡ<EFBFBD>İ汾<C4B0><E6B1BE>
long m_color;
CString m_projection;
CString m_fileEncCoding; //<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>utf-8<><38>
CString m_gdbxXmlPath; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>xml<6D><6C>ʱ·<CAB1><C2B7><EFBFBD><EFBFBD>
double dCentre_x;
double dCentre_y; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
double m_dScaleFactor; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ǰͼ<C7B0><CDBC><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ֵ<EFBFBD><D6B5>1<EFBFBD><31>m_dScaleFactor
CRect8 m_modelSpace;
CProjection m_ExchangeXYZ; //ͶӰ
CXy *m_pXyMark; //<2F><EFBFBD><E6B4A2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>߶εȷ<CEB5><C8B7>ţ<EFBFBD>
CLayer* m_pLayer; //CLayer*CXy
};
GDBXInfo m_info;
};
};