首页 / 浏览问题 / 云GIS / 问题详情
processCompleted函数
11EXP 2017年04月25日

从数据库中获取到4组数据,每组数据包括了四个参数:lng,lat,GpsStatus,Time,分别将每组数据带入函数addFeature中,addFeature函数的作用是判断点是否在警戒区域内,并用不同的颜色表示,在地图上在相应位置添加点。现在遇到的问题是:在函数processCompleted()内部,能够实现4组点是否在警戒区域的判断,但是传入的pointVector点只是最后一个点,相当于地图上只有最后一个点,4次判断的结果依次在这一个点上展现。

而且在项目中,需要实时展现所有点的位置和判断其是否在警戒区域内,如果一个点一个点来实现的话,可能会造成延迟。如果采用闭包,我一直没搞明白怎么来实现。

具体代码如下:烦请高手帮忙解决一下!

xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
	    data=xmlhttp.responseText;//后台传回的数据
//console.log(data);

        cc=data.split(";"); //把后台传回的数据以分号分割开,每组数据分别放入数组
        //console.log(cc);
	    var n=cc.length-1;//获取后台传回几组数据,
        for (i=0;i<cc.length-1;i++)
            {
		       detail=cc[i].split(",");//将每组数据分别存储在数组detail中
		   
		       denumber = detail[0];
		       lng = detail[1];
		       lat = detail[2];
			   GpsStatus=detail[3];
			   Time = detail[4];
		       
               

		       addFeature(lng,lat,GpsStatus,Time);//调用画点函数
            }
	

    }
  }
function addFeature(lng,lat,GpsStatus,Time){
     point = new SuperMap.Geometry.Point(lng,lat);
     pointVector = new SuperMap.Feature.Vector(point);
	 pointVector.time=Time;
    var queryParam, queryByGeometryParameters, queryService;
	queryParam = new SuperMap.REST.FilterParameter({name: "Landuse@XuChangStationMapSix"});//查询数据集名称或者图层名称,图层名称格式:数据集名称@数据源别名
    
	queryByGeometryParameters = new SuperMap.REST.QueryByGeometryParameters({//Geometry查询参数类。 该类用于设置 Geometry查询的相关参数。
                                 queryParams: [queryParam],//查询过滤条件参数数组。
                                 geometry: point,//用于查询的几何对象。
                                 spatialQueryMode: SuperMap.REST.SpatialQueryMode.INTERSECT//空间查询模式。INTERSECT相交。
                                                                           });
																		    
    queryService = new SuperMap.REST.QueryByGeometryService(url, {//Geometry 查询服务类.Geometry 查询服务类构造函数。url,服务的访问地址。
                       eventListeners: {//需要被注册的监听器对象。 
                                        "processCompleted": processCompleted,
                                        "processFailed": processFailed
                                        }
																				
                                                                 }); 	
															 
    queryService.processAsync(queryByGeometryParameters);}


function processCompleted(queryEventArgs) { //console.log(point);
         var i, result = queryEventArgs.result;
                                              //console.log(queryEventArgs.result.recordsets.length);
         if (result && result.recordsets) {
               for (i=0, recordsets=result.recordsets, len=recordsets.length; i<len; i++) { 
														 console.log(i);console.log(len);console.log(queryEventArgs.result.recordsets[i].features.length);
              if (recordsets[i].features.length>0) //如果点在警戒区域内,将点设为红色,否则为蓝色
                   pointVector.style = {fillColor: "red",strokeColor: "yellow",pointRadius:6};
			  else
				   pointVector.style = {fillColor: "blue",strokeColor: "yellow",pointRadius:6};
												               	  vectorLayer.addFeatures(pointVector);
                                                                                                                                     }
																			                 
																							 
																																	 
											                                    } 
																				
                                            }

1个回答

分析下代码执行过程,最简单的处理办法是,监听时用匿名函数调用完成、失败方法,即

    queryService = new SuperMap.REST.QueryByGeometryService(url, {
                       eventListeners: { 
                                        "processCompleted": function(e){processCompleted(e);},
                                        "processFailed": function(e){processFailed(e);}
                                        }
																				
                   }); 

回调方法当然是异步的。

1,780EXP 2017年04月25日
...