📄 makejianpinindexdlg.h
字号:
// MakeJianPinIndexDlg.h : header file
//
#if !defined(AFX_MAKEJIANPININDEXDLG_H__8B3842ED_EF29_407E_8C16_9698E51F49D5__INCLUDED_)
#define AFX_MAKEJIANPININDEXDLG_H__8B3842ED_EF29_407E_8C16_9698E51F49D5__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <vector>
#include "Afxtempl.h"
struct ST_CityList
{
int iCityID;
std::vector<int> vSubCityList;
};
struct ST_ProvList
{
int iProvID;
CList<ST_CityList*, ST_CityList*> CityList;
};
struct ST_CityAll
{
int iCityID;
char szName[32];
};
struct ST_NameIndex
{
UINT nOffset;
UINT nTotalLen;
UINT nPIULen;
UINT nRdULen;
BYTE* pBuffer;
};
struct ST_ProvIndex
{
int iProvID;
int iOffset;
USHORT usCityNum;
char szName[32];
};
struct ST_CityIndex
{
int iCityID;
int iOffset;
USHORT usSubCityNum;
char szName[32];
};
// 默认字母一级分包数目为24
struct ST_SubCityIndex
{
int iCityID;
int iOffset;
char szName[32];
};
struct ST_CharIndex
{
int iOffset;
USHORT usPackNum;
};
struct ST_PackIndex
{
BYTE byNo; // 拼音首字母的序号
BYTE byFlag; // POI:0, Rd:1
int iOffset; // 数据绝对偏移
DWORD nTotalLen; // 压缩后数据长度
DWORD nTotalULen; // 压缩前数据长度
DWORD nJPULen; // 简拼数据长度
};
struct ST_NameData
{
BYTE byCharCnt; // 字符个数
BYTE byType; // 小类
BYTE byLayerID; // 图层号
int iMapID; // 图幅
};
/////////////////////////////////////////////////////////////////////////////
//
// Macros
class CJPIndexStruct
{
public:
enum
{
FileHeaderFlagLen = 0x9,
CityNum = 0x4,
CityIndexOldLen = 0xC,
CityIndexNewLen = 0x14,
CharacterIndexCount = 0x18 //字符,和汉字A-Z声母区
};
};
#define CHARACTER_INDEX_COUNT 0x18
#define CHARACTER_NEWINDEX_COUNT 0x1b
#define BLOCK_SIZE 0x8000
typedef unsigned long ulongf;
class CNameNode
{
public:
// 构造与析构
CNameNode();
CNameNode(char *pszName, int nMapID, BYTE bLayer, BYTE bType);
~CNameNode();
// Get
char* GetName() const;
int GetNameLen() const;
int GetMapID() const;
BYTE GetLayer() const;
BYTE GetType() const;
CNameNode* GetNext() const;
// Set
void SetNext(CNameNode *pNext);
// 统计索引长
int IndexLen();
private:
char* m_pszName; //名称
int m_nMapID; //图幅ID
BYTE m_bLayer; //图层ID
BYTE m_bType; //小类ID
CNameNode *m_pNext;
};
class CNameNodeChain
{
public:
// 构造与析构
CNameNodeChain();
~CNameNodeChain();
// Get
CNameNode* GetFirst() const;
int GetObjNum() const;
int GetOffset() const;
// Set
void SetOffset(const int &nOffset);
// Insert
void AddTail(CNameNode *pInsNode);
// 统计索引长
int IndexLen() const;
private:
CNameNode *m_pHead;
CNameNode *m_pTail;
int m_nObjNum;
int m_nOffset;
};
class CJPNode
{
public:
// 构造与析构
CJPNode();
~CJPNode();
// Get
int GetOffset() const;
BYTE* GetJPCode() const;
BYTE GetJPCodeLen() const;
CJPNode* GetNext() const;
// Set
void SetOffset(const int &nOffset);
void SetJPCode(const BYTE *pbJPCode);
void SetNext(const CJPNode *pNext);
// Stat
int IndexLen();
private:
int m_nOffset; // 名称数据的偏移
BYTE *m_pbJPCode; // 简拼码
CJPNode *m_pNext;
};
class CJPNodeChain
{
public:
// 构造与析构
CJPNodeChain();
~CJPNodeChain();
// Get
CJPNode* GetFirst() const;
int GetObjNum() const;
// Set
// Insert
void AddTail(CJPNode *pInsNode);
// Stat
int IndexLen() const;
// Update
private:
CJPNode *m_pHead;
CJPNode *m_pTail;
int m_nObjNum;
};
/***********************************************************
详细的索引结构请参见相关文档。
************************************************************/
struct ST_Info
{
CHAR szName[256];
LONG lBreadthID;
BYTE byLayerID;
ST_Info()
{
memset(szName, 0x0, 256);
lBreadthID = 0;
byLayerID = 0;
}
//////////////////
// POI文本说明
// 简称 || 图幅号 || 图层号 || 0 || 全称
//////////////////
BOOL ParsePITxt(CString strContent)
{
if(strContent.GetLength() == 0)
return TRUE;
int iPos = 0;
if( (iPos = strContent.Find("||")) < 0)
return FALSE;
strContent = strContent.Mid(iPos + strlen("||"));
if( (iPos = strContent.Find("||")) < 0)
return FALSE;
lBreadthID = atoi(strContent.Left(iPos));
strContent = strContent.Mid(iPos + strlen("||"));
if( (iPos = strContent.Find("||")) < 0)
return FALSE;
byLayerID = atoi(strContent.Left(iPos));
strContent = strContent.Mid(iPos + strlen("||"));
if( (iPos = strContent.Find("||")) < 0)
return FALSE;
strContent = strContent.Mid(iPos + strlen("||"));
strContent.TrimLeft();
strContent.TrimRight();
strcpy(szName, strContent.GetBuffer(0));
return TRUE;
}
//////////////////
// Rd文本说明
// 简称 || 图幅号 || 图层号 || 0
//////////////////
BOOL ParseRdTxt(CString strContent)
{
if(strContent.GetLength() == 0)
return TRUE;
int iPos = 0;
if( (iPos = strContent.Find("||")) < 0)
return FALSE;
strcpy(szName, (strContent.Left(iPos)).GetBuffer(0));
strContent = strContent.Mid(iPos + strlen("||"));
if( (iPos = strContent.Find("||")) < 0)
return FALSE;
lBreadthID = atoi(strContent.Left(iPos));
strContent = strContent.Mid(iPos + strlen("||"));
if( (iPos = strContent.Find("||")) < 0)
return FALSE;
byLayerID = atoi(strContent.Left(iPos));
return TRUE;
}
};
class CCity
{
public:
// 构造与析构
CCity();
~CCity();
// Get
int GetID() const;
//
int GetOffset() const;
int GetCLen() const;
int GetUCLen() const;
int GetJPLen() const;
ST_PackIndex GetPackIndex(const int i);
BYTE* GetPackBuffer(const int i);
int GetPOICnt();
int GetRdCnt();
int GetSrcPIJPULen() const;
int GetSrcRdJPULen() const;
// Set
void SetID(const int &nID);
void SetOffset(const int &nOffset);
void SetCLen(const int &nCLen);
void SetUCLen(const int &nUCLen);
void SetJPLen(const int nJPLen);
// Stat
static int CharacterIndexLen();
// Parse
void ParseJPIndex(const BYTE *pbOldNamePack);
void ParseTxt(CString strDir);
void DeleteQuotation(char* pszName, int& nNameLen);
void LoadJPToPack(CJPNodeChain *pJPNodeChain, LPBYTE &pbOrigin);
void LoadNameIndexToPack(ST_NameIndex st_NameIndex, LPBYTE &pbOrigin);
void LoadNameDataToPack(CNameNodeChain *pNameNodeChain, LPBYTE &pbOrigin);
int Write(CFile& fileJP, CFile& fileData, int& iCharIdxPos, int& iPackIndexPos, int& iPackDataPos);
protected:
private:
int m_nID;
int m_nOffset;
int m_nCLen; // 总数据压缩后的长度
int m_nUCLen;
int m_nPIJPUCLen;
int m_nRdJPUCLen;
int m_nJPLen; // 简拼数据压缩后的长度
int m_nPOICnt;
int m_nRdCnt;
ST_PackIndex m_ST_PackIndex[CHARACTER_INDEX_COUNT]; // 分包索引
BYTE* m_pbPack[CHARACTER_INDEX_COUNT];
CJPNodeChain* m_pPIJPPool[CHARACTER_INDEX_COUNT]; // (1)POI 简拼索引节点集
CJPNodeChain* m_pRdJPPool[CHARACTER_INDEX_COUNT]; // (2)Rd 简拼索引节点集
CNameNodeChain* m_ppPINamePack[CHARACTER_INDEX_COUNT]; // (3)POI 名称索引包
CNameNodeChain* m_ppRdNamePack[CHARACTER_INDEX_COUNT]; // (4)Rd 名称索引包
CNameNodeChain* m_ppPINameNewPack[CHARACTER_NEWINDEX_COUNT][CHARACTER_NEWINDEX_COUNT];
CNameNodeChain* m_ppRdNameNewPack[CHARACTER_NEWINDEX_COUNT][CHARACTER_NEWINDEX_COUNT];
};
//////////////////////////////////////////////////////////////////////////////////////////
//多音字无法处理;有些字会出错,比如"涮"
int GetJianPinCode(LPCSTR pszSrc, int nSrcLen, LPSTR lpObject, int &nObjectLen, BOOL bUpperChar = TRUE);
int GetPYIndex(const char chPY);
void MergeToFinalFile (CString strSDIFile);
/////////////////////////////////////////////////////////////////////////////
// CMakeJianPinIndexDlg dialog
class CMakeJianPinIndexDlg : public CDialog
{
// Construction
public:
CMakeJianPinIndexDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CMakeJianPinIndexDlg)
enum { IDD = IDD_MAKEJIANPININDEX_DIALOG };
CString m_strJianPinFile;
CString m_strJPName;
CString m_strCityAll;
CString m_strTxtDir;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMakeJianPinIndexDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CMakeJianPinIndexDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
virtual void OnOK();
afx_msg void OnBrowseNidFile();
afx_msg void OnBrowseJianPinFile();
afx_msg void OnBtnCheckJp();
afx_msg void OnBUTTONCityAll();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
BROWSEINFO m_bi;
std::vector<ST_CityAll> m_vSTCityAll;
std::vector<int> m_vCity;
CList<ST_ProvList*, ST_ProvList*> m_ProvList;
int m_iProvCnt;
int m_iCityCnt;
int m_iSubCityCnt;
private:
void Stat();
void ParseCityIDName();
void ReadTxt();
void ParseCity();
void StatCity();
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_MAKEJIANPININDEXDLG_H__8B3842ED_EF29_407E_8C16_9698E51F49D5__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -