04-ArcGIS API For Javascript 图形要素graphic

一、graphic简介

ArcGIS JavaScript API 允许在地图上绘制 graphic(图形)。graphic可由用户作为标记或输入绘制,也可由应用程序根据任务绘制。如应用程序可将查询结果作为 graphic 添加到地图。可以为地图创建和添加一个或多个 graphic 图层(即 GraphicsLayer),一个 GraphicsLayer 包含一个 Graphic 对象的数组,该数组初始是空的,但是在地图加载之后任何时候都可以添加 graphic。

graphic 对应着 esri/graphic ,一个 Graphic 对象由四部分组成:geometry、symbol、attributes、info template。

  • geometry 决定garphic的位置。可以是 point、multipoint、polyline、polygon。
  • symbol 决定 graphic 的外观,geometry 是 point、multipoint 的 symbol 时可以是 marker symbol,polyline 的 symbol 可以是 line symbol,polygon 的 symbol 可以是 fill symbol。
  • attribute 是描述 graphic 的名称-值对。如果创建 graphic,则需要分配 attributes。如果 graphic 是在一个图层上响应执行任务而创建的,则 graphic 自动包含该图层的字段属性。一些任务允许限制返回到结果 graphic 的 attributes,Query.outFields 是限制任务返回attributes 的一个示例。
  • info template 定义当 graphic 被点击时,各种 attribute 将如何出现。

四个属性 geometry、symbol、attributes和info template 都是可选的。许多 task 结果被作为 FeatureSet 中的 graphic 对象被返回。这些graphic 返回时只有 geometry 和 attributes。如果要将 graphic 添加到地图中,必须为它们定义和设置符号。

若需要允许用户在地图上绘制 graphic,则可以使用 Draw 工具条。Draw 工具条是一个类,可以帮助您捕获用户在屏幕上绘制的geometry,然后您可以定义一个 symbol 并将它应用到新 graphic 对象中的 geometry 中。

二、用户交互画点线面

有时在项目中,会有这么一个需求:让用户在地图上自己绘制一个图形,然后将图形添加到地图当中,要实现这个功能可以使用 Draw 工具条,利用该工具条我们可以得到用户交互画出来的 geometry,从而根据 geometry 生成相应的 graphic ,使用该工具一般步骤为:

  1. 创建绘图对象 graphic;
  2. 激活绘图工具 Draw;
  3. 得到图形 Geometry;
  4. 创建 Graphic;
  5. 添加到地图;

三、代码实现

1、创建 5 个 button

<button>绘制点</button>
<button>绘制折线</button>
<button>绘制面</button>
<button>徒手线</button>
<button>徒手面</button>

2、引入相应模块,其中包括:

dojo/on(用于绑定事件的模块)
esri/symbols/SimpleMarkerSymbol(点符号类)
esri/symbols/SimpleLineSymbol(线符号类)
esri/symbols/SimpleFillSymbol(面符号类)
esri/geometry/Point(点类)
esri/geometry/Polyline(折线类)
esri/geometry/Polygon(面类)
esri/geometry/Circle(圆类)
dojo/query(dojo的选择器,用于选择DOM元素)
esri/graphic(图形类)
esri/layers/GraphicsLayer(客户端图层类)

3、创建绘图对象

var toolbar = new Draw(map, { showTooltips: true });

4、给每个 button 绑定相应的事件(激活绘图工具)

query("button").on("click",function(event){
			var value=this.innerHTML;
			switch(value){
                case "绘制点":{
	                //激活绘图工具(画点)
                    toolbar.activate(Draw.POINT, {
                        showTooltips:true
                    })
                    break;

                }
                case "绘制折线":{
	                 //激活绘图工具(画折线)
                    toolbar.activate(Draw.POLYLINE, {
                        showTooltips:true
                    })
                    break;
                }
                case "绘制面":{
	                //激活绘图工具(绘制面)
                    toolbar.activate(Draw.POLYGON, {
                        showTooltips:true
                    })
                    break;
                }
                case "徒手线":{
	                //激活绘图工具(徒手线)
                    toolbar.activate(Draw.FREEHAND_POLYLINE, {
                        showTooltips:true
                    })
                    break;
                }
                case "徒手面":{
	                //激活绘图工具(徒手面)
                    toolbar.activate(Draw.FREEHAND_POLYGON, {
                        showTooltips:true
                    })
                    break;
                }

			}
	});

5、给绘图工具绑定绘图完成事件

on(toolbar,"draw-complete", function (result) {
				//获得几何形状
                var geometry=result.geometry;
                //获得形状的类型
                var type=geometry.type;
                //声明图形对象
                var graphic;
                //通过几何形状的类型,创建不同的图形
                switch (type) {
                    case "point":
                        graphic= new Graphic(geometry, marker);
                        break;
                    case "polyline":
                        graphic= new Graphic(geometry, lineSymbol);
                        break;
                    case "polygon":
                        graphic= new Graphic(geometry, fill);
                        break;
                }

                map.graphics.add(graphic);
                //关掉绘图工具
                toolbar.deactivate();
});

