我們臨時會遇到一些測試數據,通常從數據庫中以 CSV 格式導出。最簡單實用的方法就是使用 ajax 去讀取文件,記得引入 jQuery 。
例如,在《ArcGIS JS API :新增一個熱力圖層的方法》中我們已經生成了名為“heatmapfeatureLayer_1”的圖層,這時我們有若干個包含坐標信息的 CSV 文件,想要使用這些數據生成熱力圖。
方法一
數據准備
我們假設拿到的 CSV 數據有名稱、經度、緯度和個數四個字段。
| 海洋生物保護協會 | 110.3406 | 20.07484 | 93 |
| 塞維陽光管理處 | 110.3426 | 20.06408 | 7 |
| 天潤工程檢測中心 | 110.3471 | 20.07359 | 35 |
| 白沙門社區居民委員會 | 110.33 | 20.07125 | 30 |
| 白沙社區居委會 | 110.3274 | 20.07546 | 89 |
| 紅島邊防派出所白沙門警務室 | 110.3318 | 20.07212 | 57 |
| 紅島邊防派出所 | 110.3341 | 20.07128 | 59 |
| 中共白沙門社區支部委員會 | 110.3297 | 20.07029 | 64 |
| 民生管道燃氣有限公司公用管道檢驗中心 | 110.3366 | 20.06883 | 42 |
定義函數
我們來寫一個函數實現,為了讓函數有更好的伸縮性,我們將 CSV 路徑與圖層名稱作為參數。函數如下:
function AddPoint2heatLayer(n,l){
eval(l).graphics=[];//這一步是先清空當前圖層的所有幾何要素
$.ajax({
url: n,
datatype: "json",
async: false,
data: {},
success: function(data) {
var dataStr = new String(data);
var lines = dataStr.split('\n');
var result = new Array();
for(var i=1, il=lines.length; i<il; i++){
var item = lines[i].split(',');
result[i-1] = {};
result[i-1].lng = Number(item[1]);// CSV 中第二列:經度
result[i-1].lat = Number(item[2]);// CSV 中第三列:緯度
result[i-1].num = item[3];// CSV 中第四列:數量
}
//csv 已轉為 json
//循環每個坐標對,並將其寫入圖層中
for (var i = 0; i < result.length; i++) {
var x = result[i].lng;
var y = result[i].lat;
var point = new esri.geometry.Point(x, y, new esri.SpatialReference({wkid: 4326}));
eval(l).add(new esri.Graphic(point));
eval(l).graphics[i].attributes = {};
eval(l).graphics[i].attributes.num = result[i].num;
}
}});
}
其中參數 n 為 CSV 路徑,例如:"test.csv",參數 l 為圖層名稱,例如“heatmapfeatureLayer_1”。
調用函數
當我們多次使用時,即可這樣調用:
AddPoint2heatLayer("net/heatmap.csv","heatmapfeatureLayer_1");
其實這么寫的原因是,后期很可能會使用多時段的數據來做動態熱力圖,讀取數據也會直接通過后台接口來實現,屆時只需要修改函數中數據封裝的部分即可。
方法二
引入類
在 require 中引入:
"esri/layers/CSVLayer", "esri/renderers/SimpleRenderer", "esri/symbols/SimpleMarkerSymbol", "esri/Color",
在 function 中加入相應的:
CSVLayer, SimpleRenderer, SimpleMarkerSymbol, Color
調用函數
var csv = new esri.layers.CSVLayer("test.csv");
var orangeRed = new esri.Color([0, 255, 100, 0.8]);
var marker = new esri.symbol.SimpleMarkerSymbol("solid", 12, null, orangeRed);
var renderer = new esri.renderer.SimpleRenderer(marker);
csv.setRenderer(renderer);
map.addLayer(csv);
