如何讀取Shapefile(第一部分)

讀取Shapefile第一部分

本系列分爲兩部分第一部分,跑通基本技術路線,分析遇到的知識點。第二部分把讀取數據中遇到的坑展現出來。javascript

1 知識點

我選擇用node.js 讀取shapefile文件,工做量分爲兩部分:1 如何讀取二進制文件 2 具體二進制格式解析。html

1.1 ArrayBuffer

ArrayBuffer用來表示通用的、固定長度的原始二進制數據緩衝區,必須經過TypedArray或者DataView來訪問。java

1.2 TypedArray

TypedArray是一個類型化數組用來讀取二進制對象,它能夠說是視圖(view)。它自己不支持構造器,是經過他的一系列子集來生成對象的。例如:Uint8Array
node

1.3 Node.js Buffer

Buffer 被用來表達讀取的二進制對象。它是 Uint8Array 的子集。這裏要注意他的每一位是8個字節(bit)。
自己Buffer就是Uint8Array的實例,Uint8Array也是TypedArray的實例,所以TypedArray能夠在node.js中使用,可是它和Buffer有幾個區別。api

  • TypedArray#slice() 建立了一個TypedArray的拷貝,Buffer#slice() 沒有拷貝而是建立了視圖。
  • TypedArray#subarray()可用於實現 Buffer#slice()在Buffers和其餘TypedArrays上的行爲(僅在舊版的兼容性,可能會產生意外)。
  • buf.toString() 與它在 TypedArray 上的等價物並不兼容
  • 部分方法,例如 buf.indexOf(),支持額外的參數。

1.4 DataView

也是讀取二進制數據的一種展現視圖,不過它存在支持字節序的方法,初始化相對麻煩。數組

1.5 SHP 如何讀取

shapefile 經過ESRI的白皮書讀取,裏面描述了相關格式。測試

1.6 字節序問題

developer.mozilla.org/zh-CN/docs/…
字節序也就是數據的存儲順序,具體參見MDN連接,shapefile文件大小字節序都有,這一點要注意。ui

1.7 Buffer和TypedArray 如何互轉

1 Buffer to TypedArray

const buf = Buffer.from('hello', 'utf16le');
const uint16arr = new Uint16Array(
  buf.buffer, buf.byteOffset, buf.length / Uint16Array.BYTES_PER_ELEMENT);

複製代碼

2 TypedArray to buffer

const arr = new Uint16Array(20);
const buf = Buffer.from(arr.buffer, 0, 16);
console.log(buf.length); //16

複製代碼

2 小實驗

圖片.png

經過圖片能夠看到第一位是大字節序,前四位,
咱們使用以下代碼測試

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

圖片.png

參考連接:
1 node.js #buffer
2 MDN Endianness
3 MDN ArrayBuffer 4 MDN TypedArray
5 MDN DataView調試

相關文章
相關標籤/搜索