首页 / 浏览问题 / 云GIS / 问题详情
graphicLayer无法选择对象
20EXP 2017年04月17日
问题1:使用js 8c的客户端,添加了一个动态切片底图,一个vectorLayer,一个graphicLayer。给map添加了一个selectGraphic的控件,且设置graphicLayer的hitDetection为true,但运行时无法选中图层要素。graphicLayer在map的最上层。

问题2:需求是想要同时选中graphicLayer和vectorlayer的对象,声明一个selectFeature,并且把vectorLayer放在map最上层,可以选中,放在graphicLayer下面就无法选中,渲染方式是canvas。我查看了,graphicLayer也是依托canvas,怎么还会遮盖vectorLayer的选择事件呢?

代码如下:

var textlayer, graphicLayer;
var SelectFeature;
var map,layer, vectorLayer,url;

function init(){
        url = currUser.mapUrl;

        map = new SuperMap.Map("map",{controls:[
            new SuperMap.Control.Navigation({
                dragPanOptions: {
                enableKinetic: true
            }
            })
            ]});
        layer= new SuperMap.Layer.TiledDynamicRESTLayer("World", url, null);
        layer.events.on({"layerInitialized":addLayer});
       
        graphicLayer = new SuperMap.Layer.Graphics("Can Select Graphic Layer",null,{hitDetection: true}); //可以选择,开启事件
      
        textlayer =  new SuperMap.Layer.Vector("Label",{strategies: [trainStrategy],renderers: ["Canvas"]});
      
        selectGraphic = new SuperMap.Control.SelectGraphic(graphicLayer, {
            onSelect: function(result,event){alert('1111');}
        });

      map.addControl(selectGraphic);
      selectGraphic.activate();

}

function addLayer(){
    map.addLayers([layer,textlayer,graphicLayer]);
    map.maxScale = 1/100000;
    //map.addControl(overviewmap);
    map.addControl(scaleline);
    $('.smControlScaleLineBottom').remove();
    //显示地图范围
   

    map.setCenter(new SuperMap.LonLat(12009634.286396, 4258716.5813769),4);
}

2 个回答

我试了下,两个图层的事件都能正常触发。
你可以对比下:

使用这个示例
http://support.supermap.com.cn:8090/iserver/iClient/forJavaScript/examples/Graphics_Clover.html

截图:

1,780EXP 2017年04月17日
是的,我看了超图实例,也调试添加别的图层了,可以触发选择。可是在我自己的代码里不行,是我哪里写错了吗?困惑…

从你贴的代码没看出什么问题。
那你试下这个示例的然后对比你的:
http://support.supermap.com.cn:8090/iserver/iClient/forJavaScript/examples/Graphics_Symbols.html


另外,试下不写map.maxScale = 1/100000;这句看看

map.maxScale = 1/100000;这句去掉没有用;vectorLayer上的要素能选中,graphicLayer上的一直选不中,比对示例看了,没看出啥区别

折腾了一天了,不知道哪里出问题…
RootContainer是个什么图层?我加了一个selectFeature控件后就有这个图层了
注意下顺序,先添加图层再添加和激活控件,否则就会多一个事件图层,会把图层上的要素复制过去;同理,移除图层的时候也要先取消激活控件再移除图层,否则,事件图层还是会有。
selectGraphic控件还是选不了要素。奇怪的是控件的onSelect方法不触发,光标也一直是漫游样式,但是onUnselect事件能触发。不过非选择方法触发的对象不是要素。无解。。。

还有个情况,只有vectorLayer在graphicLayer前面,selectFeature才能选择,否则也选不中。
排除了控件激活时间的问题了么?(控件激活要在关联的图层添加到地图之后、取消激活在地图移除图层前)
是的 无论是selectGraphic还是selectFeature都在图层加载后初始化并激活
私信下联系方式(QQ),远程看下
另外我想了解一下图层实例化时第二个参数和第三个参数分别是什么,API文档上layer只给了两个参数,一个是layername,一个是options

    graphicLayer = new SuperMap.Layer.Graphics("Can Select Graphic Layer",null,{hitDetection: true});
今天来终结这个问题:

selectGraphic选不中Graphic对象,是因为我在生成graphic对象的时候赋了自定义id。经过反复测试,确定graphic类型的要素的id必须是“SuperMap.Graphic_x”这种形式(x代表数字)也就是程序自动生成的id格式,其他任何形式的id都会造成控件选不中。此外,如果不同要素的id声明重复,会造成地图绘点异常。

关于怎么做的问题完。

我猜测应该是选择控件的触发是用id甄别的,这个id在库里写死了,一旦换成自定义id,就无法获取相应对象,也就无法触发选择事件了。
20EXP 2017年04月26日
...