自己构建Ajax请求进行模拟QueryTask进行查询

36 篇文章 1 订阅

ArcGIS JS API中用Query和QueryTask进行查询的时候其实是进行的Ajax请求,只不过是将该Ajax请求进行了封装,更好的方便二次开发人员调用而已。有时候我们用QueryTask进行查询的时候,传的参数的数据可能比较大,比如query.geometry经过序列化后超过了2KB,那么就需要执行post请求,这样就会造成ajax的跨域访问问题。一般的解决办法是使用ArcGIS所提供的代理文件proxy.jsp、proxy.ashx、proxy.php,使用的时候配置如下esri.config.defaults.io.proxyUrl = "http://samedomain:sameport/proxy/proxy.jsp",这样在用各种Task进行ajax请求的时候,如果数据量超过2KB,就会自动使用代理,但是使用的前提是要将你进行查询的地图服务的url写到proxy.jsp的serverUrls中(目的是为了进行检验要进行查询的服务是否能够使用代理),由于某些原因,我在使用的过程中不能将要查询的服务地址放到代理文件中,这样就不能使用代理了。

如果不能使用代理,还可以通过jsonp的接口实现跨域访问,首先我要获取QueryTask在执行execute方法时所发送的数据信息,通过Chrome Developer Tools中的NetWork一项可以查看详细信息,如下图所示:



上图中的红色线框内的数据表示的就是所传递的数据,通过dojo.io.script可以用script标签的形式访问JSONP接口,将需要进行查询的参数信息手动进行设置,代码如下:

var xhrArgs = {
                url:queryUrl+"/query",
                handleAs:"json",
                callbackParamName:"callback",
                content:{
                    f:"json",
                    where:"",
                    returnGeometry:false,
                    spatialRel:"esriSpatialRelIntersects",
                    geometry:dojo.toJson(bufferGeometry.toJson()),
                    geometryType:"esriGeometryPolygon",
                    inSR:102100,
                    outFields:"乡镇名称,乡镇人口",
                    outSR:102100
                }
            };

            //用dojo.io.script使用JSONP构建ajax请求
            var def = dojo.io.script.get(xhrArgs);

            def.then(dojo.hitch(this,function(featureSet){
                    alert("查询完成!");
                }
            }),dojo.hitch(this,function(error){
                    alert("查询完成!")
            }));

需要注意的是,使用服务端在封装JSONP接口的时候,会使用不同的识别回调函数的名称,Esri使用的名称是callback,所以在前端需要协商callbackParamName为callback,这样在ArcGIS的Server端才会正确调用客户端的回调函数。以上就是用原生的Dojo模拟ArcGIS JS API中QueryTask的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值