修改selectToUISlider实现历史影像的对比与显示

2014年12月7日,星期日,天气,晴,是个好日子,闲来无事,将selectToUISlider与Arcgis for JS结合起来,做了一个类似于历史影像对比的东西,共享出来给大家,希望对大家有所帮助。

首先,看看实现的效果:

初始化状态

在实例中,因为没有实际的做好的影像的切片,就用这个代替了,在实际实现的过程中可根据自己的实际需求去修改。

接下来,讲讲我的实现思路。

想要实现历史影像的对比,需要考虑以下两点问题:

1、数据源。

一般来说,为了操作方便,同时也为了展示方便,很多人的解决思路是直接用tif或者JPG的图片作为数据源。这种方式可以展示出变化,但是脱离了地图。

2、存储方式

直接用图片作为数据源的时候,你的数据怎么存储?文件的形式还是入库?当为地图服务的时候,切片?

有了数据源和存储方式,我们就可以继续讨论怎么实现了。在本文中是通过切片的方式做的,选择切片,原因有:1、能够与地图紧密的结合起来去展示;2、切片提高数据的访问效率与速度。

影像之间的切换是先将原来的图层remove掉,再重新实例化图层,再添加到map中去。

关键代码:

1、selectToUISlider.jQuery.js

jQuery.fn.selectToUISlider = function(settings){
	var selects = jQuery(this);

	//accessible slider options
	var options = jQuery.extend({
		labels: 3, //number of visible labels
		tooltip: true, //show tooltips, boolean
		tooltipSrc: 'text',//accepts 'value' as well
		labelSrc: 'value',//accepts 'value' as well	,
		sliderOptions: null,
        step:1,
        selectshow:true,
        orientation:"horizontal",
        baseUrl:""
	}, settings);

	//handle ID attrs - selects each need IDs for handles to find them
	var handleIds = (function(){
		var tempArr = [];
		selects.each(function(){
			tempArr.push('handle_'+jQuery(this).attr('id'));
		});
		return tempArr;
	})();

	//array of all option elements in select element (ignores optgroups)
	var selectOptions = (function(){
		var opts = [];
		selects.eq(0).find('option').each(function(){
			opts.push({
				value: jQuery(this).attr('value'),
				text: jQuery(this).text()
			});
		});
		return opts;
	})();

	//array of opt groups if present
	var groups = (function(){
		if(selects.eq(0).find('optgroup').size()>0){
			var groupedData = [];
			selects.eq(0).find('optgroup').each(function(i){
				groupedData[i] = {};
				groupedData[i].label = jQuery(this).attr('label');
				groupedData[i].options = [];
				jQuery(this).find('option').each(function(){
					groupedData[i].options.push({text: jQuery(this).text(), value: jQuery(this).attr('value')});
				});
			});
			return groupedData;
		}
		else return null;
	})();	

	//check if obj is array
	function isArray(obj) {
		return obj.constructor == Array;
	}
	//return tooltip text from option index
	function ttText(optIndex){
        return selectOptions[optIndex].text;
	}

    <strong>function changeMap(optIndex){
        require([
            "esri/layers/FeatureLayer"
        ],
            function(FeatureLayer){
                map.removeLayer(fch);
                var fchUrl  = options.baseUrl+selectOptions[optIndex].value;
                fch = new FeatureLayer(fchUrl);
                map.addLayer(fch);
            });
    }</strong>
	//plugin-generated slider options (can be overridden)
	var sliderOptions = {
		step: options.step,
		min: 0,
		orientation: options.orientation,
		max: selectOptions.length-1,
		range: selects.length > 1,//multiple select elements = true
		slide: function(e, ui) {//slide function
				var thisHandle = jQuery(ui.handle);
				//handle feedback
				var textval = ttText(ui.value);
				thisHandle
					.attr('aria-valuetext', textval)
					.attr('aria-valuenow', ui.value)
					.find('.ui-slider-tooltip .ttContent')
						.text( textval );

				//control original select menu
				var currSelect = jQuery('#' + thisHandle.attr('id').split('handle_')[1]);
				currSelect.find('option').eq(ui.value).attr('selected', 'selected');
                <strong>changeMap(ui.value);</strong>
		},
		values: (function(){
			var values = [];
			selects.each(function(){
				values.push( jQuery(this).get(0).selectedIndex );
			});
			return values;
		})()
	};

	//slider options from settings
	options.sliderOptions = (settings) ? jQuery.extend(sliderOptions, settings.sliderOptions) : sliderOptions;

	//select element change event
	selects.bind('change keyup click', function(){
		var thisIndex = jQuery(this).get(0).selectedIndex;
		var thisHandle = jQuery('#handle_'+ jQuery(this).attr('id'));
		var handleIndex = thisHandle.data('handleNum');
		thisHandle.parents('.ui-slider:eq(0)').slider("values", handleIndex, thisIndex);
	});

	//create slider component div
	var sliderComponent = jQuery('<div></div>');

	//CREATE HANDLES
	selects.each(function(i){
		var hidett = '';

		//associate label for ARIA
		var thisLabel = jQuery('label[for=' + jQuery(this).attr('id') +']');
		//labelled by aria doesn't seem to work on slider handle. Using title attr as backup
		var labelText = (thisLabel.size()>0) ? 'Slider control for '+ thisLabel.text()+'' : '';
		var thisLabelId = thisLabel.attr('id') || thisLabel.attr('id', 'label_'+handleIds[i]).attr('id');

		if( options.tooltip == false ){hidett = ' style="display: none;"';}
		jQuery('<a '+
				'href="#" tabindex="0" '+
				'id="'+handleIds[i]+'" '+
				'class="ui-slider-handle" '+
				'role="slider" '+
				'aria-labelledby="'+thisLabelId+'" '+
				'aria-valuemin="'+options.sliderOptions.min+'" '+
				'aria-valuemax="'+options.sliderOptions.max+'" '+
				'aria-valuenow="'+options.sliderOptions.values[i]+'" '+
				'aria-valuetext="'+ttText(options.sliderOptions.values[i])+'" '+
			'><span class="screenReaderContext">'+labelText+'</span>'+
			'<span class="ui-slider-tooltip ui-widget-content ui-corner-all"'+ hidett +'><span class="ttContent"></span>'+
				'<span class="ui-tooltip-pointer-down ui-widget-content"><span class="ui-tooltip-pointer-down-inner"></span></span>'+
			'</span></a>')
			.data('handleNum',i)
			.appendTo(sliderComponent);
	});

	//CREATE SCALE AND TICS

	//write dl if there are optgroups
	if(groups) {
		var inc = 0;
		var scale = sliderComponent.append('<dl class="ui-slider-scale ui-helper-reset" role="presentation"></dl>').find('.ui-slider-scale:eq(0)');
		jQuery(groups).each(function(h){
			scale.append('<dt style="width: '+ (100/groups.length).toFixed(2) +'%' +'; left:'+ (h/(groups.length-1) * 100).toFixed(2)  +'%' +'"><span>'+this.label+'</span></dt>');//class name becomes camelCased label
			var groupOpts = this.options;
			jQuery(this.options).each(function(i){
				var style = (inc == selectOptions.length-1 || inc == 0) ? 'style="display: none;"' : '' ;
				var labelText = (options.labelSrc == 'text') ? groupOpts[i].text : groupOpts[i].value;
				scale.append('<dd style="left:'+ leftVal(inc) +'"><span class="ui-slider-label">'+ labelText +'</span><span class="ui-slider-tic ui-widget-content"'+ style +'></span></dd>');
				inc++;
			});
		});
	}
	//write ol
	else {
		var scale = sliderComponent.append('<ol class="ui-slider-scale ui-helper-reset" role="presentation"></ol>').find('.ui-slider-scale:eq(0)');
		jQuery(selectOptions).each(function(i){
			var style = (i == selectOptions.length-1 || i == 0) ? 'style="display: none;"' : '' ;
			var labelText = (options.labelSrc == 'text') ? this.text : this.value;
			scale.append('<li style="left:'+ leftVal(i) +'"><span class="ui-slider-label">'+ labelText +'</span><span class="ui-slider-tic ui-widget-content"'+ style +'></span></li>');
		});
	}

	function leftVal(i){
		return (i/(selectOptions.length-1) * 100).toFixed(2)  +'%';

	}
	function onChange(value){
        ttText(value);
    }

	//show and hide labels depending on labels pref
	//show the last one if there are more than 1 specified
	if(options.labels > 1) sliderComponent.find('.ui-slider-scale li:last span.ui-slider-label, .ui-slider-scale dd:last span.ui-slider-label').addClass('ui-slider-label-show');

	//set increment
	var increm = Math.max(1, Math.round(selectOptions.length / options.labels));
	//show em based on inc
	for(var j=0; j<selectOptions.length; j+=increm){
		if((selectOptions.length - j) > increm){//don't show if it's too close to the end label
			sliderComponent.find('.ui-slider-scale li:eq('+ j +') span.ui-slider-label, .ui-slider-scale dd:eq('+ j +') span.ui-slider-label').addClass('ui-slider-label-show');
		}
	}

	//style the dt's
	sliderComponent.find('.ui-slider-scale dt').each(function(i){
		jQuery(this).css({
			'left': ((100 /( groups.length))*i).toFixed(2) + '%'
		});
	});

	//inject and return
	sliderComponent
	.insertAfter(jQuery(this).eq(this.length-1))
	.slider(options.sliderOptions)
	.attr('role','application')
	.find('.ui-slider-label')
	.each(function(){
		jQuery(this).css('marginLeft', -jQuery(this).width()/2);
	});

	//update tooltip arrow inner color
	sliderComponent.find('.ui-tooltip-pointer-down-inner').each(function(){
				var bWidth = jQuery('.ui-tooltip-pointer-down-inner').css('borderTopWidth');
				var bColor = jQuery(this).parents('.ui-slider-tooltip').css('backgroundColor')
				jQuery(this).css('border-top', bWidth+' solid '+bColor);
	});

	var values = sliderComponent.slider('values');

	if(isArray(values)){
		jQuery(values).each(function(i){
			sliderComponent.find('.ui-slider-tooltip .ttContent').eq(i).text( ttText(this) );
		});
	}
	else {
		sliderComponent.find('.ui-slider-tooltip .ttContent').eq(0).text( ttText(values) );
	}
	if(!options.selectshow){
        this.css("display","none");
    }
	return this;
}

