本系列分为两部分第一部分,跑通基本技术路线,分析遇到的知识点。第二部分把读取数据中遇到的坑展现出来。javascript
我选择用node.js 读取shapefile文件,工做量分为两部分:1 如何读取二进制文件 2 具体二进制格式解析。html
ArrayBuffer用来表示通用的、固定长度的原始二进制数据缓冲区,必须经过TypedArray或者DataView来访问。java
TypedArray是一个类型化数组用来读取二进制对象,它能够说是视图(view)。它自己不支持构造器,是经过他的一系列子集来生成对象的。例如:Uint8Array 。
node
Buffer 被用来表达读取的二进制对象。它是 Uint8Array 的子集。这里要注意他的每一位是8个字节(bit)。
自己Buffer就是Uint8Array的实例,Uint8Array也是TypedArray的实例,所以TypedArray能够在node.js中使用,可是它和Buffer有几个区别。api
也是读取二进制数据的一种展现视图,不过它存在支持字节序的方法,初始化相对麻烦。数组
shapefile 经过ESRI的白皮书读取,里面描述了相关格式。测试
developer.mozilla.org/zh-CN/docs/…
字节序也就是数据的存储顺序,具体参见MDN连接,shapefile文件大小字节序都有,这一点要注意。ui
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 符合预期
复制代码
以下图所示,代码调试成功。spa
参考连接:
1 node.js #buffer
2 MDN Endianness
3 MDN ArrayBuffer 4 MDN TypedArray
5 MDN DataView调试