arcgis js 画多条线

本文介绍如何使用ArcGIS JavaScript API 3.29版本进行地图初始化、加载底图,并详细讲解了组织多条线路径集合、绘制多条线及实现画线监听的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.引入需要的css、js文件,github地址:https://github.com/zhangliqingyun/arcgis-javascript/tree/master/arcgis/3.29

<link rel="stylesheet" th:href="@{/dist/arcgis/3.29/css/esri.css}"/>   
<link rel="stylesheet" th:href="@{/dist/arcgis/3.29/css/tundra.css}"/>
<script th:src="@{/dist/arcgis/3.29/js/init.js}"></script> 

2.页面定义div:

    <!-- 底图展示的div开始 -->            
    <div id='map' style="width:100%;height:100%;display:block;position: absolute;"></div> 
    <!-- 底图展示的div结束 --> 

3.加载地图连接:  

 var map = null;                       //共用地图定义
    var pointLayer = null;                //单点图层
    var aimedatLayer = null;              //瞄准点图层
    var pointListLayer = null;            //多点图层
    var lineLayer = null;                 //单线图层
    var lineListLayer = null;             //多线图层
    var pictureMarkerSymbol = null;       //图标marker
    var aimedatMarkerSymbol = null;       //瞄准图标marker
    var simpleLineSymbol = null;          //画线marker
    var url = "http://xxx.xx.xx.xxx:6080/arcgis/rest/services/CMAPDT/MapServer";  //底图的链接地址   

 //加载超图底图--超图
    function loadSupermapBaseMap(){        
        require(["esri/map", "esri/layers/ArcGISTiledMapServiceLayer","esri/layers/GraphicsLayer","esri/symbols/PictureMarkerSymbol", "esri/symbols/SimpleLineSymbol", "esri/Color","dojo/dom-construct", "esri/dijit/InfoWindow"
        ], function(Map,ArcGISTiledMapServiceLayer,GraphicsLayer,PictureMarkerSymbol,SimpleLineSymbol,Color,domConstruct,InfoWindow) {        
            //var infoWindow = new InfoWindow({}, domConstruct.create("div"));
            //infoWindow.startup();     
            map = new Map("map", {center: [105.85, 36.79],zoom: 1});    //创建地图、指明中心点、放大程度值设置    
            var tiledLayer = new ArcGISTiledMapServiceLayer(url);       //根据图层链接创建图层
            map.addLayer(tiledLayer);                                   //图层添加到地图中         
            pointLayer = new GraphicsLayer({"id":"pointLayer"});        
            aimedatLayer = new GraphicsLayer({"id":"aimedatLayer"});   
            pointListLayer = new GraphicsLayer({"id":"apointListLayer"});
            lineLayer = new GraphicsLayer({"id":"lineLayer"});
            lineListLayer = new GraphicsLayer({"id":"lineListLayer"});
            map.addLayer(pointLayer, 2);     
            map.addLayer(aimedatLayer, 2);          
            map.addLayer(pointListLayer, 2);          
            map.addLayer(lineLayer, 2);          
            map.addLayer(lineListLayer, 2);             
            pictureMarkerSymbol = new PictureMarkerSymbol({"url":"/dist/img/marker-icon.png","height":25,"width":20,"xoffset":0,"yoffset":12});          
            aimedatMarkerSymbol = new PictureMarkerSymbol("/dist/img/aimedat.png", 45, 45);     
        });    
    }


4.组织多条线路径集合,单条线二维数组,多条线使用三维数组

       

 var pointListThree = new Array();             //存放点集合(三维)  
         var pointList = new Array();                  //存放点集合(二维)  
         var tempProv = data[0].regionCode; 
         var index = 0;
         for(var i = 0 ;i < data.length;i++){
             if(tempProv == data[i].regionCode){
                 pointList[index] = new Array();    //在声明二维
                 pointList[index][0] = data[i].jd;
                 pointList[index][1] = data[i].wd;    
                 index++;    
             }else{
                 pointListThree.push(pointList);  
                 pointList = [];                     //清空
                 tempProv = data[i].regionCode;      //重新赋值
                 index = 0;                          //重新赋值   
                 pointList[index] = new Array();//在声明二维
                 pointList[index][0] = data[i].jd;
                 pointList[index][1] = data[i].wd;
                 index++;
             }     
             if(i == data.length-1){                 //最后一行记录的情况    
                 pointListThree.push(pointList);
             }   
         }
         if(pointListThree != null && pointListThree.length > 0){
             drawLineListSameTipArcgis(pointListThree,popContent,roadCode,firstLi,firstLiBeforePicture,moveTip,firstOnePoint);    //把路线先画了 
         }