代码中,加粗的为重点代码。

2、map.html

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
    <title></title>
    <link rel="stylesheet" href="jquery-slider/css/redmond/jquery-ui-1.7.1.custom.css" type="text/css" />
    <link rel="Stylesheet" href="jquery-slider/css/ui.slider.extras.css" type="text/css" />
    <link rel="stylesheet" href="http://localhost/arcgis_js_api/library/3.9/3.9/js/esri/css/esri.css">
    <style type="text/css">
        html, body, #map {
            height: 100%;
            margin: 0;
            padding: 0;
            font-size: 62.5%;
            font-family:"Segoe UI","Helvetica Neue",Helvetica,Arial,sans-serif;
        }
        fieldset {
            background: #fff;
            border:0;
            margin: 0em 4em;
            height: 4em;
        }
        label {
            font-weight: normal;
            float: left;
            margin-right: .5em;
            font-size: 1.1em;
        }
        select {
            margin-right: 1em;
            float: left;
        }
    </style>
    <script src="jquery-slider/jquery-1.8.3.js"></script>
    <script src="jquery-slider/jquery-ui-1.7.1.custom.min.js"></script>
    <script src="jquery-slider/selectToUISlider.jQuery.js"></script>
    <script src="http://localhost/arcgis_js_api/library/3.9/3.9/init.js"></script>
    <script type="text/javascript">
        var map, fch;
        require([
            "esri/map",
            "esri/layers/ArcGISTiledMapServiceLayer",
            "esri/layers/FeatureLayer",
            "esri/geometry/Point",
            "dojo/domReady!"],
                function(Map,
                     Tiled,
                     FeatureLayer,
                     Point)
                {
                    map = new Map("map",{logo:false});
                    var tiled = new Tiled("http://localhost:6080/arcgis/rest/services/image/MapServer");
                    map.addLayer(tiled);
                    var mapCenter = new Point(103.847, 36.0473, map.spatialReference);
                    map.centerAndZoom(mapCenter,4);
                   <strong> map.on("load",function(){
                        fch = new FeatureLayer("http://localhost:6080/arcgis/rest/services/china/MapServer/6");
                        map.addLayer(fch);
                        $('select#layers').selectToUISlider({
                            labels:6,
                            tooltip:true,
                            step:1,
                            selectshow:false,
                            baseUrl:"http://localhost:6080/arcgis/rest/services/china/MapServer/",
                            orientation:"horizontal"//vertical,horizontal
                        });
                    });</strong>
                });
    </script>
