【问题标题】:How to download Mapbox PBF file using Java?如何使用 Java 下载 Mapbox PBF 文件?
【发布时间】:2020-08-24 02:45:25
【问题描述】:

我想使用 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();
    }
}

【问题讨论】:

    标签: java file mapbox binaryfiles osm.pbf


    【解决方案1】:

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

    要解析 protobuf 文件,您需要知道其架构:Generic Parsing of PB in java

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

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

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

    另见此处:Protocol Buffers: How to parse a .proto file in Java

    【讨论】:

    • 我正在使用 ElectronicChartCentre 库:github.com/ElectronicChartCentre/java-vector-tile。 InputStream inputStream = new FileInputStream(fileName); VectorTileDecoder d = new VectorTileDecoder(); VectorTileDecoder.FeatureIterable features = d.decode(inputStream.readAllBytes()); 我不认为这是解析问题。我认为这是我下载文件的方式。如果我手动下载文件,我可以解析它而不会出现任何错误。当我将手动下载文件的内容与使用 Java 代码下载的文件进行比较时,两者都不同
    猜你喜欢
    • 2020-03-08
    • 2013-08-14
    • 2020-12-11
    • 2020-07-02
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    相关资源
    最近更新 更多