5.开始画多条线,画线监听: 

//画路线集合,适用于同一个提示信息的画线
    function drawLineListSameTipArcgis(pointListThree,popContent,roadCode,firstLi,firstLiBeforePicture,moveTip,firstOnePoint){ 
        require(["esri/graphic","esri/dijit/InfoWindow","dojo/dom-construct","dojo/dom-attr","dojo/dom-style","dojo/dom","esri/geometry/Point"], function(Graphic,InfoWindow,domConstruct,domAttr,domStyle,dom,Point) {           
            cleanLayer();                                   //清理图层
            var myLine ={geometry:{"paths":pointListThree,  //画多条线   
                "spatialReference":{"wkid":4326}},    
                "symbol":{"color":[29,157,225],"width":4,"type":"esriSLS","style":"esriSLSSolid"}};
            var graphic = new Graphic(myLine);                    
            lineLayer.add(graphic);               
            lineLayer.on("click",popupLayerClick);    //点击提示层的方法
            lineLayer.on("mouse-over",showMoveTip);   //鼠标放到提示层的方法
            lineLayer.on("mouse-out",popupLayerOut);  //鼠标移开提示层的方法    
            lineLayer.on("mouse-move",showMoveTip);   //鼠标移动提示层的方法    
            map.infoWindow.hide();                     //隐藏弹出提示框     
            position();                                //定位放大地图
            
            //清理图层 
            function cleanLayer(){
               lineLayer.clear();
            } 
            
            //定位放大地图
            function position(){  
               var latitude = parseFloat(firstOnePoint[0]);
               var longitude = parseFloat(firstOnePoint[1]);          
               var point = new Point(latitude, longitude, map.spatialReference);        
               map.setScale(8000000);        //缩放比例 (比例尺)                                                           
               map.centerAndZoom(point);     //定位               
            }  
            
            //点击提示层的方法   
            function popupLayerClick(e){        
                var currentStackTemp = getCurrentStackByLngLat(e.mapPoint.x,e.mapPoint.y,roadCode);//通过经纬度得到当前桩号  
                   var currentStackPopContent = "<ul style='margin-left:10px;margin-right:10px;font-size:14px;margin-bottom:10px'><li>当前桩号:"+stakeTransformation(currentStackTemp)+"</li></ul>";
                 var popContentTemp = "";
                 if(!atBeforePictureNow){    //当前不处于前方图像展示
                     popContentTemp = firstLi+popContent+currentStackPopContent;
                 }else{
                     popContentTemp = firstLiBeforePicture+popContent+currentStackPopContent;
                     clickMapRoadPositionCharts(currentStackTemp,e.mapPoint.x,e.mapPoint.y);   //点击地图路线重新定位前方图像底部图表、重新请求前方图像
                 }  
                 e.stopPropagation();   
                map.infoWindow.setTitle("基本信息");            
                map.infoWindow.setContent(popContentTemp);      
                map.infoWindow.show(e.mapPoint,InfoWindow.ANCHOR_UPPERLEFT);    //e.mapPoint为地图点击的点         
            }

            //鼠标移开提示层的方法    
            function popupLayerOut(e){  
                map.setMapCursor("default");             //设置地图的小手样式
                if(dom.byId("text") != null){            //判断提示框存在则移除提示框
                    dom.byId("map").removeChild(dom.byId("text"));   
                }
            }  

            //展示提示的方法
            function showMoveTip(e){
                map.setMapCursor("pointer");
                var scrPt = map.toScreen(e.mapPoint);     //e.mapPoint为地图点击的点 , map.toScreen转成屏幕的坐标 
                var textDiv = domConstruct.create("div"); //创建一个div
                domAttr.set(textDiv,{                     //给div设置Attr
                    "id":"text",
                    "text":""  
                });  
                domStyle.set(textDiv, {                   //给div设置Style
                    "left": scrPt.x+10 + "px",   
                    "top": scrPt.y-10 + "px",     
                    "position": "absolute",
                    "z-index":99,
                    "background":"#fcffd1",
                    "font-size":"10px",
                    "border":"1px solid #0096ff",
                    "padding": "0.1em 0.3em 0.1em",
                    "border-radius": "3px",
                    "box-shadow": "0 0 0.75em #777777"
                });   
                var currentStackTemp = getCurrentStackByLngLat(e.mapPoint.x,e.mapPoint.y,roadCode);//通过经纬度得到当前桩号
                  var popContentTemp = "<div style='font-size:14px;height:20px;margin-left:5px;margin-right:5px'>"+moveTip+" "+stakeTransformation(currentStackTemp)+"</div>";  
                textDiv.innerHTML = popContentTemp;             //给div设置显示内容
                if(dom.byId("text") != null){            //判断提示框存在则移除提示框
                    dom.byId("map").removeChild(dom.byId("text"));   
                }
                dom.byId("map").appendChild(textDiv);    //把div添加到地图子节点中  
            }   
        });           

    }      

 

