> 作者: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
网友评论