ArcGIS For JavaScript API continuous pan across dataline(连续的平移跨越日界线)————(六)

描述:

2.2版本的ArcGIS API为JavaScript可以指定该地图将支持连续的平移跨越日界线此功能可用于地图的空间参考WGS84WKID= 4326)Web墨卡托WKID=102113)启用功能设置为true,地图的构造optionwrapAround180

         map = new esri.Map("map", {wrapAround180:true,extent:extent});

    注:仅支持环绕的动态地图服务,这是10或更高版本

         实现的效果是在地图上绘制符号,清除,并鼠标跟踪坐标显示

 

Dojo在线帮助API:http://dojotoolkit.org/api/

在线ArcGIS For JavaScript API:http://help.arcgis.com/en/webapi/javascript/arcgis/help/jssamples_start.htm

演示地址:http://help.arcgis.com/en/webapi/javascript/arcgis/samples/map_wraparound/index.html

 

 代码分析如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=7,IE=9" />
<!--The viewport meta tag is used to improve the presentation and behavior of the samples  on iOS devices-->
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" />
<title>Continuous pan across dateline</title>
<link rel="stylesheet" type="text/css" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.2/js/dojo/dijit/themes/claro/claro.css">
<link rel="stylesheet" type="text/css" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.2/js/esri/css/esri.css" />

<style>
html,body {
	height: 100%;
	width: 100%;
	margin: 0;
	padding: 0;
}

.esriScalebar {
	padding: 20px 20px;
}

#map {
	padding: 0;
	border: solid 2px;
	#656868;
}

.details {
	font-size: 14px;
	font-weight: 700;
}

#coordsInfo {
	position: absolute;
	left: 5px;
	bottom: 5px;
	font-family: " Helvetica;
	font-weight: 800;
	color: #333399;
	z-index: 50;
	font-size: 14pt;
}
</style>
<script type="text/javascript">
	var djConfig = {	// dojo配置
		parseOnLoad : true
	};
</script>
<script type="text/javascript" src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=3.2"></script>
<script type="text/javascript">
	// 引入包
	dojo.require("dijit.layout.BorderContainer");
	dojo.require("dijit.layout.ContentPane");
	dojo.require("esri.map");
	dojo.require("dijit.Tooltip");

	var map;	
	var geodesicGraphic;	// 测量图形
	var drawGeodesic = false;	// 是否开始绘制图形
	var startLoc, endLoc;	// 开始点和结束点
	var inputSymbol, resultSymbol, markerSymbol;	// 拖拽时符号, 最终结果符号, 标记符号
	var geometryService;	// 几何服务

	/**
	 * 初始化函数
	 */
	function init() {
		// esri.tasks.GeometryService(url); 创建一个新的GeometryService对象。 URL是一个必要的参数
		geometryService = new esri.tasks.GeometryService("http://tasks.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer");

		// 设置范围
		var extent = new esri.geometry.Extent({
			"xmin" : 2.98,		// 左下角X坐标
			"ymin" : 17.48,		// 左下角Y坐标 
			"xmax" : 102.65,	// 右上角X坐标
			"ymax" : 58.35,		// 右上角Y坐标
			"spatialReference" : {	// 空间参考
				"wkid" : 4326
			}
		});

		// esri.Map(divId, options?),options可选参数,有很多,参考api
		map = new esri.Map("map", {
			wrapAround180 : true,	// 如果为true,支持连续泛跨越日界线,类似与无缝滚动marquee效果
			extent : esri.geometry.geographicToWebMercator(extent)	// 地图图形范围
		});
		// 加入全球街底图。 ArcGIS Online的网站服务 http://arcgisonline/home/search.html?t=content&f=typekeywords:service    
		var basemap = new esri.layers.ArcGISTiledMapServiceLayer("http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer");
		map.addLayer(basemap);

		/**
		 * SimpleLineSymbol(),线符号用于在图形图层上绘制的线性特征,可以是实线或短划线和点,破折号等预定义的模式。
		 * esri.symbol.SimpleLineSymbol();esri.symbol.SimpleLineSymbol(json);esri.symbol.SimpleLineSymbol(style,color,width)3种构造函数
		 
		 * SimpleMarkerSymbol,用于显示作为一个简单的形状。  
		 * esri.symbol.SimpleMarkerSymbol(json),esri.symbol.SimpleMarkerSymbol(),esri.symbol.SimpleMarkerSymbol(style, size, outline, color)3种构造函数
		 */
		inputSymbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASH, new dojo.Color([ 255, 0, 0 ]), 2);	// 拖拽时符号
		resultSymbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([ 255, 0, 0 ]), 2);	// 最终显示结果符号
		
		markerSymbol = new esri.symbol.SimpleMarkerSymbol(	// 标记符号
				esri.symbol.SimpleMarkerSymbol.STYLE_DIAMOND,	// 样式,STYLE_CIRCLE(●),STYLE_CROSS(+),STYLE_DIAMOND(◆),STYLE_SQUARE(■),STYLE_X(X)
				10,		// 像素
				new esri.symbol.SimpleLineSymbol(
					esri.symbol.SimpleLineSymbol.STYLE_SOLID,	//样式,STYLE_DASH,STYLE_DASHDOT,STYLE_DASHDOTDOT,STYLE_DOT,STYLE_NULL,STYLE_NULL
					new dojo.Color(
						[255, 0, 0, 0.5]	// 颜色,0.5为透明度
					),6		// 像素
				),
				new dojo.Color(
						[255, 0, 0, 0.9]
					)
				);
		
		dojo.connect(map, 'onLoad', function(theMap) {	// 初始化加载事件
			// 设定绘图事件
			dojo.connect(map, "onMouseDragStart", onMouseDragStart);	// 鼠标绘制开始事件
			dojo.connect(map, "onMouseDrag", onMouseDrag);			// 鼠标拖动事件
			dojo.connect(map, "onMouseMove", showCoordinates);		// 鼠标移动事件,用于显示经纬度。
			dojo.connect(map, "onMouseDragEnd", onMouseDragEnd);	// 鼠标绘制结束事件

			// 地图随浏览器调整大小
			dojo.connect(dijit.byId('map'), 'resize', map, map.resize);
		});
	}
	
	/**
	 * 在单击按钮时触发事件,是否开始绘制
	 * Return Boolean
	 */
	function drawFeedback(enabled) {
		if (enabled) {
			map.disablePan();	// 平移地图时不允许使用鼠标的api方法
			map.setMapCursor('crosshair');	// 设置地图的光标显示,默认是一个箭头
			drawGeodesic = true;
		} else {
			map.enablePan();
			map.setMapCursor('default');	// 设置默认的鼠标光标
			drawGeodesic = false;
		}
	}

	/**
	 * 鼠标开始绘制函数
	 */
	function onMouseDragStart(event) {
		if (drawGeodesic) {
			// 在当前图形坐标位置下加入“开始点”标记符号
			startLoc = new esri.Graphic(event.mapPoint, markerSymbol);	// esri.Graphic(geometry, symbol, attributes, infoTemplate)和(JSON)2种
			map.graphics.add(startLoc);	 // 添加标记图形
			geodesicGraphic = null;
		}
	}

	/**
	 * 鼠标拖动函数
	 */
	function onMouseDrag(evt) {
		showCoordinates(evt);	// 调用函数,在左下角位置显示坐标值
		if (drawGeodesic) {
			var geodesicGeom = createLine(startLoc.geometry, evt.mapPoint);		// 调用创建符号线的函数,返回geometry对象
			if (geodesicGraphic == null) {
				geodesicGraphic = new esri.Graphic(geodesicGeom, inputSymbol);	// 创建拖拽时的符号图形对象
				map.graphics.add(geodesicGraphic);	// 将对象显示在地图中
				
				geodesicGraphic.getDojoShape().moveToFront();	// 返回ESRI图形的Dojo gfx图形。常见用途为getDojoShape方法是改变图形的绘制顺序使用moveToFront和moveToBack方法。
			} else {
				geodesicGraphic.setGeometry(geodesicGeom);
			}
		}
	}

	/**
	 * 鼠标拖动结束函数
	 */
	function onMouseDragEnd(event) {
		if (drawGeodesic) {
			geodesicGraphic.setSymbol(resultSymbol);	
			endLoc = new esri.Graphic(event.mapPoint, markerSymbol);	// 结束符号
			map.graphics.add(endLoc);
			drawFeedback(false);
		}

	}

	/**
	 * 创建绘制线函数
	 * Return Geometry 对象
	 */
	function createLine(start, end) {
		// 创建一个新的折线对象。
		var polyline = new esri.geometry.Polyline(map.spatialReference);
		polyline.addPath([ start, end ]);	// 添加路径的折线数组,可以是数字数组,点数组或json对象之一,每个数组2个或更多点,

		// 转换 wgs84 and densify 显示最短的绘制路径
		// esri.geometry.geodesicDensify(geometry, maxSegmentLength)
		var geodesicGeomGeo = esri.geometry.geodesicDensify(esri.geometry.webMercatorToGeographic(polyline), 100000);

		// 从WGS84转换到Web墨卡托显示
		var geodesicGeom = esri.geometry.geographicToWebMercator(geodesicGeomGeo);

		return geodesicGeom;
	}

	/**
	 * 清除绘制完的图形
	 */
	function clearGraphics() {
		map.graphics.clear();	// 清除图形
		drawGeodesic = false;
	}

	/**
	 * 显示坐标的函数
	 */
	function showCoordinates(evt) {
		var mp = esri.geometry.webMercatorToGeographic(evt.mapPoint);	// 转换几何,从Web墨卡托单位的地理单位。返回值: Geometry
		dojo.byId("coordsInfo").innerHTML = "Lat(纬度):" + mp.y.toFixed(2) + " Lon(经度):" + mp.x.toFixed(2); // 显示的值保留两位小数,使用JS方法中的toFixed(num)方法
	}
	dojo.addOnLoad(init);	// 初始化加载
	
</script>
</head>

<body class="claro">
	<div dojotype="dijit.layout.BorderContainer" design="sidebar" gutters="false" style="width: 100%; height: 100%; margin: 0;">
		<div id="map" dojotype="dijit.layout.ContentPane" region="center">
			<div style="position: absolute; right: 20px; top: 10px; z-Index: 999;">
				<div dojotype="dijit.form.Button" id="drawGraphics" showlabel="true" label="绘制图形" onclick="drawFeedback(true);"></div>
				<div dojotype="dijit.Tooltip" connectId="drawGraphics">点击地图上拖动来绘制路径</div>
				<div dojotype="dijit.form.Button" id="clearGraphics" showlabel="true" label="清除图形" onclick="clearGraphics();"></div>
				<div dojotype="dijit.Tooltip" connectId="clearGraphics">清除所有绘制</div>
			</div>
			<div id="coordsInfo"></div>
		</div>
	</div>
</body>
</html>


解析代码:

	inputSymbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASH, new dojo.Color([ 255, 0, 0 ]), 2);	// 样式选择STYLE_DASH,所以拖拽时的符号为虚线

              

其中我们看到的顶端为钻石形状,就是下面的代码说产生的。
	markerSymbol = new esri.symbol.SimpleMarkerSymbol(	// 标记符号
				esri.symbol.SimpleMarkerSymbol.STYLE_DIAMOND,	// 样式,STYLE_CIRCLE(●),STYLE_CROSS(+),STYLE_DIAMOND(◆),STYLE_SQUARE(■),STYLE_X(X)
				10,		// 像素
				new esri.symbol.SimpleLineSymbol(
					esri.symbol.SimpleLineSymbol.STYLE_SOLID,	//样式,STYLE_DASH,STYLE_DASHDOT,STYLE_DASHDOTDOT,STYLE_DOT,STYLE_NULL,STYLE_NULL
					new dojo.Color(
						[255, 0, 0, 0.5]	// 颜色,0.5为透明度
					),6		// 像素
				),
				new dojo.Color(
						[255, 0, 0, 0.9]
					)
				);
最终产生的符号,样式设置为STYLE_SOLID,所以替换了虚线
	resultSymbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([ 255, 0, 0 ]), 2);	// 最终显示结果符号


 

左下角显示跟踪鼠标的坐标点

 ArcGIS For JavaScript API continuous pan across dataline(连续的平移跨越日界线)————(六)_第1张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(ArcGIS For JavaScript API continuous pan across dataline(连续的平移跨越日界线)————(六))