ArcGIS JS API 实现路径轨迹回放

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>轨迹回放</title>
    <script type="text/javascript" src="js/jquery-1.8.2.min.js"></script>
    <link rel="stylesheet" href="https://js.arcgis.com/3.27/esri/css/esri.css">
    <script src="https://js.arcgis.com/3.27/"></script>
    <link rel="stylesheet" href="https://js.arcgis.com/3.27/dijit/themes/tundra/tundra.css">
    <style>
        html,body{display: block;width:100%;height:100%;margin:0;padding:0;}
        *{font-size:14px;font-family: "微软雅黑";color:#333;outline: none;}
        #mapDiv{width: 100%;height: 100%;}
        #legendDiv{
          background-color: #fff;
          position: absolute !important;
          z-index: 99;
          top:10px;
          right:120px;
        }
        .btns{position: absolute;top:10px;left:15px;background: #fff;widht:200px;height:30px;padding:5px 8px;}
        .btns input{border:none;background: blue;color:#fff;font-weight: bold;width: 80px;height: 28px;line-height: 28px;border-radius: 4px;cursor: pointer;}
        .btns .act{background: #f00;}
    </style>
</head>
<body>
<div id="mapDiv"></div>
<div class="btns">
    <input id="Button1" type="button" value="定位"/>
    <input id="Button2" type="button" value="回放"/>
</div>
<script type="text/javascript">
require(["esri/map",
        "esri/geometry/Extent",
        "esri/geometry/Point",
        "esri/SpatialReference",
        "esri/geometry/webMercatorUtils",
    ], function(Map,Extent,Point,SpatialReference,webMercatorUtils) {
    var globalSR = new SpatialReference(4326);
    //初始化地图
    var map = new Map("mapDiv", {
        center: [116.7483362341,36.5528927553],
        zoom: 16,
        basemap: "osm",
        showLabels : true,
        logo:false,
        slider:false,
        spatialReference:globalSR,
        extent: new Extent({spatialReference:globalSR}),
        wrapAround180:true,
        geographicExtent:new Extent({spatialReference:globalSR}),
    });
    var layer1 = esri.layers.GraphicsLayer();
    map.addLayer(layer1);

    var isPos=false;
    var posList = [];

    map.on('click', function(event) {
        if(!isPos) return false;
        var point = event.mapPoint;
        var geometry = webMercatorUtils.webMercatorToGeographic(point);
        var lng = geometry.x;
        var lat = geometry.y;

        //画点
        var symbol = new esri.symbol.PictureMarkerSymbol('images/marker_red_hd.png', 39, 25);
        symbol.setOffset(10,12.5);
        var point = new Point(lng, lat);
        var graphic = new esri.Graphic(point,symbol);
        layer1.add(graphic);

        var date=new Date();
        var hour = date.getHours();
        var minute = date.getMinutes();
        var second = date.getSeconds();
        var name = hour+":"+minute+":"+second;
        posList.push({lng:lng,lat:lat,name:name});
    });

    var lineLayer;
    var carLayer;
    var carSymbol;
    var carurl = "./images/car.png";;

    lineLayer = new esri.layers.GraphicsLayer("lineLayer");
    map.addLayer(lineLayer);

    carLayer = new esri.layers.GraphicsLayer("carLayer");
    map.addLayer(carLayer);

    carSymbol = new esri.symbol.PictureMarkerSymbol(carurl, 55, 36);

    var playTimer;
    var timer;
    function trajRun(posList,isLine){
        var speed = 10;
        var speed2 = 40;
        var carIndex = 0;

        lineLayer.clear();
        carLayer.clear();
        if(timer) clearTimeout(timer);
        if(playTimer) clearTimeout(playTimer);
        //划线
        function drowPolyline(){
            //清除之前绘制
            lineLayer.clear();
            var path = [];
            for(var i=0,len=posList.length;i<len;i++){
                var point = [posList[i].lng,posList[i].lat];
                path.push(point);
            }

            // 生成绘制的图形
            var polylineJson = {
                "paths":[path],
                "spatialReference":{"wkid":4326}
              };
            var polyline = new esri.geometry.Polyline(polylineJson);
            var graphic = new esri.Graphic({
                "geometry":polyline,
                "symbol":{
                    "color":[0,0,0,0],
                    "outline":{
                        "color":[255,0,0,255],
                        "width":2,
                        "type":"esriSLS",
                        "style":"esriSLSSolid"
                    },
                    "type":"esriSFS",
                    "style":"esriSFSSolid"
                }
            });
            lineLayer.add(graphic);
        }

        /**
         * 图片运动
         */
        var index=0;
        var intvaltime=0;
        function runStart () {
            if(posList.length == 0){
                return false;
            }
            if(timer) clearTimeout(timer);
            timer = setTimeout(function () {
                if(index == posList.length - 1) {
                    if(timer) clearTimeout(timer);
                } else {
                    var p1 = changePosXY(posList[index]);
                    var p2 = changePosXY(posList[++index]);
                    var tempPoints = interpolation(p1, p2, speed);
                    var angle = Math.ceil(Angle(p1.x, p1.y, p2.x, p2.y))
                    carSymbol.setAngle(angle)   //设置小车角度
                    console.log(angle);
                    if(Math.abs(angle)>=80 && Math.abs(angle)<=100){
                        if(angle<0){
                            carSymbol.setOffset(-17.5,0);
                        }else{
                            carSymbol.setOffset(17.5,0);
                        }
                    }else if(Math.abs(angle)>=90){
                        carSymbol.setOffset(0,-18);
                    }else{
                        carSymbol.setOffset(0,18);
                    }
                    carIndex=0;
                    play(tempPoints);

                    intvaltime = tempPoints.length*speed2;
                    if(index < posList.length-1){
                        runStart();
                    }
                }
            }, intvaltime);
        }
        /**
         *经纬度转墨卡托
         */
        function changePosXY(pt){
            var lnglat = webMercatorUtils.lngLatToXY(pt.lng,pt.lat);
            return {x:lnglat[0],y:lnglat[1]};
        }
        /**
         *墨卡托转经纬度
         */
        function changePosPoint(pt){
            var lnglat = webMercatorUtils.xyToLngLat(pt.x,pt.y);
            return {lng:lnglat[0],lat:lnglat[1]};
        }
        /**
        * 根据回放速度在两点之间进行插值
        */
        function interpolation (pointA, pointB, speed){
            var tmp = [];
            if (speed == undefined) {
                speed = 2;
            }
            var count = Math.abs(speed);

            var x1 = Math.abs(pointB.x - pointA.x);
            var y1 = Math.abs(pointB.y - pointA.y);
            var z1 = Math.sqrt(x1*x1+y1*y1);
            count = z1/count;

            var disX = (pointB.x - pointA.x) / count;
            var disY = (pointB.y - pointA.y) / count;
            var i = 0;
            while (i <= count) {
                var x = pointA.x + i * disX;
                var y = pointA.y + i * disY;
                tmp.push({x:x,y:y});
                i++;
            }
            tmp.push(pointB);//防止插值出来的最后一个点到不了B点
            return tmp;
        }
        /*
        *计算图片的角度
         */
        function Angle (startx, starty, endx, endy) {
            var tan = 0
            if (endx == startx) {
                tan = Math.atan(0) * 180 / Math.PI
            } else {
                tan = Math.atan(Math.abs((endy - starty) / (endx - startx))) * 180 / Math.PI;
            }

            if (endx >= startx && endy >= starty)//第一象限
            {
                return -tan;
            } else if (endx > startx && endy < starty)//第四象限
            {
                return tan;
            } else if (endx < startx && endy > starty)//第二象限
            {
                return tan - 180;
            } else {
                return 180 - tan;  //第三象限
            }
        }
        /**
        * 播放
        */
        function play(tmpPoints) {
            if(playTimer) clearTimeout(playTimer);
            playTimer = setTimeout(function () {
                if (carIndex < tmpPoints.length - 1) {
                    carLayer.clear();
                    var point = changePosPoint(tmpPoints[carIndex + 1]);
                    point = new Point(point.lng,point.lat);
                    var carGriphic = new esri.Graphic(point, carSymbol);
                    carLayer.add(carGriphic);
                    carIndex++;
                    play(tmpPoints);
                }else {
                    carIndex = 0;
                    clearTimeout(playTimer);
                }
            }, speed2);
        }

        if(isLine){
            drowPolyline();
        }
        runStart();
    };

    $("#Button1").click(function(){
        isPos = !isPos;
        if(isPos){
            posList=[];
            $(this).addClass('act').val("确定");
        }else{
            $(this).removeClass('act').val("定位");
        }
    })

    $("#Button2").click(function() {
        if(posList.length>0){
            trajRun(posList,true);
        }
    });
});
</script>
</body>
</html>

 

参考文章 https://blog.csdn.net/wml00000/article/details/83686058

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 答1: ArcGIS JS API是一款基于JavaScript的GIS应用程序编程接口,可以轻松实现各种GIS应用。动态轨迹线是一种非常常见的GIS应用,可以用来展示航行船舶、移动物体等的运动轨迹。在ArcGIS JS API中,动态轨迹线可以通过以下几个步骤实现: 1. 准备数据:首先需要准备运动轨迹数据,包括每一时刻该物体的位置、速度、航向等信息。这些数据可以从GPS、传感器等设备中获取,也可以使用模拟数据进行实验。 2. 绘制图层:使用ArcGIS JS API中的GraphicsLayer类来绘制图层,并将图层添加到地图中。为了实现动态效果,可以使用setInterval()函数定时更新图层数据。 3. 设置符号:利用SimpleLineSymbol类来设置轨迹线的样式,包括颜色、宽度、虚实等。 4. 更新数据:在定时更新的函数中,利用GraphicsLayer的clear()方法清除上一帧的数据,然后用新的位置数据更新GraphicsLayer的graphics数组即可。 5. 实现动态效果:为了展示动态效果,可以使用AnimationUtils类来控制轨迹线的动画效果。比如,可以使用move()方法让轨迹线沿着指定路径移动,或者使用fadeIn()、fadeOut()等方法控制轨迹线的出现和消失效果。 总之,ArcGIS JS API提供了丰富的类和方法,可以轻松实现动态轨迹线效果。只需要准备好数据,选择适当的类和方法,就可以创建出令人惊叹的GIS应用。 ### 答2: ArcGIS JS API 是一个用于构建 WebGIS 应用程序的 JavaScript 库,可以提供地图显示、定位、搜索和分析等功能。使用该库,可以轻松实现动态轨迹线。 首先,需要获取轨迹数据。一般来说,轨迹数据包括时间戳、经度、纬度等信息。可以从设备或数据库中获得,也可以通过接口实时获取。 其次,需要定义一个轨迹线样式。可以定义颜色、线宽、透明度等属性,以使轨迹线看起来更加美观。 接下来,需要使用 ArcGIS JS API 创建一个 MapView,将轨迹数据添加到地图上。可以使用 GraphicsLayer 将轨迹数据转换为轨迹线,并将其添加到地图上。然后可以启动定时器,并在每个时间戳更新轨迹线。 需要在定时器事件中将轨迹数据添加到轨迹线图层中,并更新地图视图。可以使用 Polyline、Graphic等类来处理轨迹线。 最后,需要在地图上添加一些控件,以便用户可以控制轨迹线的显示和隐藏。可以使用 ToggleButton 控制轨迹线的显示和隐藏。 综上所述,实现动态轨迹线需要以下步骤: 1. 获取轨迹数据 2. 定义轨迹线样式 3. 创建 MapView,添加轨迹线图层 4. 启动定时器 5. 在定时器事件中更新轨迹线 6. 添加控件,控制轨迹线的显示和隐藏 以上是实现动态轨迹线的基本步骤。具体实现时,还需要根据实际需求进行调整和优化。 ### 答3: arcgis js api 是一款使用 JavaScript 编写的地图应用程序接口,它能够方便地实现在 Web 应用程序中构建交互式地图和地图组件。在 arcgis js api实现动态轨迹线需要以下步骤: 1. 准备数据 首先,需要准备好需要绘制的轨迹线的数据。可以使用 GPS 数据、传感器数据、飞行控制数据或任何有坐标信息的数据来绘制动态轨迹线。数据需要包含经度和纬度的坐标信息、高度信息、时间戳或时间信息等。 2. 加载地图 在 arcgis js api 中使用 esri/Map 模块加载地图,可以从 arcgis online 或本地地图服务中加载地图。可以选择使用卫星、矢量或混合视图,以及设置地图的初始缩级别和中心点。 3. 添加图层 使用 esri/Graphic 和 esri/layers/GraphicsLayer 模块添加 GraphicsLayer 图层,并将轨迹线数据添加到图层中。 4. 绘制轨迹线 使用 esri/geometry/Point 和 esri/geometry/Polyline 模块从轨迹线数据中获取经纬度坐标信息,并将它们转换为多边形点坐标信息,再将多边形点坐标信息填充到 Polyline 对象中,最后使用 esri/Graphic 模块将 Polyline 对象添加到 GraphicsLayer 图层中。 5. 更新轨迹线 随着时间的推移,更新轨迹线需要在 Polygon 对象中添加新的点坐标信息,然后使用 GraphicsLayer 对象的 remove 和 add 方法更新轨迹线图层,使其可视化效果实现动态轨迹线。 总之,ArcGIS JS API 实现动态轨迹线需要加载地图,添加图层,绘制轨迹线,更新轨迹线等步骤。可以使用客户端钩子来实现轨迹线的实时更新,使动态轨迹线更加真实。在地图应用程序中实现动态轨迹线可以在交互性和可视化效果上增强用户体验,从而实现更好的地图服务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值