自定义标绘之七 - 数据的保存与读取

本文详细介绍了如何在几何标绘应用中实现几何图形数据的保存与加载,包括点、线等基本元素的属性存储流程,如经纬度、颜色、透明度等,以及通过文件系统进行数据持久化的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

几何标绘完成之后,需要把标绘的内容保存到文件中,下次使用的时候,在加载起来就可以了。
文件保存的基类:

//几何图形的问价保存

class IGeoStorage {
public:
	IGeoStorage();
	~IGeoStorage();

	void setFile(FILE* file);

	virtual void saveTo();
	virtual void loadFrom();

protected:
	FILE* _file = nullptr;
};

IGeoStorage::IGeoStorage() {
}

IGeoStorage::~IGeoStorage() {
}

void IGeoStorage::setFile(FILE* file) {
	_file = file;
}

void IGeoStorage::saveTo() {

}

void IGeoStorage::loadFrom() {

}

文件保存管理:

#define GeoStorageMgr() (GeoStorageManager::getInstance())

class GeoStorageManager {
private:
	GeoStorageManager();
	static GeoStorageManager* _instance;
public:
	~GeoStorageManager();
	static GeoStorageManager* getInstance();

	void addGeoStorage(IGeoStorage* storage);

	void saveToFile(QString path);
	int loadFromFile(QString path);

private:
	void saveName(QString geoName);
private:
	QVector<IGeoStorage*> _storageList;

	FILE* _file = nullptr;
	ReadGeoFactory* _readFactory = nullptr;
};

#define GeoStorageMgr() (GeoStorageManager::getInstance())

class GeoStorageManager {
private:
	GeoStorageManager();
	static GeoStorageManager* _instance;
public:
	~GeoStorageManager();
	static GeoStorageManager* getInstance();

	void addGeoStorage(IGeoStorage* storage);

	void saveToFile(QString path);
	int loadFromFile(QString path);

private:
	void saveName(QString geoName);
private:
	QVector<IGeoStorage*> _storageList;

	FILE* _file = nullptr;
	ReadGeoFactory* _readFactory = nullptr;
};

点数据保存:

//具有存储功能的几何点对象

class StoragePointGeo 
	: public PointGeo
	, public IGeoStorage {
public:
	StoragePointGeo();
	~StoragePointGeo();

	virtual void saveTo()override;
	virtual void loadFrom()override;
};

StoragePointGeo::StoragePointGeo() {
}

StoragePointGeo::~StoragePointGeo() {
}

void StoragePointGeo::saveTo() {
	//1.保存经纬高
	fwrite(&_lon, sizeof(double), 1, _file);
	fwrite(&_lat, sizeof(double), 1, _file);
	fwrite(&_alt, sizeof(double), 1, _file);
	//2.保存半径
	int r = _pointProp->getRadius();
	fwrite(&r, sizeof(int), 1, _file);
	//3.外圈线粗
	int w = _pointProp->getOuterWidth();
	fwrite(&w, sizeof(int), 1, _file);
	//4.外圈颜色
	QColor oc = _pointProp->getOuterColor();
	int oc_r = oc.red();
	fwrite(&oc_r, sizeof(int), 1, _file);

	int oc_g = oc.green();
	fwrite(&oc_g, sizeof(int), 1, _file);

	int oc_b = oc.blue();
	fwrite(&oc_b, sizeof(int), 1, _file);

	//5.填充颜色
	QColor fc = _pointProp->getFillColor();
	int fc_r = fc.red();
	fwrite(&fc_r, sizeof(int), 1, _file);

	int fc_g = fc.green();
	fwrite(&fc_g, sizeof(int), 1, _file);

	int fc_b = fc.blue();
	fwrite(&fc_b, sizeof(int), 1, _file);

	//6.透明度
	int a = _pointProp->getAlpha();
	fwrite(&a, sizeof(int), 1, _file);

	//7.是否显示名称
	bool b = _pointProp->getShowName();
	fwrite(&b, sizeof(bool), 1, _file);
}

