小工具---修改.shp文件,删除指定属性的要素(gdal, boost库)

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, 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值