iClient for Classic实现上游追溯功能

iClient for Classic上游追溯功能

作者:yangjl

上游追踪是从一个结点开始按流向相反的方向,根据一定的条件搜索此结点能够达到的网络集合。例如,水域某处发生污染,通过上游追踪分析可以寻找污染物可能来自哪些水域。本次以该实际情况为背景,利用iServer restapi以及iClient工具实现上游追踪功能。

总体步骤:

  1. 利用iDesktop桌面软件制作水域网络数据集。
  2. iServer发布网络分析服务。
  3. 通过restapi+iClient for Classic工具实现上游追踪功能。

数据及服务准备:

  1. 数据制作
    (1)制作水域网络数据集及设置流向(一般来说只用设置一个源点和一个汇点),并制作地图,具体方式可参考iDesktop .net帮助文档
    http://support.supermap.com.cn/DataWarehouse/WebDocHelp/SuperMap-iDesktop-Net3/index.html.
  2. 发布服务:
    (1)发布网络分析服务以及地图服务具体方式可参考前文博客,以及帮助文档
    http://support.supermap.com.cn/DataWarehouse/WebDocHelp/iServer/index.htm.
    (2)同时在webapps\iserver\WEB-INF\iserver-services.xml文件中找到对应服务提供者节点,并修改如下图所示节点:
    在这里插入图片描述

开发准备:

上游追踪分析呈现与实现,需要rest-api以及SuperMap iClient for Classic

  1. rest-api具体可参考iServer在线帮助文档地址:
    http://support.supermap.com.cn/DataWarehouse/WebDocHelp/iServer/index.htm.
  2. SuperMap iClient for Classic产品开发指南 地址:
    http://iclient.supermap.io/web/introduction/classicDevelop.html.

基于iClient for Classic实现上游追踪功能:

为代码简洁实现利用CDN在线引入Classic文件,进行单网页的开发。具体步骤如下:

  1. 引入js库
<script src="http://iclient.supermap.io/web/libs/iclient8c/libs/SuperMap.Include.js"></script>
<script src="http://iclient.supermap.io/dist/classic/iclient-classic.js"></script>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
  1. 加载地图
//初始化地图
	    map = new SuperMap.Map("map", {
	        controls: [
	            new SuperMap.Control.Navigation(),
	            new SuperMap.Control.Zoom()
	        ]
	    });
	    map.addControl(new SuperMap.Control.MousePosition());
	    //初始化图层
    layer = new SuperMap.Layer.TiledDynamicRESTLayer("China", "http://localhost:8090/iserver/services/map-nee/rest/maps/connn", null, {maxResolution: "auto"});
	    //监听图层信息加载完成事件
    layer.events.on({"layerInitialized": addLayer});
	    function addLayer() {
	        map.addLayer(layer);
	        //显示地图范围
	        map.setCenter(new SuperMap.LonLat(810 , 400), 0);
	        draw()
	    }

  1. 添加交互画点控件,并利用距离查询功能,查询到距离所绘制的点(及检测到污染物的点) 的弧段id(EdgeID),供上游追踪分析使用
     vectorLayer = new SuperMap.Layer.Vector("Vector Layer");
        //定义画图控件
        drawPolygon2 = new SuperMap.Control.DrawFeature(vectorLayer, SuperMap.Handler.Point);  
        drawPolygon2.events.on({"featureadded": function(e){
        map.addLayer( vectorLayer);
        drawPolygon2.deactivate();
        //获取绘制出点
        var geo=e.feature.geometry    
        console.log(geo)
      //距离查询
      var queryByDistanceParams = new SuperMap.REST.QueryByDistanceParameters({
            queryParams: new Array(new SuperMap.REST.FilterParameter({name: "ne_Network@ne"})),
            returnContent: true,
            distance: 300,
            geometry: geo,      //传入绘制的点几何对象
            isNearest:true     
        });

        var queryByDistanceService = new SuperMap.REST.QueryByDistanceService("http://localhost:8090/iserver/services/map-nee/rest/maps/connn");
        queryByDistanceService.events.on({
            "processCompleted": function(e){
                console.log(e.result)
                console.log(e.result.recordsets[0].features[0].attributes.SmEdgeID) 
                 //获取到绘制点的最近弧段id
               var Edge=parseInt(e.result.recordsets[0].features[0].attributes.SmEdgeID) 
              console.log(Edge,"Edge")
              console.log("http://localhost:8090/iserver/services/transportationAnalyst-nee/rest/networkanalyst/ne_Network@ne/traceup.json?edgeID="+Edge+"&isUncertainDirectionValid=true&returnFeatures=true&weightName=SMLENGTH")
              qingqiu(Edge)
            }
        });
        queryByDistanceService.processAsync(queryByDistanceParams);
        }});
        map.addControl(drawPolygon2);
        drawPolygon2.activate();
  1. 将获得的EdgeID并利用rest-api -traceUp 资源执行 GET 请求,可查找给定弧段或节点的上游弧段和结点。同时将成功返回的要素构建成线对象(表示污染物可能来自于哪些水域)
	$.ajax({
	url:"http://localhost:8090/iserver/services/transportationAnalyst-nee/rest/networkanalyst/ne_Network@ne/traceup.json?edgeID="+Edge+"&isUncertainDirectionValid=true&returnFeatures=true&weightName=SMLENGTH",
	username:"你的用户名",
	password:"你的密码",
	type:"GET",
	success:function(res){
	console.log(res)
	var jiegoulayer=new SuperMap.Layer.Vector("Vector Layer");
	    for(var i=0;i<res.edgesFeatures.length;i++)
	        {
	            var points=[]
	                        // roadLine = new SuperMap.Geometry.LineString(points);
	            console.log(res.edgesFeatures[i].geometry.points)
	            for(var k=0;k<res.edgesFeatures[i].geometry.points.length;k++)
	                {
	                var l=res.edgesFeatures[i].geometry.points;
	                var geopoint=new SuperMap.Geometry.Point(l[k].x,l[k].y);
	                points.push(geopoint);
	                }
	                            //构造为线对象,显示于
	                var  roadLine = new SuperMap.Geometry.LineString(points);
	                var fea=new SuperMap.Feature.Vector(roadLine);
	                jiegoulayer.addFeatures(fea)
	                map.addLayer(jiegoulayer)
	         }
	                 }
	        })


效果展示

在这里插入图片描述
以上就是实现上游追踪功能的所有内容。
源码及所需数据下载地址https://github.com/leondekill/traceup.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值