首页 / 浏览问题 / 桌面GIS / 问题详情
怎么画电子围栏,并进行电子围栏进出判断?
zyyg  (11EXP)  才疏学浅
3月27日, 2017
我们通过超图软件发布了一个地图,想要实现在地图上划定电子围栏,当有经纬度坐标点进入或离开电子围栏时进行判断并生成报警信息,请问具体怎么实现?

2 个回答

你好,要实现电子围栏的功能还需要根据不同的情况来选择不同的方法。

如果面数据是在前端手动画出来的并且使用vectorLayer渲染的话,使用iClient for Javascript的SuperMap.Geometry.Polygon的intersects()的方法可以判断一个点对象或者一个多点对象是不是在这个面内。

如果面数据是存在数据源中的数据集,那么可以使用数据集查询中的几何查询或者叠加分析中的求交以及对称差的方法来判断点是否在面内。

以上两种是根据不同情况判断点是不是在面内的方法。然后每次经纬度坐标点改变位置的时候去判断点是不是在面内就行了。

当然,我说的并没有包含到所有的情况,如果以上两种方法不能满足你的需求,还请在回复中说明具体业务要求。
3月27日, 2017
1
你好,按照你提供的思路我整理了一下,由于我刚接触超图不太久,还是有一点不是很确定,希望能得到你的指导。
问题是这样的,我们有两种划定电子围栏的方式,第一种是在客户端地图上直接以编辑地物的方式,画出一个电子围栏,然后对收集的坐标数据库中的坐标点进行判断,判断其是否在电子围栏内。那这种情况是不是就是您说的第一种方式,但我对于intersect的用法不是很明白,能不能麻烦您提供一个具体的实例?还有一点,就是我觉得这种情况和几何查询的实例很相同,这两者有什么区别呢?

第二种方式就是我们后台采集一个禁区坐标,将该区域划定为电子围栏,这种情形应该就是第二种方式了,但是我们获取的点坐标是在外部的数据库中,想要判断点是否在电子围栏内,SuperMap.REST.FilterParameter的name应该定义成什么呢?

希望能够得到您的回复。

您好!关于这个问题,如果您需要在客户端中添加的电子围栏的地物的话,首先电子围栏的地物类型需要是面要素数据集,然后通过更新面要素数据及图层来添加一个电子围栏,以下代码作为参考

//执行添加地物
            function addFeatureCompleted(drawGeometryArgs) {
                drawPolygon.deactivate();
                var geometry = drawGeometryArgs.feature.geometry,
                        feature = new SuperMap.Feature.Vector();
                feature.geometry = drawGeometryArgs.feature.geometry,
                        feature.style = style;
                vectorLayer.addFeatures(feature);

                geometry.id = "100000";//这里是给予几何要素的id
                var editFeatureParameter,
                        editFeatureService,
                        features = {
                            fieldNames:[],
                            fieldValues:[],
                            geometry:geometry
                        };
                editFeatureParameter = new SuperMap.REST.EditFeaturesParameters({
                    features: [features],
                    editType: SuperMap.REST.EditType.ADD,
                    returnContent:false
                });
                editFeatureService = new SuperMap.REST.EditFeaturesService(url2, {
                    eventListeners: {
                        "processCompleted": addFeaturesProcessCompleted,
                        "processFailed": processFailed
                    }
                });
                editFeatureService.processAsync(editFeatureParameter);
            }
            //添加地物成功
            function addFeaturesProcessCompleted(editFeaturesEventArgs) {
                var addResultIds = editFeaturesEventArgs.result.IDs,
                        resourceInfo = editFeaturesEventArgs.result.resourceInfo;
                if(addResultIds === null && resourceInfo === null) return;

                if((addResultIds && addResultIds.length > 0) || (resourceInfo &&                             resourceInfo.succeed)) {
                    alert("新增地物成功");
                    vectorLayer.removeAllFeatures();
                    //重新加载图层
                    layer.redraw();
                }else {
                    alert("新增地物失败");
                }
            }

     

接下来您需要通过intersects()的方法来判断点是否在面内

程yan  (1,695EXP)  名扬四海
3月27日, 2017
1
您好,感谢您的回答,能不能麻烦您提供一个intersect的应用实例?刚接触超图不久,在网上搜索了一下,没有找到合适的帮助实例。
...