arcgis api for javascript学习-时间滑块TimeSlider实现(影像服务)


前言

时间滑块可以用来观察历史数据和当前数据的差异,由于本人的菜鸡操作,查阅了一些资料,才勉强实现了将官方demo的矢量数据的时间滑块做成了影像数据的时间滑块。不过里面有一堆bug,不知道实际的项目上是怎么做的,希望大佬看见能指点一二.


一、准备数据及发布影像服务

1.1 新建一个文件数据库

在这里插入图片描述

1.2 新建一个镶嵌数据集

在这里插入图片描述

1.3 将每年的数据导入到一个镶嵌数据集

在这里插入图片描述

1.4 建一个总的将每年的镶嵌数据集导入:

在这里插入图片描述

1.5 给总的镶嵌数据集建立一个时间字段,添加上影像对应的时间

在这里插入图片描述

1.6 右键总的镶嵌数据集,属性,启用时间

在这里插入图片描述

1.7 发布影像服务,右键共享为影像服务.

在这里插入图片描述

二、代码实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My TimeSlider</title>
    <link rel="stylesheet" href="https://js.arcgis.com/3.34/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="https://js.arcgis.com/3.34/esri/css/esri.css">
    <style>
        html, body, #mapDiv {
            padding:0;
            margin:0;
            height:100%;
        }

        #mapDiv {
            position: relative;
        }

        #bottomPanel {
            left: 50%;
            margin: 0 auto;
            margin-left: -500px;
            position: absolute;
            bottom: 2.5em;
        }

        #timeInfo{
            border-radius: 4px;
            border: solid 2px #ccc;
            background-color: #fff;
            display: block;
            padding: 5px;
            position: relative;
            text-align: center;
            width: 1000px;
            z-index: 99;
        }
    </style>
    <script src="https://js.arcgis.com/3.34/"></script>
    <script>
        var map;
        require([
            "esri/map", "esri/layers/ArcGISImageServiceLayer",    "esri/layers/ArcGISDynamicMapServiceLayer","esri/layers/ArcGISTiledMapServiceLayer",
            "esri/TimeExtent", "esri/dijit/TimeSlider",
            "dojo/_base/array", "dojo/dom", "dojo/domReady!"
        ], function(
            Map, ArcGISImageServiceLayer,ArcGISDynamicMapServiceLayer,ArcGISTiledMapServiceLayer,
            TimeExtent, TimeSlider,
            arrayUtils, dom
        ) {
            // map = new Map("mapDiv", {
            //     basemap: "streets",
            //     center: [104.07325, 30.67585],// 成都:104.07325728412745,30.675855836106336
            //     zoom: 9
            // });
            map = new Map("mapDiv",{
                center: [104.07325, 30.67585],// 成都:104.07325728412745,30.675855836106336
                zoom: 9
            });

            var imgLayer = new ArcGISImageServiceLayer("http://localhost:6080/arcgis/rest/services/TestServer/slidertest/ImageServer");

            //add the gas fields layer to the map
            map.addLayers([imgLayer]);

            map.on("layers-add-result", initSlider);
            map.on("click",function (e) {
                console.log(e.mapPoint.getLatitude());
                console.log(e.mapPoint.getLongitude());
                console.log(map.spatialReference);
            });
            function initSlider() {
                var timeSlider = new TimeSlider({
                    style: "width: 100%;"
                }, dom.byId("timeSliderDiv"));

                map.setTimeSlider(timeSlider);

                var timeExtent = new TimeExtent();
                timeExtent.startTime = new Date("12/31/2010 UTC");
                timeExtent.endTime = new Date("12/31/2014 UTC");
                //这个东西用来设置滑块的拇指,1为一个;2为两个(左右滑块)。
                timeSlider.setThumbCount(1);
                //为输入时间范围创建指定的时间停止数。说直白一点就是时间的刻度。
                //三个参数:时间滑块的起始范围   时间刻度间隔   时间单位
                timeSlider.createTimeStopsByTimeInterval(timeExtent, 1, "esriTimeUnitsYears");
                // timeSlider.createTimeStopsByTimeInterval(timeExtent);
                // timeSlider.createTimeStopsByCount(timeExtent,5);
                //一个数组参数:第一个值决定第一个拇指放在哪里。
                //如果它是一个双拇指滑块,则第二个值将确定附加拇指的位置,位置是由刻度决定的。
                // timeSlider.setThumbIndexes([0,1]);
                //更改动画播放的速率,默认值1500
                timeSlider.setThumbMovingRate(2000);
                // 开启时间滑块
                timeSlider.startup();

                //add labels for every other time stop
                // 每隔一个时间点添加一个标注,下面这个代码就是在遍历timeStops
                // console.log(timeSlider.timeStops);
                var labels = arrayUtils.map(timeSlider.timeStops, function(timeStop, i) {
                    if ( i % 1 === 0 ) {//就是设置时间刻度上标注的时间,%3就表示隔三个标注一个时间
                        return timeStop.getUTCFullYear();
                    } else {
                        return "";
                    }
                });

                timeSlider.setLabels(labels);

                timeSlider.on("time-extent-change", function(evt) {
                    var startValString = evt.startTime.getUTCFullYear();
                    var endValString = evt.endTime.getUTCFullYear();
                    dom.byId("daterange").innerHTML = "<i>" + startValString + " and " + endValString  + "</i>";
                });
            }
        });
    </script>
</head>
<body>
<div id="mapDiv">
    <div id="bottomPanel">
        <div id="timeInfo">
            <div>image<span id="daterange">2010 to 2014</span></div>
            <div id="timeSliderDiv"></div>
        </div>
    </div>
</div>
</body>
</html>

结果如下:
在这里插入图片描述


三.存在的问题

1. 这个实现的结果很明显有两个时间的影像并没有被切换
2. 效果差:每次切换时间的时候,影像都会闪一下.
3. 请问实际项目时怎么实现切换这种具有时间的底图影像的呢

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值