void StoragePointGeo::loadFrom() {
	//1.保存经纬高
	fread(&_lon, sizeof(double), 1, _file);
	fread(&_lat, sizeof(double), 1, _file);
	fread(&_alt, sizeof(double), 1, _file);
	//2.保存半径
	int r = 0;
	fread(&r, sizeof(int), 1, _file);
	_pointProp->setRadius(r);

	//3.外圈线粗
	int w = 0;
	fread(&w, sizeof(int), 1, _file);
	_pointProp->setOuterWidth(w);
	//4.外圈颜色
	QColor oc;
	int oc_r = 0;
	fread(&oc_r, sizeof(int), 1, _file);
	oc.setRed(oc_r);

	int oc_g = 0;
	fread(&oc_g, sizeof(int), 1, _file);
	oc.setGreen(oc_g);

	int oc_b = 0;
	fread(&oc_b, sizeof(int), 1, _file);
	oc.setBlue(oc_b);
	_pointProp->setOuterColor(oc);

	//5.填充颜色
	QColor fc;
	int fc_r = 0;
	fread(&fc_r, sizeof(int), 1, _file);
	fc.setRed(fc_r);

	int fc_g = 0;
	fread(&fc_g, sizeof(int), 1, _file);
	fc.setGreen(fc_g);

	int fc_b = 0;
	fread(&fc_b, sizeof(int), 1, _file);
	fc.setBlue(fc_b);
	_pointProp->setFillColor(fc);

	//6.透明度
	int a = 0;
	fread(&a, sizeof(int), 1, _file);
	_pointProp->setAlpha(a);

	//7.是否显示名称
	bool b = false;
	fread(&b, sizeof(bool), 1, _file);
	_pointProp->setShowName(b);
}

线数据保存:

class StorageLineGeo :
	public LineGeo 
	, public IGeoStorage {

public:
	StorageLineGeo();
	~StorageLineGeo();

	virtual void saveTo()override;
	virtual void loadFrom()override;
}; 
StorageLineGeo::StorageLineGeo() {
}

StorageLineGeo::~StorageLineGeo() {
}

void StorageLineGeo::saveTo() {
	QVector<UserGeoPoint>&points = getPoints();
	int size = points.size();
	//保存点数量;
	fwrite(&size, sizeof(int), 1, _file);
	for (size_t i = 0; i < points.size(); ++i) {
		//1.保存经纬高;
		fwrite(&points[i].lon, sizeof(double), 1, _file);
		fwrite(&points[i].lat, sizeof(double), 1, _file);
		fwrite(&points[i].alt, sizeof(double), 1, _file);
	}

	GeoLineProp* lineProp = getLineProp();
	if (lineProp) {
		int lineWidth = lineProp->getLineWidth();
		fwrite(&lineWidth, sizeof(int), 1, _file);
		
		int lineType = lineProp->getLineType();
		fwrite(&lineType, sizeof(int), 1, _file);

		QColor lineColor = lineProp->getLineColor();
		int oc_r = lineColor.red();
		fwrite(&oc_r, sizeof(int), 1, _file);
		int oc_g = lineColor.green();
		fwrite(&oc_g, sizeof(int), 1, _file);
		int oc_b = lineColor.blue();
		fwrite(&oc_b, sizeof(int), 1, _file);

		int lineAlpha = lineProp->getLineAlpha();
		fwrite(&lineAlpha, sizeof(int), 1, _file);

		bool b = lineProp->getShowName();
		fwrite(&b, sizeof(bool), 1, _file);
	}
}

void StorageLineGeo::loadFrom() {
	int size = 0;
	getPoints().clear();
	fread(&size, sizeof(int), 1, _file);
	for (int i = 0; i < size; ++i) {
		UserGeoPoint geoPoint;
		double lon = 0.0, lat = 0.0, alt = 0.0;
		fread(&lon, sizeof(double), 1, _file);
		fread(&lat, sizeof(double), 1, _file);
		fread(&alt, sizeof(double), 1, _file);
		geoPoint.lon = lon;
		geoPoint.lat = lat;
		geoPoint.alt = alt;
		addLinePoint(geoPoint);
	}
	GeoLineProp* lineProp = getLineProp();
	if (lineProp) {
		int lineWidth = 0;
		fread(&lineWidth, sizeof(int), 1, _file);
		lineProp->setLineWidth(lineWidth);

		int lineType = 0;
		fread(&lineType, sizeof(int), 1, _file);
		lineProp->setLineType(lineType);
	
		QColor lineColor;
		int oc_r = 0;
		fread(&oc_r, sizeof(int), 1, _file);
		lineColor.setRed(oc_r);

		int oc_g = 0;
		fread(&oc_g, sizeof(int), 1, _file);
		lineColor.setGreen(oc_g);

		int oc_b = 0;
		fread(&oc_b, sizeof(int), 1, _file);
		lineColor.setBlue(oc_b);
		lineProp->setLineColor(lineColor);

		int lineAlpha = 0;
		fread(&lineAlpha, sizeof(int), 1, _file);
		lineProp->setLineAlpha(lineAlpha);

		bool b = false;
		fread(&b, sizeof(bool), 1, _file);
		lineProp->setShowName(b);
	}
}

aaa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值