- 积分
- 31055
- 明经币
- 个
- 注册时间
- 2007-4-24
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 gzxl 于 2025-8-16 10:12 编辑
利用 gdal 库读写 shp 简单代码示例
包含目录:添加 gdal 对应所在的 include
库目录:添加 gdal 对应所在的 lib
附加依赖项: gdal.lib
一 简介
Shape files是ESRI提供的一种矢量数据格式,它没有拓扑信息,一个Shape files由一组文件组成,其中必要的基本文件包括坐标文件(.shp)、索引文件(.shx)和属性文件(.dbf)三个文件。
1 坐标文件(.shp)的结构说明
坐标文件(.shp)用于记录空间坐标信息。它由头文件和实体信息两部分构成
2. 属性文件(.dbf)的结构说明
属性文件(.dbf)用于记录属性信息。它是一个标准的DBF文件,也是由头文件和实体信息两部分构成
3. 索引文件(.shx)的结构说明
索引文件(.shx)主要包含坐标文件的索引信息,文件中每个记录包含对应的坐标文件记录距离坐标文件的文件头的偏移量。
二 《建设工程规划条件核实测量成果数据标准》
1、分层及文件格式
2、属性表
属性表分类包含:
2.1 建筑类规划核实属性表(图形文件)
2.2 建筑类规划核实属性表(表格文件)
2.3 市政类规划核实工程属性表(图形文件)
截图其中一个,其他详细参加《建设工程规划条件核实测量成果数据标准》
2.3 市政类规划核实工程属性表(图形文件)
2.3.1 规划核实(交通工程)信息 (HY_JTGCGHHS)
三 代码示例:依据前面的数据标准输出ARC/INFO SHP格式
 - TCHAR szKword[10];
