
SuperMap iClient 8C(2017) for JavaScript 是一款在服务式 GIS 架构体系中,面向 HTML5 的应用开发,支持多终端,跨浏览器的客户端开发平台。 通过 SuperMap iClient 8C(2017) for JavaScript,无需任何插件,便可以在浏览器上实现美观的地图展现,内容丰富的地图应用。
随着Surface 平板电脑的兴起,借助SuperMap iClient for JavaScript开发平台,我们可以快捷地开发Windows 8下Metro风格的地图应用程序,订制期望的地图应用功能等。
该文档介绍了基于SuperMap iClient for JavaScript 平台如何开发Windows 8下Metro风格的地图应用程序,该地图包含基本的地图浏览、缩放、量算和定位功能。 二次开发人员或用户可以在此基础上增加自己的业务需求,丰富地图应用。同时我们会在开发范例中提供Metro风格的地图应用的源码和打包后的应用程序, 用户可自行下载安装包试用。

在新建项目对话框中左侧在已安装的模板中找到JavaScript Windows应用商店,同时在右侧选择导航布局应用程序(当然您也可以选择空白应用程序)。 在下方名称一栏中输入应用程序名称(JavaScript for WinRT),在位置一栏中选择应用程序保存的位置(E:\WinRT\)。单击确定按钮即创建了导航布局应用程序。 创建好的解决方案目录结构如下:



.homepage section[role=main] {
    margin-left: 120px;
}
.funcDiv {
    z-index: 9999;
    position: absolute;
    top: 0;
    right: 10px;
}
ul {
    list-style-type: none;
}
    ul li {
        display: inline-block;
    }
#map {
    width: 100%;
    height: 100%;
}
@media screen and (-ms-view-state: snapped) {
    .homepage section[role=main] {
        margin-left: 20px;
    }
}
@media screen and (-ms-view-state: portrait) {
    .homepage section[role=main] {
        margin-left: 100px;
    }
}
                            
                            
(function () {
    "use strict";
    var map, layer, positionLayer, lenCtrl, areaCtrl;
    WinJS.UI.Pages.define("/pages/home/home.html", {
        ready: function (element, options) {
            // 初始化地图
            map = new SuperMap.Map("map", {
                controls: [
                new SuperMap.Control.ScaleLine(),
                new SuperMap.Control.Zoom(),
                new SuperMap.Control.MousePosition(),
                new SuperMap.Control.Navigation({
                    dragPanOptions: {
                        enableKinetic: true
                    }
                })], units: "m"
            });
            positionLayer = new SuperMap.Layer.Markers();
            layer = new SuperMap.Layer.CloudLayer();
            map.addLayers([layer, positionLayer]);
            map.setCenter(new SuperMap.LonLat(12956286, 4855615), 12);
            //测量控件加入map对象中
            lenCtrl = new SuperMap.Control.Measure(SuperMap.Handler.Path, { persist: true });
            areaCtrl = new SuperMap.Control.Measure(SuperMap.Handler.Polygon, { persist: true });
            lenCtrl.events.on({
                "measure": handleMeasure
            });
            areaCtrl.events.on({
                "measure": handleMeasure
            });
            map.addControls([lenCtrl, areaCtrl]);
            //功能键单击事件
            element.querySelector("#measureLength").addEventListener("click", function (event) {
                lenCtrl.activate();
            }, false);
            element.querySelector("#measureArea").addEventListener("click", function (event) {
                areaCtrl.activate();
            }, false);
            element.querySelector("#myPosition").addEventListener("click", function (event) {
                //实现定位功能
                var geolocator = Windows.Devices.Geolocation.Geolocator();
                geolocator.getGeopositionAsync().done(function (position) {
                    var lon = position.coordinate.longitude,
                    x = lon * 20037508.342789 / 180,
                    lat = position.coordinate.latitude,
                    tempy = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180),
                    y = tempy * 20037508.34789 / 180,
                    lonLat = new SuperMap.LonLat(x, y),
                    size = new SuperMap.Size(44, 33),
                    offset = new SuperMap.Pixel(-(size.w / 2), -size.h),
                    icon = new SuperMap.Icon("/theme/image/marker.png", size, offset);
                    positionLayer.clearMarkers();
                    positionLayer.addMarker(new SuperMap.Marker(lonLat, icon));
                    map.setCenter(lonLat);
                });
            }, false);
            element.querySelector("#clear").addEventListener("click", function (event) {
                positionLayer.clearMarkers();
            }, false);
        }
    });
    //量测结果函数
    function handleMeasure(event) {
        lenCtrl.deactivate();
        areaCtrl.deactivate();
        var messageDialog = new Windows.UI.Popups.MessageDialog("");
        if (event.order === 1) {
            messageDialog.content = "长度测量结果: "+event.measure+" 公里";
            messageDialog.showAsync();
        } else if (event.order === 2) {
            messageDialog.content = "面积测量结果: " + event.measure + " 平方公里";
            messageDialog.showAsync();
        }
    }
})();
                            
                            通过上面的示例,我们就可以基于SuperMap iClient for JavaScript产品快速的构建Metro风格的地图应用。实现基本的地图浏览、缩放、量算、定位等功能。 你也可以订制化的实现自己期望的地图应用。
将上面的示例打包后,通过windows 8 提供的命令安装应用程序后,在开始界面上出现如下磁贴:

此刻通过单击或者是触摸该磁贴,弹出如下地图应用程序:

我们知道,在SuperMap iClient for JavaScript客户端与REST服交互过程中,涉及到同域与跨域和REST服务交互的问题,这两种情况下需要分别处理。 而在Metro风格下与REST服务的交互已不再区分,统一走同域处理。我们可以通过Windows 运行时下提供的API直接调用即可。不过这些我们无需关心, 在SuperMap iClient for JavaScript产品中我们已做了封装。将SuperMap iClient for JavaScript产品的API引入到新建的Metro风格项目中后, 可以像在浏览器下一样调用API。
Metro风格下与REST服务交互的代码如下:
WinJS.xhr({
  url:”url”,
  type:”GET”,
  headers:object
}).then(function(responseResult){
  
},function(errorResult){
  
});