</head>
<body>
<div id="map">
    <div style="position: absolute; bottom: 0px; left:35%; width: 600px;z-index: 99;">
        <strong><fieldset>
            <select name="layers" id="layers">
                <optgroup label="省级">
                    <option value="6">省会城市</option>
                    <option value="0">省级行政区</option>
                </optgroup>
                <optgroup label="市级">
                    <option value="4">地级市</option>
                    <option value="1">地州界</option>
                </optgroup>
                <optgroup label="县级">
                    <option value="3">县城驻地</option>
                    <option value="2">市县界</option>
                </optgroup>
            </select>
        </fieldset></strong>
    </div>
</div>
</body>
</html>

在本实例中由于数据的关系是通过FeatureLayer来实现的,你可以通过ArcGISTiledMapServiceLayer来实现。

如有疑问,请联系:

QQ:1004740957

Email:[email protected]

加我或者来邮件请说明来意,谢谢!

时间: 2024-10-12 16:01:04

修改selectToUISlider实现历史影像的对比与显示的相关文章

nginx 安全笔记 (修改nginx的header信息和错误显示版本号)

随笔记载,欢迎指正: 修改nginx的header信息和错误显示版本号 1.隐藏版本号: nginx的配置文件nginx.conf找到http栏目加入: server_tokens off; 2.修改显示nginx的名称 需要修改源码文件: /opt/soft/nginx-1.2.0/src/http/ngx_http_special_response.c vi /opt/soft/nginx-1.2.0/src/http/ngx_http_special_response.c 找到29行: 2