- acedInitGet(0, _T("A B"));
- int nReturn = acedGetKword(_T("\n输入分层及文件格式选项[交通工程(A)/管线工程(B)]:"), szKword);
- if (nReturn == RTNORM)
- {
- struct resbuf *rbuf; // 结果缓冲区链表
- ads_name ssname;
- int res;
- if (_tcscmp(szKword, _T("A")) == 0) // 交通工程
- {
- rbuf = acutBuildList(RTDXF0, _T("LWPOLYLINE"), RTNONE);
- res = acedSSGet(TEXT("X"), NULL, NULL, rbuf, ssname);
- acutRelRb(rbuf);
- if (res != RTNORM)
- {
- acutPrintf(_T("\n图面没有可用的交通道路线(多段线)!\n"));
- return;
- }
- }
- else if (_tcscmp(szKword, _T("B")) == 0) // 管线工程
- {
- rbuf = acutBuildList(RTDXF0, _T("LINE"), RTNONE);
- res = acedSSGet(TEXT("X"), NULL, NULL, rbuf, ssname);
- acutRelRb(rbuf);
- if (res != RTNORM)
- {
- acutPrintf(_T("\n图面没有可用的管线(直线)!\n"));
- return;
- }
- }
- Adesk::Int32 length;
- acedSSLength(ssname, &length);
- ads_name ename;
- AcDbObjectId endId;
- vector<vector<OGRPoint>> vertexPoint;
- int noCloseNum = 0;
- double dMaxArea = 0.0, dMaxLength = 0.0;
- for (int i = 0; i < length; i++)
- {
- acedSSName(ssname, i, ename);
- acdbGetObjectId(endId, ename);
- AcDbEntity* pEnt = NULL;
- acdbOpenObject(pEnt, endId, AcDb::kForRead);
- if (_tcscmp(szKword, _T("A")) == 0) // 交通工程
- {
- if (pEnt->isKindOf(AcDbPolyline::desc()))
- {
- AcDbPolyline *pPolyline = AcDbPolyline::cast(pEnt);
- if (!pPolyline->isClosed())
- {
- pPolyline->close();
- noCloseNum++;
- continue;
- }
- double dArea = 0.0;
- pPolyline->getArea(dArea);
- if (dArea > dMaxArea)
- dMaxArea = dArea;
- vector<OGRPoint> ogrPts;
- for (int j = 0; j < pPolyline->numVerts(); j++)
- {
- AcGePoint3d verPoint;
- if (pPolyline->getPointAt(j, verPoint) == Acad::eOk)
- {
- OGRPoint point;
- point.setX(verPoint.x);
- point.setY(verPoint.y);
- ogrPts.push_back(point);
- }
- }
- pPolyline->close();
- vertexPoint.push_back(ogrPts);
- ogrPts.clear();
- }
- }
- else if (_tcscmp(szKword, _T("B")) == 0) // 管线工程
- {
- if (pEnt->isKindOf(AcDbLine::desc()))
- {
- AcDbLine *pLine = AcDbLine::cast(pEnt);
- AcGePoint3d startPt, endPt;
- pLine->getStartPoint(startPt);
- pLine->getEndPoint(endPt);
- vector<OGRPoint> ogrPts;
- OGRPoint ogrStartPt, ogrEndPt;
- ogrStartPt.setX(startPt.x);
- ogrStartPt.setY(startPt.y);
- ogrEndPt.setX(endPt.x);
- ogrEndPt.setY(endPt.y);
- ogrPts.push_back(ogrStartPt);
- ogrPts.push_back(ogrEndPt);
- vertexPoint.push_back(ogrPts);
- ogrPts.clear();
- double dist = (AcGePoint2d(startPt.x, startPt.y)).distanceTo(AcGePoint2d(endPt.x, endPt.y));
- dMaxLength += dist;
- pLine->close();
- }
- }
- pEnt->close();
- }
- acedSSFree(ssname);
- int nFormatWidth = 0;
- if (dMaxArea != 0.0)
- {
- CString sArea = ToString(dMaxArea, 2);
- for (int i = 0; i < sArea.GetLength(); i++)
- {
- if ((sArea >= '0' && sArea <= '9') || sArea == '.')
- nFormatWidth++;
- }
- }
- if (dMaxLength != 0.0)
- {
- CString sMaxLength = ToString(dMaxLength, 2);
- for (int i = 0; i < sMaxLength.GetLength(); i++)
- {
- if ((sMaxLength >= '0' && sMaxLength <= '9') || sMaxLength == '.')
- nFormatWidth++;
- }
- }
- if (nFormatWidth == 0)
- nFormatWidth = 8;
- if (vertexPoint.size() > 0)
- {
- CString ReturnPach;
- Getbrowse(ReturnPach); // 获得文件夹路径
- if (_tcscmp(ReturnPach, _T("")) == 1)
- {
- CString sPrefixName;
- if (_tcscmp(szKword, _T("A")) == 0) // 交通工程
- sPrefixName = _T("HY_JTGCGHHS");
- else if (_tcscmp(szKword, _T("B")) == 0) // 管线工程
- sPrefixName = _T("HY_GXGCGHHS");
- CString sFileName = ReturnPach + _T("\\") + sPrefixName + _T(".shp");
- const char *pszDriverName = "ESRI Shapefile";
- // 注册所有的文件格式驱动
- GDALDriver *poDriver;
- GDALAllRegister();
- // 得到shp文件的处理器
- poDriver = GetGDALDriverManager()->GetDriverByName(pszDriverName);
- if (poDriver == NULL)
- {
- acutPrintf(_T("\n%s 获取驱动程序 ESRI Shapefile 错误!\n"), pszDriverName);
- return;
- }
- // 创建shp文件
- GDALDataset *poDS;
- const char* fileName = CStringToCharArray(sFileName);
- poDS = poDriver->Create(fileName, 0, 0, 0, GDT_Unknown, NULL); //创建shp文件
- if (poDS == NULL)
- {
- acutPrintf(_T("\n创建输出文件失败!\n"));
- return;
- }
- // 创建图层
- OGRLayer *poLayer;
- if (_tcscmp(szKword, _T("A")) == 0) // 交通工程
- {
- poLayer = poDS->CreateLayer("HY_JTGCGHHS", NULL, wkbPolygon, NULL);
- OGRFieldDefn KJFWXXIDField("KJFWXXID", OFTString); // 空间范围信息ID
- OGRFieldDefn YSDMField("YSDM", OFTString); // 要素代码
- OGRFieldDefn DZJGHField("DZJGH", OFTString); // 电子监管号
- OGRFieldDefn YDMJField("YDMJ", OFTReal); // 用地面积
- OGRFieldDefn JTGCXMLXField("JTGCXMLX", OFTString); // 交通工程项目类型
- OGRFieldDefn DLDJField("DLDJ", OFTString); // 道路等级
- OGRFieldDefn DLCDField("DLCD", OFTReal); // 道路长度
- OGRFieldDefn BZHDMKDField("BZHDMKD", OFTReal); // 标准横断面宽度
- OGRFieldDefn GDJTLXField("GDJTLX", OFTString); // 轨道交通类型
- OGRFieldDefn GDCDField("GDCD", OFTReal); // 轨道长度
- OGRFieldDefn KZXKDField("KZXKD", OFTReal); // 轨道控制线宽度
- KJFWXXIDField.SetWidth(36);
- YSDMField.SetWidth(10);
- DZJGHField.SetWidth(19);
- YDMJField.Set("YDMJ", OFTReal, nFormatWidth, 2, OJRight);
- JTGCXMLXField.SetWidth(2);
- DLDJField.SetWidth(10);
- DLCDField.Set("DLCD", OFTReal, nFormatWidth, 2, OJRight);
- BZHDMKDField.Set("BZHDMKD", OFTReal, nFormatWidth, 2, OJRight);
- GDJTLXField.SetWidth(10);
- GDCDField.Set("GDCD", OFTReal, nFormatWidth, 2, OJRight);
- KZXKDField.Set("KZXKD", OFTReal, nFormatWidth, 2, OJRight);
- poLayer->CreateField(&KJFWXXIDField);
- poLayer->CreateField(&YSDMField);
- poLayer->CreateField(&DZJGHField);
- poLayer->CreateField(&YDMJField);
- poLayer->CreateField(&JTGCXMLXField);
- poLayer->CreateField(&DLDJField);
- poLayer->CreateField(&DLCDField);
- poLayer->CreateField(&BZHDMKDField);
- poLayer->CreateField(&GDJTLXField);
- poLayer->CreateField(&GDCDField);
- poLayer->CreateField(&KZXKDField);
- }
- else if (_tcscmp(szKword, _T("B")) == 0) // 管线工程
- {
- poLayer = poDS->CreateLayer("HY_GXGCGHHS", NULL, wkbPolygon, NULL);
- OGRFieldDefn KJFWXXIDField("KJFWXXID", OFTString); // 空间范围信息ID
- OGRFieldDefn YSDMField("YSDM", OFTString); // 要素代码
- OGRFieldDefn DZJGHField("DZJGH", OFTString); // 电子监管号
- OGRFieldDefn SPGXLXField("SPGXLX", OFTString); // 审批管线类型
- OGRFieldDefn GXFJField("GXFJ", OFTString); // 审批管线分级
- OGRFieldDefn SPGXCDField("SPGXCD", OFTReal); // 审批管线长度
- OGRFieldDefn JGGXCDField("JGGXCD", OFTReal); // 竣工管线长度
- OGRFieldDefn SPGXGJField("SPGXGJ", OFTString); // 审批管线管径
- OGRFieldDefn JGGXGJField("JGGXGJ", OFTString); // 竣工管线管径
- KJFWXXIDField.SetWidth(36);
- YSDMField.SetWidth(10);
- DZJGHField.SetWidth(19);
- SPGXLXField.SetWidth(10);
- GXFJField.SetWidth(10);
- SPGXCDField.Set("SPGXCD", OFTReal, nFormatWidth, 2, OJRight);
- JGGXCDField.Set("JGGXCD", OFTReal, nFormatWidth, 2, OJRight);
- SPGXGJField.SetWidth(200);
- JGGXGJField.SetWidth(200);
- poLayer->CreateField(&KJFWXXIDField);
- poLayer->CreateField(&YSDMField);
- poLayer->CreateField(&DZJGHField);
- poLayer->CreateField(&SPGXLXField);
- poLayer->CreateField(&GXFJField);
- poLayer->CreateField(&SPGXCDField);
- poLayer->CreateField(&JGGXCDField);
- poLayer->CreateField(&SPGXGJField);
- poLayer->CreateField(&JGGXGJField);
- }
- if (poLayer == NULL)
- {
- acutPrintf(_T("\n图层创建失败!\n"));
- GDALClose(poDS);
- poDS = NULL;
- vertexPoint.clear();
- return;
- }
- for (int i = 0; i < vertexPoint.size(); i++)
- {
- vector<OGRPoint> ogrPts = vertexPoint.at(i);
- OGRFeature *poFeature;
- poFeature = OGRFeature::CreateFeature(poLayer->GetLayerDefn());
- // 创建几何和 Feature
- if (_tcscmp(szKword, _T("A")) == 0) // 交通工程
- {
- OGRLinearRing ogrring;
- int pNum = (int)ogrPts.size();
- ogrring.setNumPoints(pNum);
- for (int j = 0; j < ogrPts.size(); j++)
- {
- ogrring.setPoint(j, ogrPts[j].getX(), ogrPts[j].getY(), ogrPts[j].getZ());
- }
- OGRPolygon polygon; // 多边形
- polygon.addRing(&ogrring);
- poFeature->SetGeometry(&polygon);
- // 创建字段
- poFeature->SetField("KJFWXXID", "7CF7F6D9-9210-4BC7-AFAD-F288F2357A99");
- poFeature->SetField("YSDM", "8008010240");
- poFeature->SetField("DZJGH", "/");
- poFeature->SetField("YDMJ", polygon.get_Area());
- poFeature->SetField("JTGCXMLX", "1");
- poFeature->SetField("DLDJ", "03");
- poFeature->SetField("DLCD", 0.0);
- poFeature->SetField("BZHDMKD", 0.0);
- poFeature->SetField("GDJTLX", "");
- poFeature->SetField("GDCD", 0.0);
- poFeature->SetField("KZXKD", 0.0);
- }
- else if (_tcscmp(szKword, _T("B")) == 0) // 管线工程
- {
- OGRLineString pLine; // 线
- int pNum = (int)ogrPts.size();
- pLine.setNumPoints(pNum);
- for (int j = 0; j < ogrPts.size(); j++)
- {
- pLine.setPoint(j, ogrPts[j].getX(), ogrPts[j].getY(), ogrPts[j].getZ());
- }
- poFeature->SetGeometry((OGRGeometry *)(&pLine));
- // 创建字段
- poFeature->SetField("KJFWXXID", "7CF7F6D9-9210-4BC7-AFAD-F288F2357A99");
- poFeature->SetField("YSDM", "8008010250");
- poFeature->SetField("DZJGH", "/");
- // GS 给水 PS 排水 TX 通信 DL 电力
- // RQ 燃气 GR 供热 XF 消防 QT 其他
- poFeature->SetField("SPGXLX", "GS");
- poFeature->SetField("GXFJ", "");
- poFeature->SetField("SPGXCD", 0.0);
- poFeature->SetField("JGGXCD", dMaxLength);
- poFeature->SetField("SPGXGJ", "");
- poFeature->SetField("JGGXGJ", "");
- }
- if (poLayer->CreateFeature(poFeature) != OGRERR_NONE)
- {
- acutPrintf(_T("\n在 shapefile 中创建特性失败!\n"));
- OGRFeature::DestroyFeature(poFeature);
- GDALClose(poDS);
- poDS = NULL;
- vertexPoint.clear();
- return;
- }
- // 资源清理
- OGRFeature::DestroyFeature(poFeature);
- }
- // 资源清理
- GDALClose(poDS);
- poDS = NULL;
- vertexPoint.clear();
- acutPrintf(_T("\n已输出shp文件格式!\n"));
- }
- }
- }
四 代码示例:读shp文件
 - // 打开文件对话框
