main.cpp:
#include <iostream>
#include "shp_Parser.h"
int main()
{
SHP_Parser shpParser;
shpParser.ReadShapeFile();
return 0;
}
shp_Parser.h:
#ifndef SHP_PARSER_H
#define SHP_PARSER_H
#include <vector>
#include <fstream>
#include <iostream>
#include "gdal_priv.h"
typedef struct ini_file
{
std::string input_path;
std::string output_path;
std::string link_attr;
}INI_FILE;
class SHP_Parser
{
public:
void ReadShapeFile();
void dealRTable(GDALDriver *poDriver);
void dealNTable(GDALDriver *poDriver);
void dealCTable(GDALDriver *poDriver);
void dealR_LNameTable(GDALDriver *poDriver);
private:
bool ReadIni(const char* _path);
int deleteLinkID(char *_pDst, const char *_pSrc);
INI_FILE m_iniFile;
char **m_pRID;
int m_filed_0b01_count;
std::ofstream fout;
};
#endif
shp_Parser.cpp:
#include "shp_Parser.h"
#include <vector>
#include <algorithm>
#include "boost\algorithm\string.hpp"
#include "boost\property_tree\ptree.hpp"
#include "boost\property_tree\ini_parser.hpp"
#include "ogrsf_frmts.h"
#include "gdal.h"
#include "gdal_priv.h"
using namespace std;
// 支持删除的最多的link数,预分配内存
#define DELETE_LINK_NUM_MAX 5000
删除的link的属性类型
//#define ROAD_KIND_ATTR "080a"
void SHP_Parser::ReadShapeFile()
{
//使属性表字段支持中文
CPLSetConfigOption("SHAPE_ENCODING", "");
GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
//创建ESRI shp文件
char *pszDriverName = "ESRI Shapefile";
GDALDriver *poDriver = NULL;
poDriver = GetGDALDriverManager()->GetDriverByName(pszDriverName);
if (poDriver == NULL)
{
cout << pszDriverName << "驱动不可用!" << endl;
return;
}
// R表和R_LNname表中删除要素,N表和C表是修改要素属性
//ReadIni("config.ini");
ReadIni("F:\\lipeng\\tempProj\\delete466163\\Release\\config.ini");
dealRTable(poDriver);
dealNTable(poDriver);
dealCTable(poDriver);
dealR_LNameTable(poDriver);
system("pause");
}
void SHP_Parser::dealRTable(GDALDriver *poDriver)
{
#if 1
string pRshanghaiShp = m_iniFile.input_path + "\\Rshanghai.shp";
string pNewRshanghaiShp = m_iniFile.output_path + "\\Rshanghai.shp";
string RLogFile = m_iniFile.output_path + "\\Rlog.csv";
#endif
//------------------------------------------------------------------------------------------------------------------------------------------
// 修改Rshanghai.shp表
fout.open(RLogFile, ios::out);
GDALDataset *pDataSet_RShanghaiSimplify = (GDALDataset*)GDALOpenEx(pRshanghaiShp.c_str(), GDAL_OF_VECTOR, NULL, NULL, NULL); //RShanghai抽稀shp文件
cout << "正在创建新的Rshanghai.shp文件:" << pNewRshanghaiShp << "...";
GDALDataset *pNewDataSet_RShanghaiSimplify = poDriver->CreateCopy(pNewRshanghaiShp.c_str(), pDataSet_RShanghaiSimplify, 0, 0, 0, NULL);
if (pDataSet_RShanghaiSimplify == NULL || pNewDataSet_RShanghaiSimplify == NULL)
{
cout << "数据集打开失败!" << endl;
return;
}
cout << endl << pNewRshanghaiShp << "创建完成" << endl << "正在处理" << pNewRshanghaiShp << "...";
OGRLayer *poLayer, *poNewLayer = NULL;
poLayer = pDataSet_RShanghaiSimplify->GetLayer(0); // 都只有一个图层
poNewLayer = pNewDataSet_RShanghaiSimplify->GetLayer(0);
OGRFeature *poFeature;
poLayer->ResetReading();
int field_count = 0,