美文网首页
二维爆管分析

二维爆管分析

作者: 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

相关文章

  • 二维爆管分析

    > 作者:LX 一、 背景 前面的文章《二维地图展示爆管分析》中介绍了三维爆管分析,但是很多小伙伴不清楚如何实现二...

  • PostGIS管网连通性分析

    GIS在管网数据中的很重要的一个应用方向就是”管网空间分析“,其中包括连通性分析、上下游分析、爆管分析等等。下面是...

  • 期末附加题——国贸166 林慧 01

    翻墙: 二维码制作: 大数据分析:

  • 附加任务 国贸165 吴玲玲 01

    翻墙激活 第三方平台推广 听课感受 二维码名片 网址二维码 收款二维码 大数据分析报告

  • iOS Swift 原生 二维码的生成与扫描

    一、生成二维码 1.步骤分析 首先创建一个二维码滤镜实例CIFilter,name为“CIQRCodeGenera...

  • 笔记

    《爆款小红书》 只有见过爆款,才能做出爆款。打造出爆款首先要做的是拆解爆款、分析爆款,要先看过足够多的爆款内容。比...

  • 爆仓?你猜

    大家分析一下 , 这会不会爆?

  • R 数据可视化 —— ggplot 二维直方图和密度图

    二维直方图 二维直方图用于二维数据的统计分析,X-Y 轴变量均为数值型。首先将坐标平面分割为许多大小相等的区间,并...

  • 岛屿问题

    岛屿系列题目的核心考点就是用 DFS/BFS 算法遍历二维数组。本文分析DFS算法。 一、框架 因为二维矩阵本质上...

  • 实验五、二维图形的几何变换

    一.作业名称:二维图形的几何变换 二.算法分析 以下实现了二维图形的空间平移、比例缩放、旋转、对称、转位。 平移变...

网友评论

      本文标题:二维爆管分析

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