dedecms后台每页文章条数如何修改(“文档列表”每一页显示的文档条数)

小明在学习采集,弄了个dedecms作为发布平台,几个小时后跑来报喜说好简单,但又不想制造那么多spam,每个分类只保留几条就好.在后台删除这些文章,每页只显示30个,看了下有100多页,立马沮丧了,数据库批量删除又不会.问我要怎么修改“文档列表”每一页显示的文档条数. 打开这个文件dede/content_list.php(dede是后台目录,一般会改名),找到$dlist->pageSize = 30;将默认的30改为300,以后打开文章列表每页就显示300条了,数字可以自行设置,but设置

修改ECSHOP后台的商品列表里显示该商品品牌

如何在在ECSHOP后台的商品列表中也显示商品的品牌”.下面就来最模板讲一下如何来修改.此方法只保证在ECSHOP2.7.2版本下有效,其他版本请参照修改. 第一步:首先我们来打开程序文件: /admin/includes/lib_goods.php 定位到 goods_list  函数部分 找到下面代码(大概在911行左右) $sql = "SELECT goods_id, goods_name, goods_type, goods_sn, shop_price, is_on_sale, is

怎样修改 Openstack Horizon(Dashboard)的显示界面 (二)

上一篇文章介绍了 Dashboard 的基本结构框架,那接下来的问题就是如何在这个框架中加入我们自己想要的内容了.在真正动手之前,让我们先来看看官方的页面是怎么做出来的.首先我们进入 /usr/share/openstack-dashboard/openstack_dashboard/dashboards/admin/networks 文件夹下面,可以看到有这几个文件和子文件夹: ../networks: - __init__.py - ports/ - subnets/ - templates

如何修改magento分类页面的产品的显示个数

经常的有客户问,怎么修改分类页面的产品的个数 这个是magneto后台操作的设置问题 打开后台,在英文状态下: system-->configuration 进入后,点击catalog Products per Page on Grid Allowed Values.这个就是在gird方式下,显示的个数的分列值,每个值用逗号隔开. Products per Page on Grid Default Value这个是在grid方式下默认的个数,这个值必须是上面填写的值其中的一个,否则会报错! OK

Android :修改头像并使用Bmob保存(显示为圆形)

这几天再写一个项目 之前写登陆注册界面的时候都没有涉及到头像和数据库 所以都比较好实现 这次加上了头像的部分 可以实现和网上的第三方数据库的连接 第三方数据库我使用的是Bmob Bmob 主页 很方便 我们先看一下成果 所以这里面其实东西也还挺多的 所以这篇博客会从这几个方面去介绍如何完成的 1 Bmob的基础配置和注册登录的使用 2 点击修改Button可以出现相册 并且选择一个之后再显示到原来头像位置 3 把头像设置为圆形 选择新头像不论是什么形状都可以显示为圆形 4 上传头像到Bmob 5

修改linux命令行提示符全路径显示

修改~/.bashrc文件 export PS1='[\[email protected]\h \w]\$ ' \d :代表日期,格式为weekday month date,例如:"Mon Aug 1" \H :完整的主机名称.例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux \h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略 \t :显示时间为24小时格式,如:HH:MM:SS \T :显示时间为12小时格式 \A :显示时间为24小时格

ddt源码修改:HtmlTestRunner报告依据接口名显示用例名字

背景是这样的: 自己写了一套接口自动化的框架,其中使用unittest + ddt + excel作为数据驱动模式的应用,使用HtmlTetstRunner来生成测试用例. 一切看起来很完美. 但是,发现测试报告中,测试用例名称都是:test_api_index.index表示用例的编号,从1开始,递增.比如:test_api_01.test_api_02......test_api_0N 希望能在不同的用例名称当中,显示相应的接口用例名字.比如登陆接口的成功登陆用例:测试报告中用例名称显示为t

传窗体(例子是点完修改页面的修改后,直接在主窗体显示修改后的内容,不用再点一次查询)

private void button3_Click(object sender, EventArgs e) { if(listView1.SelectedItems.Count>0) { string x = listView1.SelectedItems[0].Text; supdate f = new supdate(this,x); //this是当前窗体,就是主窗体 f.Show(); } } private Score Y; private string X; public supd