Как скачать PBF-файл Mapbox, используя Java? - PullRequest
0 голосов
/ 08 мая 2020

Я хотел бы загрузить и проанализировать PBF-файл Mapbox из Интернета, используя Java. Если я загружу файл вручную, я смогу проанализировать его без ошибок. Однако, если я использую код 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)

При поиске в Google этой ошибки некоторые люди говорят, что файл коррумпирован.

Что-то мне не хватает при попытке записать такие двоичные данные в файл программно?

Вот код, показывающий два способа загрузки файла:

Метод 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();
    }
}

1 Ответ

0 голосов
/ 11 мая 2020

Не могли бы вы рассказать, как вы разбираете файл protobuf?

Чтобы разобрать файл protobuf, вам необходимо знать его схему: Generi c Разбор PB в java

Если байты, которые вы предоставляете FileDescriptorSet.parseFrom для заполнения FileDescriptorSet, являются двоичным содержимым protobuf (скомпилированной схемой), это должно работать.

Если нет, что, вероятно, и имеет место здесь, вам понадобится парсер времени выполнения .pbf. К сожалению, библиотека Java Protobuf не имеет возможности напрямую загрузить .pbf.

Вы можете получить скомпилированную схему, используя инструмент командной строки protoc с параметром --descriptor_set_out.

См. Также здесь: Буферы протокола: как разобрать файл .proto в Java

...