上文中,实现了简单的针对graphiclayer的空间查询工作,在本节,将更加详细的介绍针对graphiclayer的空间查询。首先,空间查询的方式:提供多种类型的空间查询,包括点周边、线周边、面内等多种方式;其次,图形绘制完成后状态的展示;再次,结果的显示。实现后的结果如下:

点周边——输入缓冲区距离

点周边——查询结果

线周边——输入缓冲区距离

线周边——查询结果

面内——矩形

面内——圆形

面内——多边形

首先,绘制图形。

            var drawToolbar = new esri.toolbars.Draw(map);
            drawToolbar.on("draw-end",showDrawResults);
            on(dom.byId("point"), "click", function(){
                restoreMap();
                drawToolbar.activate(esri.toolbars.Draw.POINT);
            });
            on(dom.byId("polyline"), "click", function(){
                restoreMap();
                drawToolbar.activate(esri.toolbars.Draw.POLYLINE);
            });
            on(dom.byId("extent"), "click", function(){
                restoreMap();
                drawToolbar.activate(esri.toolbars.Draw.EXTENT);
            });
            on(dom.byId("circle"), "click", function(){
                restoreMap();
                drawToolbar.activate(esri.toolbars.Draw.CIRCLE);
            });
            on(dom.byId("polygon"), "click", function(){
                restoreMap();
                drawToolbar.activate(esri.toolbars.Draw.POLYGON);
            });
            /**
             * 显示绘制结果
             */
            function showDrawResults(evt){
                drawToolbar.deactivate();
                map.setMapCursor("default");
                var geometry = evt.geometry;
                if(geometry.type==="point" || geometry.type==="polyline"){
                    $('#map').modalInfowindow({
                        width:175,
                        height:75,
                        title:"请输入缓冲区距离",
                        content:"<input type='text' id='distance' />"
                    });
                    $("#distance").focus();
                    $("#distance").keydown(function (e){
                        // 回车键事件
                        if(e.which == 13) {
                            $("#close").click();
                        }
                    });
                    on(dom.byId("close"), "click", function(){
                        distance = dom.byId("distance").value;
                        $("#modal").remove();
                        doBuffer(geometry);
                    });
                }
                else{
                    queryGraphicByPolygon(geometry);
                }
            };

当为点或者线的时候,得首先进行缓冲区分析,获取缓冲区的geometry,缓冲区分析的代码如下:

            /**
             * 执行buffer
             * @param geometry
             */
            function doBuffer(geometry) {
                var symbol = null;
                switch (geometry.type) {
                    case "point":
                        symbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CIRCLE,
                                7,
                                new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
                                        new Color([0,0,255]),
                                        1
                                ),
                                new Color([0,0,255])
                        );
                        break;
                    case "polyline":
                        symbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
                                new Color([0,0,255]),
                                2
                        );
                        break;
                    case "polygon":
                        symbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_NONE,
                                new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
                                        new Color([0,0,255]),
                                        2
                                ),
                                new Color([0,0,255,0.25]));
                        break;
                }
                var graphic = new Graphic(geometry, symbol);
                map.graphics.add(graphic);

                //setup the buffer parameters
                var params = new BufferParameters();
                params.distances = [distance];
                params.bufferSpatialReference = map.spatialReference;
                params.outSpatialReference = map.spatialReference;
                params.unit = GeometryService["UNIT_KILOMETER"];

                if (geometry.type === "polygon") {
                    //if geometry is a polygon then simplify polygon.  This will make the user drawn polygon topologically correct.
                    gsvc.simplify([geometry], function(geometries) {
                        params.geometries = geometries;
                        gsvc.buffer(params, function(bfGeometry){
                            queryGraphicByPolygon(bfGeometry[0]);
                        });
                    });
                }
                else {
                    params.geometries = [geometry];
                    gsvc.buffer(params, function(bfGeometry){
                        queryGraphicByPolygon(bfGeometry[0]);
                    });
                }
            }

在执行缓冲区分析的时候,会用到geometryservice。代码如下:

var gsvc = new GeometryService("http://localhost:6080/arcgis/rest/services/Utilities/Geometry/GeometryServer");

当缓冲区分析完成或者面要素绘制完成以后的geometry都为polygon,此时,执行空间查询:

            /**
             * 根据多边形进行查询
             * @param geometry
             */
            function queryGraphicByPolygon(geometry){
                var graphics = chartLayer.graphics;

                var sfs = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
                        new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASHDOT,
                                new Color([255,0,0]), 2),
                        new Color([255,255,0,0.25])
                );
                var graphic = new Graphic(geometry,sfs);
                map.graphics.add(graphic);

                for(var i= 0, total=graphics.length;i<total;i++){
                    if(geometry.contains(graphics[i].geometry)){
                        selectedGraphics.push(graphics[i]);
                        graphics[i].symbol = createSymbol(iconPath,"#0ff");
                        chartLayer.redraw();
                    }
                }
            }

空间查询的逻辑很简单,就是通过判断自定义的区域内是否包含各点。

