java - 如何使用 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();
}
}
解决方案
您能否提供您如何解析 protobuf 文件?
要解析 protobuf 文件,您需要知道它的架构:Java 中 PB 的通用解析
如果您提供FileDescriptorSet.parseFrom
以填充 a的字节FileDescriptorSet
是二进制 protobuf 内容(编译模式),这应该可以工作。
如果不是,这可能是这里的情况,您将需要一个运行时 .pbf 解析器。不幸的是,Java Protobuf 库无法直接加载 .pbf。
您可以通过使用带有该选项的protoc
命令行工具来获取已编译的架构。--descriptor_set_out
另请参见此处:协议缓冲区:如何在 Java 中解析 .proto 文件
推荐阅读
- jersey - 使用 Jersey 和 HK2 的 bindFactory 没有合适的方法
- python - 无法安装网状conda环境错误
- python - 我可以在带有超链接的文件中写一个 url 吗?
- powerbi - 基于度量的 power bi 中的条件格式行
- angular - ngx-translate-multi-http-loader :以下翻译文件出现问题
- mysql - MySQL 查询以收集比所选 ID 多 X 秒的唯一 ID
- javascript - 在 Java GraalVM 中访问复杂的 Javascript 对象
- reactjs - 如何使用成帧器运动对每个状态变化进行动画处理
- java - 打印从大到小和从小到大的数字列表
- nginx - 在nginx中查找错误页面的路径?