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

描述:2.2版本的ArcGIS API为JavaScript可以指定该地图将支持连续的平移跨越日界线。此功能可用于地图的空间参考是WGS84(WKID= 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(  // 标记符号  
    // 样式,STYLE_CIRCLE(●),STYLE_CROSS(+),STYLE_DIAMOND(◆),STYLE_SQUARE(■),STYLE_X(X)  
    esri.symbol.SimpleMarkerSymbol.STYLE_DIAMOND,
    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 —— 连续的平移跨越日界线

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

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



未经允许请勿转载:程序喵 » ArcGIS For JavaScript API continuous pan across dataline —— 连续的平移跨越日界线

点  赞 (0) 打  赏
分享到: