距离测量,面积测量等工具条是常用的工具。也是GIS系统的基础功能
效果图
工具条样式:
距离测量:
面积测量:
代码:
require([
"esri/map",
"esri/layers/ArcGISDynamicMapServiceLayer",
"esri/toolbars/navigation",
"esri/toolbars/draw",
"esri/tasks/GeometryService",
"esri/symbols/Font",
"esri/symbols/SimpleMarkerSymbol",
"esri/symbols/SimpleLineSymbol",
"esri/symbols/TextSymbol",
"esri/Color",
"dojo/number",
"esri/graphic",
"esri/tasks/LengthsParameters",
"esri/geometry/Point",
"esri/geometry/Polyline",
"esri/tasks/AreasAndLengthsParameters",
"dojo/dom-attr",
"dojo/domReady!"
],
function(Map,ArcGISDynamicMapServiceLayer,Navigation,Draw,GeometryService,Font,SimpleMarkerSymbol,SimpleLineSymbol,TextSymbol,Color,number,Graphic,LengthsParameters,
Point,Polyline,AreasAndLengthsParameters,domAttr){
var chinaCollagelayer =
new ArcGISDynamicMapServiceLayer(
"http://localhost:6080/arcgis/rest/services/2017shixi/collegeMap/MapServer");
var map =
new Map(
"map");
map.addLayer(chinaCollagelayer);
var navToolbar =
new Navigation(map);
var toolbar =
new Draw(map);
var geometryService =
new GeometryService(
"http://localhost:6080/arcgis/rest/services/Utilities/Geometry/GeometryServer");
var totleDistance =
0.0;
var totalGraphic =
null;
var disFun =
false;
var areaFun =
false;
var inputPoints = [];
var startFont =
new Font(
'12px').setWeight(Font.WEIGHT_BOLD);
var makerSymbol =
new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CIRCLE,
8,
new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
new Color([
204,
102,
51]),
1),
new Color([
158.184,
71,
0.65]));
query(
".functionWrap").on(
"click",
function(event){
var value=domAttr.get(
this,
"title");
switch(value){
case "平移":
navToolbar.activate(Navigation.PAN);
break;
case "拉框缩小":
navToolbar.activate(Navigation.ZOOM_OUT);
break;
case "拉框放大":
navToolbar.activate(Navigation.ZOOM_IN);
break;
case "全图":
map.centerAndZoom(([
110,
38.5]),
5);
break;
case "距离测量":
distanceMeasure();
break;
case "面积测量":
areaMeasure();
break;
case "清除标记":
clearAction();
break;
}
};
function distanceMeasure() {
map.enableScrollWheelZoom();
disFun=
true;
areaFun=
false;
toolbar.activate(Draw.POLYLINE);
}
function areaMeasure() {
map.enableScrollWheelZoom();
disFun=
false;
areaFun=
true;
toolbar.activate(Draw.POLYGON);
}
map.on(
"click",
function (evt) {
mapClick(evt);
});
toolbar.on(
"draw-end",
function (evt) {
addToMap(evt);
});
toolbar.setLineSymbol(
new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
new Color([
255,
0,
0]),
2));
function mapClick(evt) {
if(disFun){
inputPoints.push(evt.mapPoint);
var textSymbol;
if(inputPoints.length ===
1){
textSymbol =
new TextSymbol(
"起点",startFont,
new Color([
204,
102,
51]));
textSymbol.setOffset(
0,-
20);
map.graphics.add(
new Graphic(evt.mapPoint,textSymbol));
}
map.graphics.add(
new Graphic(evt.mapPoint,makerSymbol));
if(inputPoints.length >=
2){
var lengthParams =
new LengthsParameters();
lengthParams.distanceUnit = GeometryService.UNIT_METER;
lengthParams.calculationType =
"preserveShape";
var p1 = inputPoints[inputPoints.length-
2];
var p2 = inputPoints[inputPoints.length-
1];
if(p1.x ===p2.x &&p1.y===p2.y){
return;
}
var polyline =
new Polyline(map.spatialReference);
polyline.addPath([p1,p2]);
lengthParams.polylines=[polyline];
geometryService.lengths(lengthParams,
function(distance){
var _distance = number.format(distance.lengths[
0]/
1000);
totleDistance+=
parseFloat(_distance);
var beetwentDistances = _distance+
"千米";
var tdistance =
new TextSymbol(beetwentDistances,startFont,
new Color([
204,
102,
51]));
tdistance.setOffset(
40,-
3);
map.graphics.add(
new Graphic(p2,tdistance));
if(totalGraphic){
map.graphics.remove(totalGraphic);
}
var total=number.format(totleDistance,{
pattern:
"#.000"
});
var totalSymbol=
new TextSymbol(
"总长度:"+total+
"千米",startFont,
new Color([
204,
102,
51]));
totalSymbol.setOffset(
40,-
15);
totalGraphic= map.graphics.add(
new Graphic(p2,totalSymbol));
});
}
}
}
function addToMap(evt) {
if(disFun||areaFun){
var geometry = evt.geometry;
var symbol =
null;
switch (geometry.type){
case "point":
symbol =
new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CIRCLE,
10,
new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
new Color([
255,
0,
0]),
1),
new Color([
0,
255,
0,
0.25]));
break;
case "polyline":
symbol =
new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
new Color([
255,
0,
0,
0.8]),
2);
break;
case "polygon":
symbol =
new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
new Color([
255,
0,
0]),
2),
new Color([
255,
255,
0,
0.25]));
break;
case "extent":
symbol =
new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
new Color([
255,
0,
0]),
2),
new Color([
255,
255,
0,
0.25]));
break;
}
map.graphics.add(
new Graphic(geometry,symbol));
if(disFun){
inputPoints.splice(
0,inputPoints.length);
totleDistance =
0.0;
totalGraphic =
null;
}
else if(areaFun){
var areasAndLengthsParameters =
new AreasAndLengthsParameters();
areasAndLengthsParameters.lengthUnit = GeometryService.UNIT_METER;
areasAndLengthsParameters.areaUnit = GeometryService.UNIT_SQUARE_KILOMETERS;
geometryService.simplify([geometry],
function (simplifiedGeometries) {
areasAndLengthsParameters.polygons = simplifiedGeometries;
geometryService.areasAndLengths(areasAndLengthsParameters,
function (result) {
var font =
new Font(
"16px",Font.STYLE_NORMAL,Font.VARIANT_NORMAL,Font.WEIGHT_BOLDER);
var areaResult =
new TextSymbol(number.format(result.areas[
0],{
pattern:
'#.000'
})+
"平方公里",font,
new Color([
204,
102,
51]));
var spoint =
new Point(geometry.getExtent().getCenter().x,geometry.getExtent().getCenter().y,map.spatialReference);
map.graphics.add(
new Graphic(spoint,areaResult));
});
});
}
}
}
function clearAction() {
toolbar.deactivate();
disFun =
false;
areaFun =
false;
map.enableScrollWheelZoom();
map.graphics.clear();
var graphicLayerIds = map.graphicsLayerIds;
var len = graphicLayerIds.length;
for(
var i=
0; i<len;i++){
var gLayer = map.getLayer(graphicLayerIds[i]);
gLayer.clear();
}
}
});