本文共 4336 字,大约阅读时间需要 14 分钟。
作者:LX
前面的文章《》中介绍了三维爆管分析,但是很多小伙伴不清楚如何实现二维爆管分析,下面就详细的介绍一下二维爆管分析实现流程。
网络数据集准备,网络数据集需要在idesktop中构建,详细的构网步骤请参考idesktop帮助文档中“构建网络数据”中的介绍。
本文用到的网络数据可在文末下载。1、到iServer服务管理界面,选择“快速发布服务”,数据来源选择“工作空间”
2、工作空间类型选择“文件型”,工作空间路径点击“远程浏览”,找到实际工作空间文件存放的位置 3、发布的服务类型选择“交通网络分析服务” 4、配置交通网络分析参数 5、点击“完成”,发布服务成功,直接点击服务链接即可访问服务。 6、修改服务配置文件 打开【iServer根目录】/ webapps/iserver/WEB-INF下的iserver-services.xml找到发布的交通网络分析服务的服务提供者,把initFacilityAnalyest节点改成true,然后添加directionField字段。如下图所示: PS: initFacilityAnalyest:是否初始化设施网络分析,默认为false。修改为true后,将开启爆管分析、上下游关键设施查找分析功能。directionField:流向字段,当initFacilityAnalyst为true时,该参数必填。1、 定义底图
//初始化图层 layer = new SuperMap.Layer.TiledDynamicRESTLayer("map", url, {transparent: true, cacheEnabled: true},{maxResolution:"auto"});
2、 指定设施点并显示在地图上,本例中设施点就是阀门
//指定设施点ID数组 var sourceNodeIDs = [1,10,20,29,30,40,51,53,55,57,66,79]; //通过ID查询设施点 function addvalve(){ var valve="("; for(var i=0;i
显示的阀门位置如下:
3、 确定爆管位置,通过画点控件画的点位来模拟爆管的位置//画点控件 drawPoint = new SuperMap.Control.DrawFeature(vectorLayer, SuperMap.Handler.Point); drawPoint.events.on({"featureadded": drawPointCompleted}); map.addControl(drawPoint);//选择爆管位置成功function drawPointCompleted(drawGeometryArgs) { drawPoint.deactivate(); var feature = new SuperMap.Feature.Vector(); feature.geometry = drawGeometryArgs.feature.geometry, feature.style = {}; vectorLayer.addFeatures(feature); //查询爆管位置所在的弧段 var queryParam, queryByGeometryParameters, queryService; queryParam = new SuperMap.REST.FilterParameter({name: "burstdata_Network@burstdata"}); queryByGeometryParameters = new SuperMap.REST.QueryByDistanceParameters({ queryParams: [queryParam], isNearest:true, //选择最近查询,并且只返回一个 expectCount:1, geometry: drawGeometryArgs.feature.geometry, distance:100 }); queryService = new SuperMap.REST.QueryByDistanceService(url, { eventListeners: { "processCompleted": processCompleted_select, "processFailed": processFailed } }); queryService.processAsync(queryByGeometryParameters); } //地图上显示爆管位置 function processCompleted_select(queryEventArgs) { drawPoint.deactivate(); var i, j, result = queryEventArgs.result; if (result && result.recordsets) { recordsets=result.recordsets; var feature = recordsets[0].features[0]; feature.style = style; vectorLayer.addFeatures(feature); var center=feature.geometry.getBounds().getCenterLonLat(); var point=new SuperMap.Geometry.Point(center.lon,center.lat); var BPpoint=new SuperMap.Feature.Vector(); BPpoint.geometry=point; BPpoint.style={ fillColor: "red", pointRadius: 6, }; vectorLayer1.addFeatures(BPpoint); BP=feature.data.SmID; alert("爆管点:"+BP); } }
爆管位置:
4、 设定爆管分析参数var parameter = new SuperMap.REST.BurstPipelineAnalystParameters({ sourceNodeIDs: sourceNodeIDs, //设施点ID数组 edgeID: BP, //爆管弧段ID,既查询弧段内容 nodeID: null, //爆管结点ID (注:edgeID 与 nodeID 不能同时使用) isUncertainDirectionValid: true //指定不确定流向是否有效 });
5、 执行分析
var burstPipelineAnalystService = new SuperMap.REST.BurstPipelineAnalystService(analysisServiceurl,{ eventListeners: {"processCompleted": BurstPipelineAnalyst_processCompleted} });burstPipelineAnalystService.processAsync(parameter);
6、 获取分析结果,找到受影响的位置并显示在地图上
//爆管分析成功 function BurstPipelineAnalyst_processCompleted(BurstPipelineAnalystEventArgs) { var result = BurstPipelineAnalystEventArgs.result; //上下游中受爆管位置影响的弧段ID var edgeID = result.edges; //爆管分析中受爆管位置影响的上下游的关键设施点ID var criticalNodes = result.criticalNodes; queryBySQL(criticalNodes,edgeID); } //通过受影响的弧段和关键设施点ID查询到对应的对象 function queryBySQL(criticalNodes,edgeID){ var queryParam,queryParam2, queryBySQLParams, queryBySQLService; queryParam = new SuperMap.REST.FilterParameter({ name: "burstdata_Network_Node@burstdata", attributeFilter: "SmNodeID in ("+criticalNodes+ ")" }); var str="("; for(var i=0;i
分析结果展示:图中可以该点爆管时,需要关闭29号和57号阀门。
本文所有到的数据和代码,请访问如下地址下载:
https://download.csdn.net/download/supermapsupport/11762243转载地址:http://fupxi.baihongyu.com/