6、全部代码

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>实现用户交互画图Draw工具</title>
    <link  rel="stylesheet"  type="text/css" href="http://localhost:8080/arcgis_js_api/library/3.17/3.17/dijit/themes/tundra/tundra.css"/>
    <link  rel="stylesheet"  type="text/css" href="http://localhost:8080/arcgis_js_api/library/3.17/3.17/esri/css/esri.css" />
    <script  type="text/Javascript" src="http://localhost:8080/arcgis_js_api/library/3.17/3.17/init.js"></script>
    <style type="text/css">
        .MapClass{
            width:100%;
            height:500px;
            border:1px solid #000;
        }
    </style>
    <script type="text/javascript">

        require(["esri/map","dojo/dom","dojo/on",
                    "esri/layers/ArcGISDynamicMapServiceLayer",
                    "dojo/query","esri/toolbars/draw",
                    "esri/symbols/SimpleLineSymbol",
                    "esri/graphic",
                    "esri/symbols/SimpleMarkerSymbol",
                    "esri/symbols/SimpleFillSymbol",
                    "dojo/domReady!"],
            function (Map,dom,on, ArcGISDynamicMapServiceLayer,query, Draw, SimpleLineSymbol,Graphic,SimpleMarkerSymbol,SimpleFillSymbol) {
            var map = new esri.Map("MyMapDiv");
            var layer = new ArcGISDynamicMapServiceLayer
            ("http://localhost:6080/arcgis/rest/services/Test/广州市城市总体规划/MapServer");
            map.addLayer(layer)
            var toolbar = new Draw(map, { showTooltips: true });

            var lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASH, new dojo.Color([255, 0, 0]), 3);
            var marker= new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CIRCLE,10, lineSymbol, new dojo.Color([255, 0, 0]));
            var fill= new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, lineSymbol,  new dojo.Color([255, 0, 0]));
            on(toolbar,"draw-complete", function (result) {  //给绘图工具绑定绘图完成事件
                //获得几何形状
                var geometry=result.geometry;
                //获得形状的类型
                var type=geometry.type;
                //声明图形对象
                var graphic;
                //通过几何形状的类型,创建不同的图形
                switch (type) {
                    case "point":
                        graphic= new Graphic(geometry, marker);
                        break;
                    case "polyline":
                        graphic= new Graphic(geometry, lineSymbol);
                        break;
                    case "polygon":
                        graphic= new Graphic(geometry, fill);
                        break;
                }
                map.graphics.add(graphic);
                //关掉绘图工具
                toolbar.deactivate();
            });
           query("button").on("click",function(event){
//            var value=event.rangeParent.data;
            var value=this.innerHTML;
            switch(value){
                case "绘制点":{
                    //激活绘图工具(画点)
                    toolbar.activate(Draw.POINT, {
                        showTooltips:true
                    });
                    break;
                }
                case "绘制折线":{
                    //激活绘图工具(画折线)
                    toolbar.activate(Draw.POLYLINE, {
                        showTooltips:true
                    });
                    break;
                }
                case "绘制面":{
                    //激活绘图工具(绘制面)
                    toolbar.activate(Draw.POLYGON, {
                        showTooltips:true
                    });
                    break;
                }
                case "徒手线":{
                    //激活绘图工具(徒手线)
                    toolbar.activate(Draw.FREEHAND_POLYLINE, {
                        showTooltips:true
                    });
                    break;
                }
                case "徒手面":{
                    //激活绘图工具(徒手面)
                    toolbar.activate(Draw.FREEHAND_POLYGON, {
                        showTooltips:true
                    });
                    break;
                }

            }
           });
        });
    </script>
</head>
<body>
    <div id="MyMapDiv" class="MapClass"></div>
    <button>绘制点</button>
    <button>绘制折线</button>
    <button>绘制面</button>
    <button>徒手线</button>
    <button>徒手面</button>
</body>
</html>

7、相关说明

  • 在使用绘图工具时,最主要不同为:在激活绘图工具时的赋予参数的不同。
  • graphic 只是客户端图形,并不改变服务本身,如果想改变服务本身的数据,需要使用要素服务,用到 esri/toolbars/Edit 工具。
  • 在生成 graphic 时,最主要是有用这个图形的几何信息,几何信息可以通过多方面获得,如:(1)通过具体的坐标生成 geometry;(2)通过 draw 工具动态获得 geometry;(3)可以通过 map 点击事件获得点的 geometry;一旦拥有了图形的几何信息,我们就可以直接创建 graphic ,从而添加到地图中来。

 

 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值