Arcgis for Js实现graphiclayer的空间查询(续)的更多相关文章

  1. Arcgis for Js实现graphiclayer的空间查询

    本节讲的是Arcgis for Js的针对graphiclayer的空间查询,内容很简单,代码如下: <!DOCTYPE html> <html> <head> & ...

  2. Arcgis for Js之featurelayer实现空间查询和属性查询

    空间查询和属性查询是常用的两种对数据的检索与查询方式,在本节,将讲述Arcgis for Js下如何实现featurelayer的这两种查询方式,先贴图给大家看看: 实现界面 属性查询 空间查询 看完 ...

  3. Arcgis for JS扩展GraphicLayer实现区域对象的聚类统计与展示

    功能需求: 分省市统计并展示全国雨量站的数目与位置. 常规做法: 分省市雨量站的数目通过统计表的形式在页面端展示,位置根据XY坐标信息将雨量站标绘在图上. 优化做法: 去掉统计图的展示方式,直接将各省 ...

  4. Arcgis for Js之Graphiclayer扩展具体解释

    在前两节,讲到了两种不同方式的聚类,一种是基于距离的,一种是基于区域范围的,两种不同的聚类都是通过扩展esri/layers/GraphicsLayer方法来实现的.在本节,就具体的讲讲esri/la ...

  5. Arcgis for Js之Graphiclayer扩展详解

    在前两节,讲到了两种不同方式的聚类,一种是基于距离的,一种是基于区域范围的,两种不同的聚类都是通过扩展esri/layers/GraphicsLayer方法来实现的.在本节,就详细的讲讲esri/la ...

  6. (转)Arcgis for Js之Graphiclayer扩展详解

    http://blog.csdn.net/gisshixisheng/article/details/41208185 在前两节,讲到了两种不同方式的聚类,一种是基于距离的,一种是基于区域范围的,两种 ...

  7. ArcGIS for Android示例解析之空间查询-----QueryTask

    转自:http://blog.csdn.net/wozaifeiyang0/article/details/7331450 QueryTask 查询功能在GIS中是一个不可或缺的重要功能,示例中提供了 ...

  8. 使用ArcGIS API for Silverlight 进行复合多条件空间查询

    原文:使用ArcGIS API for Silverlight 进行复合多条件空间查询 这两天帮网上认识的一个兄弟做了一个查询的示例,多多少少总结一下,在此和大家分享. 为什么说是复合多条件呢?因为进 ...

  9. ArcGIS API for JavaScript 4.2学习笔记[25] 官方第八章Analysis(空间查询)概览与解释

    开森,最关注的空间分析章节终于到了,在空间查询那节逻辑性的代码简直要命(呵呵,空间分析的代码也要命...). 上目录截图: [Geodesic buffers(GeometryEngine)] 使用G ...

随机推荐

  1. bootstrap基本使用

    bootstrap是封装了css和js代码实现酷炫的效果,所以使用的时候,比如说是列表效果,直接调用它本身定义的函数就ok了 静态文件 把href='..static/..'里面改为url_for静态 ...

  2. Python面试题之Python和Java中Super方法的区别

    python 的 super 是一个函数,需要两个参数,第一个参数是类,第二个参数是实例,返回值是一个类对象. 其意义是:站在参数2这个实例的角度看去, 参数1这个类的‘父亲’是谁,把‘父亲’返回. ...

  3. ASP.NET MVC jQuery 树插件在项目中使用方法(一)

    jsTree是一个 基于jQuery的Tree控件.支持XML,JSON,Html三种数据源.提供创建,重命名,移动,删除,拖"放节点操作.可以自己自定义创建,删 除,嵌套,重命名,选择节点 ...

  4. 20145219 《Java程序设计》第16周课程总结

    20145219 <Java程序设计>第16周课程总结 每周读书笔记(即学习总结)链接汇总 第0周问卷调查 第1周读书笔记 第2周读书笔记 第3周读书笔记 第4周读书笔记 第5周读书笔记 ...

  5. Linux下多线程下载工具MWget和Axel使用介绍

    linux运维在操作linux过程中,用得最多的linux下载工具想必一定是wget,没有看到哪一台服务器没装过wget的,或许有人使用ftp下载,也有人使用多线程的axel以及ProZilla,毫无 ...

  6. Eclipse 启动tomcat 访问主页报错404

    问题 tomcat用startup.sh启动,访问localhost:8080能正常访问,用Eclipse service启动tomcat,访问localhost:8080报错404 解决方法 1. ...

  7. JavaScript常用知识点整理——思维导图

    如图 思维导图图片链接 http://www.edrawsoft.cn/viewer/public/s/b8327462051289 有道云笔记图片链接 http://note.youdao.com/ ...

  8. Mac Item2 SSH免密登录Linux 服务器的两种方式

    转自http://blog.csdn.net/jobschen/article/details/52823980 mac ssh登录linux服务器 的两种方式: 个人推荐第二种,zsh方式,只需要把 ...

  9. Android -- junit测试框架,logcat获取log信息

    1. 相关概念 白盒测试: 知道程序源代码. 根据测试的粒度分为不同的类型   方法测试 function test         单元测试 unit test                 集成 ...

  10. 如何在MyEclipse中更改servlet模板 Jsp模板

    http://blog.csdn.net/sjw890821sjw/article/details/6995190 刚换上Myeclipse9.0,结果要修改servlet模板的时候不像Myeclps ...