javascript的 热点图怎么写

 在gis中,你如果用js来写热点图 不借助后台怎么搞,as的话比较容易有相应的类库甚至官方都有。而且用js不借助arcgis发布rest服务,(注:热点图可以借助服务的形式发布,arcgis for javascript有相应的api支持的),这个时候就比较麻烦了,首先说明下热点图是啥

热点图是以点的形式展示,通过补全周边变化颜色也会相应的调整渐变,类似于足球某个人的运动范围那种,我找了下有个heapmap可以实现heapmap.js和heapmap-arcgis.js

  因为arcigs for javascript api 是以dojo为基础写的,所以加载类库方式以下

 1   <script type="text/javascript">
 2         var djConfig = {
 3             parseOnLoad: true
 4 
 5 
 6         };
 7     </script>
 8 
 9     <script src="jslibary/heatmap.js"></script>
10     <script src="jslibary/heatmap-arcgis.js"></script>

  写了工具类去使用这个类库

  1 /**
  2  * Created by haibalai on 2015/9/23.
  3  * 管理热点图展示 关闭 这里默认以社区为单位 url可改 热点图需要在主页面加上热点 div层 类似map的div
  4  * 这个版本先以一个xml来展示 以后改为json的格式
  5  */
  6 var HeatLayerManager = function()
  7 {
  8     var map;
  9 
 10     var heatLayer;
 11 
 12     var graphicLayer;
 13 
 14     var polygonTemp;
 15 
 16     var queryVo= new QueryVO();
 17 
 18     var ajaxTool;
 19 
 20     var locateParameter = new LocateParameter();
 21 
 22     var symbolTool;
 23 
 24     var isMouseInfo = true;
 25 
 26     //查询社区的url来覆盖 人口信息
 27     var paramBackFun;
 28     function renderQuery(queryVo1,polygon,roundFlag,paramBackFun1)
 29     {
 30         paramBackFun = paramBackFun1;
 31         var layerName = queryVo1.layerName;
 32         graphicLayer.clear();
 33         var url = locateParameter.getUrl(layerName);
 34         if(url != "")
 35         {
 36             var querytask = new esri.tasks.QueryTask(url);
 37             var query = new esri.tasks.Query();
 38 
 39             if(layerName != "shi")
 40             {
 41                 query.geometry = polygon;
 42             }
 43             else
 44             {
 45                 query.where = "FID >= 0"
 46             }
 47             query.returnGeometry = true;
 48             query.outSpatialReference = map.spatialReference;
 49             if(roundFlag == "false")
 50             {
 51                 query.spatialRelationship = esri.tasks.Query.SPATIAL_REL_CONTAINS;
 52             }
 53             query.outFields = ["*"];
 54             querytask.execute(query, handle);
 55         }
 56     }
 57 
 58 
 59 
 60     function handle(idResults)
 61     {
 62         graphicLayer.clear();
 63 
 64         var param = new Object();
 65         param.codearr = [];
 66         for (var i = 0, il = idResults.features.length; i < il; i++)
 67         {
 68             var idResult = idResults.features[i];
 69 
 70             var polygon = idResult.geometry;
 71 
 72             var gra = new esri.Graphic(polygon);
 73 
 74             var attributes = idResult.attributes;
 75 
 76             param.codearr[i] = attributes[locateParameter.getCodeName(queryVo.layerName)];
 77 
 78             var graattribute = new Object();
 79             graattribute["code"]  = attributes[locateParameter.getCodeName(queryVo.layerName)];
 80             gra.setAttributes(graattribute);
 81             gra.setSymbol(symbolTool.getSymbol("heat"));
 82             graphicLayer.add(gra);
 83         }
 84         paramBackFun(param);
 85 
 86     }
 87 
 88     //查询java后台 组织json参数
 89     function ajaxQuery(param)
 90     {
 91         param.startDate = queryVo.startDate;
 92         param.endDate = queryVo.endDate;
 93         param.layerName = queryVo.layerName;
 94         param.tjfs = queryVo.tjfs;
 95         var str =   JSON.stringify(param);
 96 
 97         //alert("ajaxQuery-param: "+str);
 98         //--------------------------------------测试环境用
 99         ajaxTool.getLiuDongData1(str,ajaxBack);
100         //-------------------------------------
101 
102 
103         //--------------------------------------真实环境用
104        // ajaxTool.getLiuDongData(str,ajaxBack);
105         //-------------------------------------
106     }
107 
108     function ajaxBack(obj,num1)
109     {
110         //组装 map对象便于遍历graphic
111         if('2'==queryVo.tjfs){
112             alert("时间段");
113             var arr = obj.codearr;
114 
115         }else{
116             var arr = obj.codearr;
117             var mapobj = new Object();
118             for(var i = 0, l = arr.length; i < l; i++)
119             {
120                 var arrobj = arr[i];
121                 mapobj[arrobj.CODE] = arrobj;
122                 //alert("ajaxBack: "+arrobj.CODE);
123             }
124 
125             //--------------------------------------真实环境用
126             //var graarr = graphicLayer.graphics;
127             //var dataarr = [];
128             //for(var j = 0, m = graarr.length; j < m; j++)
129             //{
130             //    var gra = graarr[j];
131             //    var codeValue = gra.attributes["code"];
132             //    // 暂时码值转换
133             //    var codeobj;
134             //    if("shi"==queryVo.layerName){
135             //        //alert(changeAreaCode(codeValue));
136             //        codeobj = mapobj[changeAreaCode(codeValue)];
137             //    }else{
138             //        codeobj = mapobj[codeValue];
139             //    }
140             //    //alert("codeValue: "+codeValue);
141             //    if(codeobj!=null){
142             //        var pcount = codeobj.PCOUNT;
143             //        var point  = gra.geometry.getCentroid();
144             //        var feobj = {
145             //            attributes: {count:Number(pcount)},
146             //            geometry: {
147             //                spatialReference: map.spatialReference,
148             //                type: "point",
149             //                x: point.x,
150             //                y: point.y
151             //
152             //            }
153             //        }
154             //        dataarr.push(feobj);
155             //    }
156             //    gra.attributes["codeVaue"] = codeobj;
157             //}
158             //-------------------------------------
159 
160             //--------------------------------------测试环境用
161                     var graarr = graphicLayer.graphics;
162                     var dataarr = [];
163                     var pcountnum = 0.1;
164                     for(var j = 0, m = graarr.length; j < m; j++)
165                     {
166                         var gra = graarr[j];
167                         var codeValue = gra.attributes["code"];
168                         var codeobj = mapobj["440304008001"];
169                         var pcount = pcountnum;
170                         var point  = gra.geometry.getCentroid();
171                         var feobj = {
172                             attributes: {count:Number(pcount)},
173                             geometry: {
174                                 spatialReference: map.spatialReference,
175                                 type: "point",
176                                 x: point.x,
177                                 y: point.y
178 
179                             }
180 
181                         }
182                         if(num1 == undefined)
183                         {
184                             num1 = 0.01
185                         }
186                         pcountnum = pcountnum + num1;
187                         dataarr.push(feobj);
188 
189                         gra.attributes["codeVaue"] = codeobj;
190                     }
191             //-------------------------------------
192 
193             heatLayer.setData(dataarr);
194         }
195     }
196 
197     /**
198      * 外界返回鼠标移动查询填充图层
199      * @returns {*}
200      */
201     this.getHeatLocateLayer = function()
202     {
203         return graphicLayer;
204     }
205 
206     /**
207      * 外界返回热点图层
208      * @returns {*}
209      */
210     this.getHeatlayer = function()
211     {
212         return heatLayer;
213     }
214 
215 
216     /**
217      * 初始化热点图
218      * @param healayerdiv 主页heatlayer div的id
219      * @param map1
220      */
221     this.init = function initHeatLayer(healayerdiv,map1)
222     {
223         map = map1;
224         heatLayer = new HeatmapLayer({
225             config: {
226                 "useLocalMaximum": true,
227                 "radius": 40,
228                 "gradient": {
229                     0.45: "rgb(000,000,255)",
230                     0.55: "rgb(000,255,255)",
231                     0.65: "rgb(000,255,000)",
232                     0.95: "rgb(255,255,000)",
233                     1.00: "rgb(255,000,000)"
234                 }
235             },
236             "map": map,
237             "domNodeId": healayerdiv,
238             "opacity": 0.85
239         });
240 
241 
242         graphicLayer = new esri.layers.GraphicsLayer();
243         map.addLayer(heatLayer);
244         map.addLayer(graphicLayer);
245 
246         ajaxTool = new AjaxTool();
247         symbolTool = new SymbolTool();
248 
249         // map.resize();
250 
251     }
252 
253     this.ajaxBackFun= function(obj,num1)
254     {
255         ajaxBack(obj,num1);
256     }
257 
258     /**
259      * 根据查询数据渲染热点图
260      * 现在可能是固定死的xml,下次 转json 可能要有参数 以后定
261      */
262     this.addRender = function(queryVo1,polygon)
263     {
264         addRenderFun(queryVo1,polygon,ajaxQuery)
265 
266     }
267 
268     //简化方法类 增加回调
269     function addRenderFun(queryVo1,polygon,paramBackFun1)
270     {
271         polygonTemp = polygon;
272         queryVo = queryVo1;
273 
274         renderQuery(queryVo,polygon,"false",paramBackFun1);
275     }
276 
277     /**
278      *
279      * @param queryVo1
280      * @param polygon
281      * @param paramBackFun1
282      */
283 
284     this.addRenderCallBack = function(queryVo1,polygon,paramBackFun1)
285     {
286         addRenderFun(queryVo1, polygon, paramBackFun1);
287     }
288 
289 
290     /**
291      * 清除热点图的数据
292      */
293     this.clearHeatLayer = function()
294     {
295         heatLayer.clearData();
296     }
297 
298     function changeAreaCode(code){
299         var resuCode="";
300         var areaCode = ["440305","440326","440306","440309","440308",
301             "440304","440303","440327","440317","440307"];
302         var mapCode = ["440305002","440306007","440306001","440306012","440308001",
303             "440304003","440303005","440307012","440307009","440307006"];
304         for(i=0;i<areaCode.length;i++){
305             if(code==mapCode[i]){
306                 resuCode = areaCode[i];
307                 break;
308             }
309         }
310         return resuCode;
311     }
312 
313 }
原文地址:https://www.cnblogs.com/haibalai/p/5030832.html