一、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 ,使用该工具一般步骤为:
- 创建绘图对象 graphic;
- 激活绘图工具 Draw;
- 得到图形 Geometry;
- 创建 Graphic;
- 添加到地图;
三、代码实现
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 ,从而添加到地图中来。