加载ogrsf_fmt矢量处理库
#include<ogrsf_fmt>
读取点矢量文件
void ProcessOfPoint(const char *point_file){
//打开注册机
GDALAllRegister();
GDALDataset* poDS;
poDS=(GDALDataset*) OpenEx(point_file,GDAL_OF_VECTOR,NULL,NULL,NULL);
if(poDS == NULL){
printf("打开文件失败!\n");
exit(1) //正常退出
}
}
需要注意的是,别忘了打开支持所有文件格式的注册函数,这里是为了省事使用GDALAllRegister()
函数。
读取shp文件
按照shp文件格式去逐层读取信息,主要逻辑就是 layer -> feature -> field -> geometry,就是图层 -> 要素 -> 属性段 -> 几何体。举个例子我只有一个有五十个点的shp文件,shp文件一般就是只有一个图层,而栅格数据,比如TIFF格式数据有很多个波段时,就会有好几个图层,这个要素就是指的是某一个点对象了,这个点对象有属性和几何体两个重要性质,属性描述状态或者质量,几何体描述其形状,当然点的形状就是点,没什么可以解释的,但是线段和面是有形状的。OK,介绍到这里,应该明白了shp文件的基本组成形式。
//查询图层
OGRLayer* poLayer
poLayer=poDS->GetLayer(0); //安装图层索引去查询,当然还有按照图层名称去查询的GetLayerByName("图层名称")
//查询要素
OGRFeature* poFeature;
//重置图层,使其从头开始
poLayer->ResetReading();
while((poFeature=poLayer->GetNextFeature())!=NULL){
for(auto &&oField:*poFeature){
if(oField.IsNull()){
printf("该要素的该属性字段为null");
continue;
}
switch(oField.GetType()){
case OFTInteger: printf("%d ", oField.GetAsInteger());
break;
case OFTInteger64: printf(CPL_FRMT_GIB",", oField.GetAsInteger64());
break;
case OFTReal: printf("%3f ", oField.GetAsDouble());
break;
case OFTString: printf("%s ", oField.GetAsString());
break;
default:printf("%s ", oField.GetAsString());//这个GetAsString()无论原本属性字段类型是什么样的都可以将其转换为 sting。
break;
}
}
}
获取坐标
OGRGeometry* poGeometry;
poGemetry=poFeature->GetGeometryRef
if(poGeometry!=NULL && wkbFlatten(poGeometry-getGeometryType()==wkbPoint)){
OGRPoint* Point=poGeimetry->toPoint();
printf("%.3f:%.3f\n",Point->getX(),Point->getY());
}
else
printf("没有查询到点要素\n");
关闭文件
//要素使用完后,要立马摧毁掉
OGRFeature::DestroyFeature( poFeature );
最后不要忘记关闭文件,以防出错
GDALClose(poDS);
总体代码
#include "ogrsf_frmts.h"
void ProcessOfPoint(const char* point_file) {
// 注册所有的驱动
GDALAllRegister();
GDALDataset* poDS;
//打开一个点状要素
poDS = (GDALDataset * ) GDALOpenEx(point_file, GDAL_OF_VECTOR, NULL, NULL, NULL);
if (poDS == NULL) {
printf("Open the point file failed\n");
exit(1);
}
//打开点状要素的图层
OGRLayer *poLayer;
poLayer = poDS->GetLayer(0);
OGRFeature* poFeature;
poLayer->ResetReading();
while ((poFeature = poLayer->GetNextFeature() )!= NULL) {
for (auto&& oField : *poFeature) {
if (oField.IsNull()) {
printf("(null)");
continue;
}
if (oField.IsUnset()) {
printf("(unset)");
continue;
}
switch (oField.GetType()) {
case OFTInteger: printf("%d ", oField.GetAsInteger());
break;
case OFTInteger64: printf(CPL_FRMT_GIB",", oField.GetAsInteger64());
break;
case OFTReal: printf("%3f ", oField.GetAsDouble());
break;
case OFTString: printf("%s ", oField.GetAsString());
break;
default:printf("%s ", oField.GetAsString());
break;
}
}
//处理几何数据,获取X,Y坐标
OGRGeometry* poGeometry;
poGeometry = poFeature->GetGeometryRef();
if (poGeometry != NULL && wkbFlatten(poGeometry->getGeometryType())== wkbPoint) {
OGRPoint *point = poGeometry->toPoint();
printf("%.3f:%.3f\n", point->getX(), point->getY());
}
else
{
printf("no point\n");
}
OGRFeature::DestroyFeature(poFeature);
}
GDALClose(poDS);
}