I3S数据发布服务后,属性数据的查询其实非常麻烦的,而且特别的不友好。所以本文至少抛转引玉。
第一步:尝试获得属性的地址,
由于I3S是以树的结构来存储的,所以叶子节点的数据是最全的。要获得哪些节点是叶子节点,可以通过变量的方式来获得;
1)首先通过ajax获得根节点的数据:根目录地址是http://myService/Host/MyLayer/SceneServer/layers/0/nodes/root?f=json
2) 在获得这个数据的JSON后,可以看到Children是包含了子节点的数据。如果children有那么就继续遍历。直到children为空。
3) 这里需要注意的是,由于遍历是很深的,有时候达到上万,需要写一个小小的堆栈,获得要遍历的树节点的地址,然后出栈来进行遍历。
第二步:完成第一步后就可以获得叶子节点的地址啦。比如叶子节点的地址http://myService/Host/MyLayer/SceneServer/layers/0/nodes/77-0-0-1-2?f=json
那么这个叶子节点的属性地址是
http://myService/Host/MyLayer/SceneServer/layers/0/nodes/77-0-0-1-2/attributes/f_0
1) 其中的尾号f_0是第0个字段,f_1是第1个字段,这个图层有多少字段,就有多少f_x。
2)叶子节点存储的属性数据是一个片的数据,也就是一个tile的数据,所以是可变的,具体数量看第三步
3)I3S对每个属性数据单独放置一个文件,以tile进行切割。所以读取一个对象的数据,需要请求N次。
第三步:读取root节点下对字段信息的描述。
地址是http://myService/Host/MyLayer/SceneServer/layers?f=json
在这个JSON下有一个attributeStorageInfo,里面解释了每个字段的描述信息
其中header表示属性数据存储的头部信息。
可以看到里面包含了UInt32之类的东西,说明属性数据是利用二进制的方式来写的,并且跟文件一样,包含了头部,其中头部是说明内容。
第四步:利用XMLHttpRequest来读取数据
1)设置responseType='blob'
2) 读取完成后会得到一个二进制串(blob)。
3)创建一个FileReader; var fr=new FileReader();fr.readAsArrayBuffer(response);
file.οnlοad=function(){ var n=new UInt32Array(file.result.slice(0,4) }
4) 完成。