### 在ArcGIS中实现画线功能的教程 在ArcGIS中实现画线功能,可以使用ArcGIS JavaScript API提供的绘图工具(Draw Tools)。以下是一个完整的教程,涵盖如何设置环境、加载地图以及实现画线功能。 #### 1. 引入必要的API和样式文件 首先需要引入ArcGIS JavaScript API的样式和脚本文件。以下是标准的引用方式[^1]: ```html <link rel="stylesheet" href="https://js.arcgis.com/4.23/esri/themes/light/main.css" /> <script src="https://js.arcgis.com/4.23/"></script> ``` #### 2. 创建地图实例 创建一个基本的地图实例,并初始化视图。以下代码展示了如何加载地图并设置初始范围: ```javascript require([ "esri/Map", "esri/views/MapView", "esri/Graphic", "esri/layers/GraphicsLayer" ], function(Map, MapView, Graphic, GraphicsLayer) { const map = new Map({ basemap: "streets-vector" }); const view = new MapView({ container: "viewDiv", // HTML元素ID map: map, center: [-117.195, 34.056], zoom: 8 }); }); ``` #### 3. 添加绘图工具 ArcGIS API提供了`Draw`模块,用于实现绘制线条、多边形等功能。以下是实现画线功能的具体代码: ```javascript require([ "esri/views/MapView", "esri/Graphic", "esri/layers/GraphicsLayer", "esri/widgets/Draw", "esri/geometry/Polyline", "esri/symbols/SimpleLineSymbol" ], function(MapView, Graphic, GraphicsLayer, Draw, Polyline, SimpleLineSymbol) { const graphicsLayer = new GraphicsLayer(); view.map.add(graphicsLayer); const draw = new Draw({ view: view }); const lineSymbol = new SimpleLineSymbol({ color: [255, 0, 0], width: 3 }); draw.on("draw-complete", function(event) { if (event.geometry.type === "polyline") { const polylineGraphic = new Graphic({ geometry: event.geometry, symbol: lineSymbol }); graphicsLayer.add(polylineGraphic); } }); // 启动画线功能 draw.activate("polyline"); }); ``` 上述代码中,`Draw`模块通过`activate`方法启动画线功能,用户可以在地图上绘制一条或多条线段。完成后,线条将以红色显示,并存储在`GraphicsLayer`中[^3]。 #### 4. 图层样式定制 为了增强用户体验,可以对绘制的线条进行样式调整。例如,更改线条颜色、宽度或添加标签等。参考以下示例代码: ```javascript const customLineSymbol = new SimpleLineSymbol({ color: [0, 0, 255, 0.8], // 蓝色线条,透明度为80% width: 5, style: "short-dot" // 点划线样式 }); ``` 通过自定义符号系统,可以使地图信息表达更加清晰[^2]。 --- ### 注意事项 - 确保HTML容器(如`<div id="viewDiv"></div>`)已正确设置。 - 绘制完成后,可以通过`graphicsLayer.removeAll()`清除所有图形。 - 用户可以根据实际需求扩展功能,例如保存绘制结果或导出数据。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值