本系列分为两部分第一部分,跑通基本技术路线,分析遇到的知识点。第二部分把读取数据中遇到的坑展示出来。
我选择用node.js 读取shapefile文件,工作量分为两部分:1 如何读取二进制文件 2 具体二进制格式解析。
ArrayBuffer 用来表示通用的、固定长度的原始二进制数据缓冲区,必须通过TypedArray或者DataView来访问。
TypedArray是一个类型化数组用来读取二进制对象,它可以说是视图(view)。它本身不支持构造器,是通过他的一系列子集来生成对象的。例如: Uint8Array 。
Buffer 被用来表达读取的二进制对象。它是 Uint8Array 的子集。这里要注意他的每一位是8个字节(bit)。
本身Buffer就是Uint8Array的实例,Uint8Array也是TypedArray的实例,因此TypedArray可以在node.js中使用,但是它和Buffer有几个区别。
shapefile 通过 ESRI的白皮书 读取,里面描述了相关格式。
developer.mozilla.org/zh-CN/docs/…
字节序也就是数据的存储顺序,具体参见MDN链接,shapefile文件大小字节序都有,这一点要注意。
const buf = Buffer.from('hello', 'utf16le'); const uint16arr = new Uint16Array( buf.buffer, buf.byteOffset, buf.length / Uint16Array.BYTES_PER_ELEMENT); 复制代码
const arr = new Uint16Array(20); const buf = Buffer.from(arr.buffer, 0, 16); console.log(buf.length); //16 复制代码
通过图片可以看到第一位是大字节序,前四位,
我们使用如下代码测试
const fs = require("fs") const buffer = fs.readFileSync('./data/宝鸡数据/宝鸡数据.shp'); const a = buffer.readUIntBE(0,4);// readUIntBE 参数1 从第几位开始 参数2 读取几字节 console.log("a",a) // a = 9994 符合预期 复制代码
如下图所示,代码调试成功。
参考链接:
我来评几句
登录后评论已发表评论数()