小飞侠638 2024-07-13 16:15 采纳率: 0%
浏览 2

Arcgis中的shp矢量文件解码问题

我在使用C++编写解码shp文件的时候,前面的数据都能正常读取,但到了最后一份数据就出错
使用的解码规则是官方给的,几何类型是13,不带M属性的


bool SHP::readLineZData(ifstream &file, SHPLineZ &line_z)
{
    ofstream fout("./out.txt");
    file.seekg(100, ios::beg);
    while (!file.eof())
    {
        file.read((char *)&line_z.index, sizeof(int));
        line_z.index = bigtolitter(line_z.index);
        file.read((char *)&line_z.length, sizeof(int));
        line_z.length = bigtolitter(line_z.length);
        file.read((char *)&line_z.Geo_Type, sizeof(int));
        file.read((char *)&line_z.Xmin, sizeof(double));
        file.read((char *)&line_z.Ymin, sizeof(double));
        file.read((char *)&line_z.Xmax, sizeof(double));
        file.read((char *)&line_z.Ymax, sizeof(double));
        file.read((char *)&line_z.NL, sizeof(int));
        file.read((char *)&line_z.NP, sizeof(int));
        fout << line_z.index << '\t'
             << line_z.length << '\t'
             << line_z.Geo_Type << '\t'
             << line_z.Xmin << '\t'
             << line_z.Ymin << '\t'
             << line_z.Xmax << '\t'
             << line_z.Ymax << '\t'
             << line_z.NL << '\t'
             << line_z.NP << '\n';
        line_z.Parts = new int[line_z.NL];
        for (auto i = 0; i < line_z.NL; ++i)
        {
            file.read((char *)&line_z.Parts[i], sizeof(int));
            fout << line_z.Parts[i] << '\t';
        }
        fout << '\n';
        line_z.PointsXY = new Point[line_z.NP];
        for (auto i = 0; i < line_z.NP; ++i)
        {
            file.read((char *)&line_z.PointsXY[i].x, sizeof(double));
            file.read((char *)&line_z.PointsXY[i].y, sizeof(double));
            fout << line_z.PointsXY[i].x << '\t'
                 << line_z.PointsXY[i].y << '\n';
        }
        file.read((char *)&line_z.Zmin, sizeof(double));
        file.read((char *)&line_z.Zmax, sizeof(double));
        fout << line_z.Zmin << '\t'
             << line_z.Zmax << '\n';
        line_z.PointsZ = new double[line_z.NP];
        for (auto i = 0; i < line_z.NP; ++i)
        {
            file.read((char *)&line_z.PointsZ[i], sizeof(double));
            fout << line_z.PointsZ[i] << '\n';
        }
        delete[] line_z.Parts;
        delete[] line_z.PointsXY;
    }
    line_z.Parts = nullptr;
    line_z.PointsXY = nullptr;
    fout.close();
}

img


就会出现这样的读取结果,之前的单一的折线类型的读取也出现了这样的结果

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-07-13 16:21
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您好!看起来您在使用 C++ 解码 ArcGIS 的 SHP 矢量文件时遇到了一些困难。根据您提供的代码和问题描述,我注意到几个可能的问题点和一些建议:

    1. 文件读取结束条件:您的代码中使用了 while (!file.eof()) 作为循环条件,但这种方法可能不是最可靠的,因为 eof() 只有在尝试读取过文件末尾之后才会返回 true。您可能需要一个更明确的结束条件,比如根据文件的总长度或者记录数来控制循环。

    2. 内存分配:在您的代码中,为 line_z.Partsline_z.PointsXY 分配了内存,但在循环结束后,您释放了这些内存。如果文件中有多条线,这可能会导致问题。确保每次读取新记录前都重新分配内存,并在读取结束后释放。

    3. 错误处理:您的代码中没有错误处理逻辑。如果读取操作失败,比如 file.read() 返回值小于请求读取的字节数,您应该添加错误处理逻辑来处理这种情况。

    4. 大端小端问题:您使用了 bigtolithter 函数来处理大端小端的问题,确保这个函数正确实现了大小端转换。

    5. 文件指针管理:在每次读取完一条线后,您需要适当地移动文件指针到下一条记录的开始位置。这可以通过设置文件指针偏移量来实现。

    6. 调试输出:您已经将读取的数据写入到 out.txt 文件中,这是一个很好的调试手段。您可以检查这个文件来确定数据是否按预期读取。

    7. 代码逻辑:您的代码中的逻辑似乎是在读取完所有数据后才返回,这可能不是处理 SHP 文件的高效方式。通常,我们希望逐条记录地处理数据。

    8. 文件格式理解:确保您完全理解 SHP 文件的格式,特别是对于几何类型 13 的记录格式。这有助于您在解码时避免错误。

    如果需要进一步的帮助,您可以提供更多的错误信息或者具体的问题描述。同时,我可以为您提供一些在线资源,以便您能够更深入地了解 SHP 文件格式和解码技术:

    希望这些建议能够帮助您解决问题。如果您有其他问题或者需要更具体的帮助,请随时告诉我!

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月13日

悬赏问题

  • ¥15 crossover21 ARM64版本安装软件问题
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?
  • ¥15 QQ邮箱过期怎么恢复?
  • ¥15 登录他人的vue项目显示服务器错误
  • ¥15 (标签-android|关键词-app)