- CFileDialog dlg(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST, TEXT("shp文件(*.shp)|*.shp||"), NULL);
- dlg.GetOFN().lpstrTitle = _T("读取shp数据文件");
- if (dlg.DoModal() == IDOK)
- {
- CString strPath = dlg.GetPathName();
- USES_CONVERSION; //需要这一步才能使用W2A
- const char* pszShapeFile = string(W2A(strPath)).c_str();
- GDALAllRegister();
- GDALDataset *poDS;
- CPLSetConfigOption("SHAPE_ENCODING", ""); //解决中文乱码问题
- // 读取shp文件
- poDS = (GDALDataset*)GDALOpenEx(pszShapeFile, GDAL_OF_VECTOR, NULL, NULL, NULL);
- if (poDS == NULL)
- {
- acutPrintf(_T("Open failed.\n%s"));
- return;
- }
- OGRLayer *poLayer;
- poLayer = poDS->GetLayer(0); // 读取层
- OGRFeature *poFeature;
- poLayer->ResetReading();
- int i = 0;
- while ((poFeature = poLayer->GetNextFeature()) != NULL)
- {
- if (poFeature->GetFieldAsDouble("AREA") < 1)
- continue; //去掉面积过小的 polygon
- i = i++;
- OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
- int iField;
- // 获得字段的数目,不包括前两个字段(FID,Shape);
- int n = poFDefn->GetFieldCount();
- for (iField = 0; iField < n; iField++)
- {
- // 输出每个字段的值
- acutPrintf(_T("%s\n"), poFeature->GetFieldAsString(iField));
- }
- OGRFeature::DestroyFeature(poFeature);
- }
- GDALClose(poDS);
- }
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
|