美文网首页
二维爆管分析

二维爆管分析

作者: SuperMap技术控 | 来源:发表于2022-01-05 10:50 被阅读0次

    > 作者: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<sourceNodeIDs.length;i++){
    if(i!=sourceNodeIDs.length-1){
    valve+=sourceNodeIDs[i]+",";
    }
    else{
    valve+=sourceNodeIDs[i]+")";
    }
    }
             var valvequeryParam,valvequeryBySQLParams,valvequeryBySQLService;
             valvequeryParam=new SuperMap.REST.FilterParameter({
                      name: "burstdata_Network_Node@burstdata",
                      attributeFilter: "SmNodeID in "+valve
                  });
              valvequeryBySQLParams = new SuperMap.REST.QueryBySQLParameters({
                      queryParams: [valvequeryParam],
                  });
              valvequeryBySQLService = new SuperMap.REST.QueryBySQLService(url, {
                      eventListeners: {"processCompleted": valveprocessCompleted, "processFailed": processFailed}});
              valvequeryBySQLService.processAsync(valvequeryBySQLParams);
          }
     //将设施点显示在地图上
       function valveprocessCompleted(e){
          var valvepoint=[],features=e.result.recordsets[0].features;
          for(var i=0;i<features.length;i++){
          valvegeo=features[i].geometry;
          var valvepointVector = new SuperMap.Feature.Vector(valvegeo);
          valvepointVector.style = {
              fillColor: "SteelBlue ",
              pointRadius: 6,
              label:"阀门",
               fontWeight:"bold",
              labelXOffset:-20,
              fontColor:"SteelBlue "
          };
          valvepoint.push(valvepointVector);
      }
    vectorLayer2.addFeatures(valvepoint);
     }    

    显示的阀门位置如下:

    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<edgeID.length;i++){
    if(i!=edgeID.length-1){
    str+=edgeID[i]+",";
    }
    else{
    str+=edgeID[i]+")";
    }
    }
    queryParam2=new SuperMap.REST.FilterParameter({
                  name: "burstdata_Network@burstdata",
                  attributeFilter: "SMID in "+str
              });
              queryBySQLParams = new SuperMap.REST.QueryBySQLParameters({
                  queryParams: [queryParam,queryParam2],
              });
              queryBySQLService = new SuperMap.REST.QueryBySQLService(url, {
                  eventListeners: {"processCompleted": processCompleted, "processFailed": processFailed}});
              queryBySQLService.processAsync(queryBySQLParams);

    }

    function processCompleted(queryEventArgs) {
              var i, j,affectedPoint=[],affectedLine=[],result = queryEventArgs.result;
              if (result && result.recordsets) {
                  //受影响的设施点
                  if(result.recordsets[0].features){
    for(i=0;i<result.recordsets[0].features.length;i++){
    affectedgeo=result.recordsets[0].features[i].geometry;
    var affectedPointvector=new SuperMap.Feature.Vector();
    affectedPointvector.geometry=affectedgeo;
    affectedPointvector.style={
    fillColor: "Yellow",
                              pointRadius: 6
    };

    affectedPoint.push(affectedPointvector);
    }

    vectorLayer.addFeatures(affectedPoint);
    }
    //受影响的弧段
    if(result.recordsets[1].features){
    for(j=0;j<result.recordsets[1].features.length;j++){
    var affectedLinefea=result.recordsets[1].features[j];
    affectedLinefea.style={
    strokeColor:"red",
    strokeWidth:3
    }
    affectedLine.push(affectedLinefea);
    }
    vectorLayer.addFeatures(affectedLine);
    }
               }
          }

    分析结果展示: 图中可以该点爆管时,需要关闭29号和57号阀门。

    本文所有到的数据和代码,请访问如下地址下载:
    https://download.csdn.net/download/supermapsupport/11762243

    相关文章

      网友评论

          本文标题:二维爆管分析

          本文链接:https://www.haomeiwen.com/subject/opphcrtx.html