本系列分爲兩部分第一部分,跑通基本技術路線,分析遇到的知識點。第二部分把讀取數據中遇到的坑展現出來。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調試