zoukankan      html  css  js  c++  java
  • Arcgis for js开发之直线、圆、箭头、多边形、集结地等绘制方法

    Arcgis for js开发之直线、圆、箭头、多边形、集结地等绘制方法


    将ARCGIS for Js API中绘制各种图形的方法进行封装,方便调用。用时只需要传入参数既可。(在js文件中进行封装定义);

    1、新建js文件,新建空对象用于函数的定义

    if (!this["gisTool"]) { gisTool= {}; }
    if (!this["gisTool.Map"]) { gisTool.Map = {}; }

    定义一个空对象,用于存储各类方法:

    //地图交互事件
    gisTool.Map.MapTool = {


    在mapTool对中进行新建函数,方便不同功能中的调用。

    一、获取当前点击的地图坐标

     //地图拾取点坐标
        getMapPoint: function (callBack) {
           map.setMapCursor("crosshair");
            var mapHandler = dojo.connect(map, "onClick", function (event) {
    
                clearLayer(map, "PointLayer");
    
                try {
                    map.setMapCursor("default");
    
                    callBack(event.mapPoint);
    
                    dojo.disconnect(mapHandler);//事件值执行一次
                } catch (err) { }
    
            });
        },

    二、绘制圆形(传入对应的参数既可)

      drawCircle: function (x, y, R, symbol, graphicLayer, isFly, callBack) {
            var ptStart = Geometry.drawPoint(parseFloat(x), parseFloat(y), { wkid: 4832});
            var circleGeometry = new esri.geometry.Circle(ptStart, {
                "radius": R,
            });
            if (isFly) {
               CenterAt(map, circleGeometry);
            }
            var graphic = new esri.Graphic(circleGeometry, symbol);
            if (callBack != null) {
                callBack(circleGeometry);
            }        
            graphicLayer.add(graphic);
        },


    三、图形定位(单击进行坐标或者geometry定位)

     flayCirle: function (map, geometry) {
            var extent = geometry.getExtent();
            if (geometry.type == "point") {
                extent = new esri.geometry.Extent(geometry.x - 0.0000001, geometry.y - 0.0000001, geometry.x - 0 + 0.0000001, geometry.y - 0 + 0.0000001, map.spatialReference);
                extent = extent.expand(1.5);
            }
            if (extent != null) {
                var point = new esri.geometry.Point(extent.xmin + (extent.xmax - extent.xmin) / 2, extent.ymin + (extent.ymax - extent.ymin) / 2, map.spatialReference);
                var newExtent = new esri.geometry.Extent(point.x, point.y, point.x, point.y, point.spatialReference);
                //如果当前视图包含要缩放视图
                if (Extent(map.extent, extent)) {
                    // extent = extent.expand(2);
                    map.setExtent(extent);
                } else {
                    var firstEx = UnionExtent(newExtent, map.extent);
                    map.setExtent(firstEx, true);
                    setTimeout(function () {
                        map.centerAt(point)
                    }, 700);
                    setTimeout(function () {
                        extent = extent.expand(1.5);
                        map.setExtent(extent);
                    }, 1400);
                }
            }
        },

    四、绘制多线段PloygonLine

     drawPolyLine: function (callback) {
            var toolbar = new esri.toolbars.Draw(map, { showTooltips: true });
            toolbar.activate(esri.toolbars.Draw.POLYLINE);
            dojo.connect(toolbar, "onDrawEnd", function (geometry) {
                callback(geometry);
                toolbar.deactivate();
            });
        },

    五、将绘制的多线段添加到地图上

     addPolyLine: function (points,symbol,graphicLayerName) {
            var map = map;
            require(["esri/geometry/Polygon", "esri/SpatialReference"], function (Polygon, SpatialReference) {
                var polygonLine = new Polygon(new esri.SpatialReference({ wkid: wkid }));
                polygonLine.addRing(points);
                var graphicsLayer = GrapchicLayer(map, graphicLayerName);
                var graphic = new esri.Graphic(polygonLine, symbol);
                graphicsLayer.add(graphic);
            });
        },

    六、绘制多边形

    drawPolygon:function(callback){
            var toolbar = new esri.toolbars.Draw(map, {
                showTooltips: true
            });
            toolbar.activate(esri.toolbars.Draw.POLYGON);
            dojo.connect(toolbar, "onDrawEnd", function (geometry) {
                callback(geometry);
                toolbar.deactivate();
            });
        },

    七、绘制箭头的方法

     drawArrow: function (callback) {
            var toolbar = new esri.toolbars.Draw(map, { showTooltips: true });
            toolbar.activate(esri.toolbars.Draw.ARROW);
            dojo.connect(toolbar, "onDrawEnd", function (geometry) {
                callback(geometry);
                toolbar.deactivate();
            });
        },

    八、将多边形添加到地图上

     addPolygon: function (points, symbol, graphicLayerName) {
            var map = map;
            require(["esri/geometry/Polygon", "esri/SpatialReference"], function (Polygon, SpatialReference) {
                var polygon = new Polygon(new esri.SpatialReference({ wkid: 4832}));
                polygon.addRing(points);
                var graphic = new esri.Graphic(polygon, symbol);
                var graphicsLayer = GraphicLayer(map, graphicLayerName);
                graphicsLayer.add(graphic);
            });
        },

    九、画线的方法

    drawLine: function (callback) {
            var toolbar = new esri.toolbars.Draw(map, { showTooltips: true });
            toolbar.activate(esri.toolbars.Draw.LINE);
            dojo.connect(toolbar, "onDrawEnd", function (geometry) {
                callback(geometry);
                toolbar.deactivate();
            });
        },

    十、绘制集结地(需要英语第三方的API)

      drawGathering_Place: function (pnts,symbol,graphicLayerName) {
            this.t = 0.4;
            var mid = P.PlotUtils.mid(pnts[0], pnts[1]);
            var d = P.PlotUtils.distance(pnts[0], mid) / 0.9;
            var pnt = P.PlotUtils.getThirdPoint(pnts[0], mid, P.Constants.HALF_PI, d, true);
            pnts = [pnts[0], pnt, pnts[1]];
    
            var mid = P.PlotUtils.mid(pnts[0], pnts[2]);
            pnts.push(mid, pnts[0], pnts[1]);
    
            var normals = [];
            for (var i = 0; i < pnts.length - 2; i++) {
                var pnt1 = pnts[i];
                var pnt2 = pnts[i + 1];
                var pnt3 = pnts[i + 2];
                var normalPoints = P.PlotUtils.getBisectorNormals(this.t, pnt1, pnt2, pnt3);
                normals = normals.concat(normalPoints);
            }
            var count = normals.length;
            normals = [normals[count - 1]].concat(normals.slice(0, count - 1));
            var pList = [];
            for (i = 0; i < pnts.length - 2; i++) {
                pnt1 = pnts[i];
                pnt2 = pnts[i + 1];
                pList.push(pnt1);
                for (var t = 0; t <= P.Constants.FITTING_COUNT; t++) {
                    var pnt = P.PlotUtils.getCubicValue(t / P.Constants.FITTING_COUNT, pnt1, normals[i * 2], normals[i * 2 + 1], pnt2);
                    pList.push(pnt);
                }
                pList.push(pnt2);
            }
            gisTool.MapTool.addPolygon(pList, symbol,graphicLayerName);
        },

    十一、绘制自由线

     drawFreehandLine: function (callback) {
            var toolbars = new esri.toolbars.Draw(map, { showTooltips: true });
            toolbars.activate(esri.toolbars.Draw.FREEHAND_POLYLINE);
            dojo.connect(toolbars, "onDrawEnd", function (geometry) {
                callback(geometry);
                toolbars.deactivate();
            });
        },

    十二、手绘多边形

     drawFreePolygon: function (callback) {
            var toolbars = new esri.toolbars.Draw(map, { showTooltips: true });
            toolbars.activate(esri.toolbars.Draw.FREEHAND_POLYGON);
            dojo.connect(toolbars, "onDrawEnd", function (geometry) {
                callback(geometry);
                toolbars.deactivate();
            });
        },

    十三、绘制文字

     drawText: function (symbol,graphicLayerName) {
            var toolbar = new esri.toolbars.Draw(map, { showTooltips: true });
            toolbar.activate(esri.toolbars.Draw.POINT);
            map.setMapCursor("crosshair");
            toolbar.on("draw-complete", function (evt) {
                var point = evt.geometry;           
                var graphicLayer = GraphicLayer(map, graphicLayerName);
                var graphic = esri.Graphic(point, symbol);
                graphicLayer.add(graphic);
                map.setMapCursor("default");
                toolbar.deactivate();
            });
        },

    十四、删除图层上的单一要素的方法

     deleteOneGraphic: function (graphicLayerName) {
            var map = map, oneEvent;
           map.setMapCursor("crosshair");
            var graphicLayer = new GraphicLayer(map, graphicLayerName);
            if (graphicLayer) {
                oneEvent = dojo.connect(graphicLayer, "onClick", function (evt) {
                    map.setMapCursor("default");
                    graphicLayer.remove(evt.graphic);
                    dojo.disconnect(oneEvent);
                });
            }
        },

    十五、缩放到指定范围

    zoomToGeometry: function (xMin, xMax, yMin, yMax) {
            var wkid = Robin.Setting.GlobalSetting.wkid;
            //起点、终点
            var extent = new esri.geometry.Extent(xMin, yMin, xMax, yMax, new esri.SpatialReference({ wkid: wkid }));
            Extent(map, extent.expand(3));
        }

    关于传入的参数进行说明:

    graphicLayerName:为指定的需要操作的图层名称,根据具体的图层名称方便后期的管理。

    symbol:线或者面的填充样式,一般的定义样式如下:

    var symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID,
                    new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID,
                    new dojo.Color([255, 0, 0, 0.6]), 4),
                    new dojo.Color([0, 255,0 , 0.6]));

    传入的point的值是callback中返回的geometry中解析出的: var point = geometry.rings[0];


    说明:总结仅供参考,有意见保留。


  • 相关阅读:
    对象的思考1
    第一个php网页
    php&mysql
    python —print
    实现窗口移动
    numpy学习(二)
    numpy学习(一)
    knn算法之预测数字
    机器学习(一)之KNN算法
    matplot绘图(五)
  • 原文地址:https://www.cnblogs.com/dongteng/p/6540076.html
Copyright © 2011-2022 走看看