首页 / 浏览问题 / 云GIS / 问题详情
UTFGrid发送请求是x、y参数不正确
13EXP 2017年05月23日

添加了UTFGrid图层,在请求数据的时候发现请求参数中x、y不正确导致请求不到数据。不知道是不是图层的projection的原因。

1个回答

首先,这个x、y并不是x、y坐标,其次检查参数设置,图层名可以通过地图服务的layers资源查看;代码参考相关帖子,比如:

UTFGrid获取不到数据
UTFGrid回调函数传入参数.id .data没值

1,780EXP 2017年05月24日

您好,我参考了这两个帖子还是没能解决,可能我表达的有点问题,我重新详细描述一下我的问题吧。我是参考JavaScript API里面的UTFGrid图层希望实现鼠标悬停或鼠标单击某一地物显示属性信息。这里是我地图初始化的代码:

//地图初始化
function init() {

    map = new SuperMap.Map("map", {
        controls: [
            new SuperMap.Control.ScaleLine(), //比例尺控件。默认位置为地图左下角。
            new SuperMap.Control.Zoom(), //缩放类。 用于缩放地图。默认情况下垂直显示在地图左上角。
            new SuperMap.Control.LayerSwitcher(), //图层选择控件类。 用于控制地图中的图层可见性。
            new SuperMap.Control.MousePosition(), //该控件显示鼠标移动时,所在点的地理坐标。
            new SuperMap.Control.Navigation({
                dragPanOptions: {
                    enableKinetic: true //设置是否使用拖拽动画。默认为false,不使用动画。
                }
            }) //此控件处理伴随鼠标事件(拖拽,双击、鼠标滚轮缩放)的地图浏览, 如果创建地图时没有设置任何控件,此控件会默认添加到地图。
        ]
    });

    //创建分块动态REST图层,该图层显示iserver 8C 服务发布的地图,
    //其中"JianShuiNZ"为图层名称,url图层的服务地址,{transparent: true}设置到url的可选参数
    layer = new SuperMap.Layer.TiledDynamicRESTLayer("JianShuiNZ", url, {
        transparent: true
    }, {
        maxResolution: "auto",
        bufferImgCount: 0,
        projection: "EPSG:4326",
        maxExtent: new SuperMap.Bounds(-180, -90, 180, 90),
        units: "degrees"
    });

    layer.events.on({
        "layerInitialized": addLayer
    });

    uftGrid = new SuperMap.Layer.UTFGrid("UTFGridLayer", url, {
        layerName: "Layer_JY_Area",
        utfTileSize: 256, //瓦片的像素大小, 默认256像素的正方形。
        pixcell: 16, //瓦片中每个单元格的像素宽度, 默认为2,pixcell应该能够被瓦片宽与高整除,该属性与options属性中 utfgridResolution 属性对应。
        isUseCache: true //是否使用本地缓存策略。设置为false则不使用,默认使用。
    }, {
        utfgridResolution: 16, // 瓦片像素点个数与UTFGrid单行数据点个数的比 值。如果UTFGrid中的一个字符码对应表示4x4的像素块,则utfgridResolution 的值为4,默认值为2。
        projection: "EPSG:4326",
        maxExtent: layer.maxExtent,
        maxResolution: layer.maxResolution,
        units: "degrees",
        scales:layer.scales
    });
    map.addLayer(uftGrid); //

    utfControl = new SuperMap.Control.UTFGrid({
        layers: [uftGrid],
        callback: utfGridCallBack,
        handlerMode: 'click'
    })
    map.addControl(utfControl);

    div = document.getElementById("map");
    //初始化一个events。定义事件的监听器和自定义事件名称
    var events = new SuperMap.Events(div, div, ["userselect"]);
    //将事件对象保存到div对象上
    div.events = events;
    //监听自定义事件,注册处理函数,参数一指定事件类型,参数二指定事件处理对象,参数三定义处理函数
    div.events.register("userselect", div, userselectHandler)

    //将处理函数和调用对象绑定,函数最终调用里面的this对象即指向第二个参数指定的object对象
    var observeFun = SuperMap.Function.bindAsEventListener(clickHandler, div);
    SuperMap.Event.observe(div, "", observeFun);
}

在这里面添加了UTFGrid图层和UTFGridControl,回调函数是这样:

function utfGridCallBack(infoLookup, loc, pixel) {
    if (infoLookup) {
        //console.log(infoLookup);
        var info;
        for (var idx in infoLookup) {
            info = infoLookup[idx];
        }
        if (info && info.data) {
            console.log(info.data);
        } else {
            //document.getElementById("utfGridResult").innerHTML = "";
        }
    }
    //hideSelectFiledsDiv();
}

但是点击对应的图层的时候没有输出info.data,我检查了之后发现请求得到的data是空的。然后用浏览器访问地图服务,url到maps这一级,点地图名旁浏览于 JavaScript,右上角选择对应图层,那里的UTFGrid图层又是可以的。用浏览器调试工具查看请求发现是参数中的x、y不一样所以我的代码请求得到的data为空,不知道是哪里的原因。下面两个截图一个是我的代码发送的请求,一个是地图服务上面没有问题的时候的发送的请求。

前面的帖子说过注意异步加载问题,TiledDynamicRESTLayer是异步加载的,要初始化完成、添加到地图上后,它的某些属性才会被赋值,所以你的UTFGrid得到的maxExtent等属性应该都是undefined,maxResolution不需要设置,可选的是resolutions属性,需要填的情况是,叠加了多幅地图特别是第三方地图,比如天地图等时,计算的resolutions可能有误差,一个map不管多少个图层,都只有一组resolutions,需要保证所有图层都支持这一组resolutions,这意味着使用瓦片和固定比例尺地图叠加需要使用相同比例尺集等,这是后话了。
总之,先把maxExtent属性写对。
你好,请问你解决了吗,这个问题
...