首页 > 解决方案 > 如何使用 Java 下载 Mapbox PBF 文件?

问题描述

我想使用 Java 从网上下载和解析 Mapbox PBF 文件。如果我手动下载文件,我可以解析它而不会出现任何错误。但是,如果我使用 Java 代码下载文件,然后尝试解析下载的文件,则会收到以下异常:

Exception in thread "main"
com.google.protobuf.InvalidProtocolBufferException$InvalidWireTypeException: Protocol message tag had invalid wire type.
at com.google.protobuf.InvalidProtocolBufferException.invalidWireType(InvalidProtocolBufferException.java:111)

通过谷歌搜索此错误,有人说该文件已损坏。

尝试以编程方式将这种二进制数据写入文件时,我是否遗漏了什么?

这是一些代码,显示了我尝试下载文件的两种方式:

技术1

fileURL = "https://api.mapbox.com/v4/mapbox.mapbox-traffic-v1/17/36159/54906.vector.pbf?style=mapbox://styles/fnembhard/ck9inh9df002c1jpnccjg20pw@00&access_token=..."

public void saveFile1(String fileURL, String fileName){
    try{
        URL testURL = new URL(fileURL);
        if(testURL.getHost() != null) {
            InputStream in = new URL(fileURL).openStream();
            Files.copy(in, Paths.get(fileName), StandardCopyOption.REPLACE_EXISTING);
        }
    }
    catch(Exception e){
    e.printStackTrace();
    }
}

技巧2

public void saveFile2(String fileURL, String fileName){
    try {
        URL testURL = new URL(fileURL);
        if (testURL.getHost() != null) {
            InputStream in = new URL(fileURL).openStream();
//                File f = new URL(fileURL).getFile();
            OutputStream outputStream = new FileOutputStream(fileName);
            int byteRead;
            while ((byteRead = in.read()) != -1) {
                outputStream.write(byteRead);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

标签: javafilemapboxbinaryfilesosm.pbf

解决方案


您能否提供您如何解析 protobuf 文件?

要解析 protobuf 文件,您需要知道它的架构:Java 中 PB 的通用解析

如果您提供FileDescriptorSet.parseFrom以填充 a的字节FileDescriptorSet是二进制 protobuf 内容(编译模式),这应该可以工作。

如果不是,这可能是这里的情况,您将需要一个运行时 .pbf 解析器。不幸的是,Java Protobuf 库无法直接加载 .pbf。

您可以通过使用带有该选项的protoc命令行工具来获取已编译的架构。--descriptor_set_out

另请参见此处:协议缓冲区:如何在 Java 中解析 .proto 文件


推荐阅读