iServer RestApi实现连通性判断
作者:yangjl
曾经有个客户小伙伴问过我,如何实现连通性分析了?为什么没有提供封装好的接口呢。其实restapi中是提供了connectedEdges这个连通性的方法的,它可查找与给定结点或者弧段相连通的弧段,但是这个返回的结果往往不满足于实际的需要,一般情况下客户是希望能直接的得到连通结果,并且同时还能将分析出来的路线显示在地图上,这时候其实连通性分析的需求就可转为最佳路径分析的方式了。下面我将介绍如何提供restapi的方式利用最佳路径分析接口path来实现连通性的判断。
总体步骤:
- 利用iDesktop桌面软件制作路网。
- iServer发布网络分析服务。
- 通过restapi+iClient foropenlayer工具实现。
数据及服务准备:
- 数据制作
(1)制作网络数据集并制作地图,具体方式可参考iDesktop .net帮助文档
http://support.supermap.com.cn/DataWarehouse/WebDocHelp/SuperMap-iDesktop-Net3/index.html. - 发布服务:
(1)发布网络分析服务以及地图服务具体方式可参考前文博客,以及帮助文档
http://support.supermap.com.cn/DataWarehouse/WebDocHelp/iServer/index.htm.
(2)发布网络分析服务以及地图服务具体方式可参考前文博客,以及帮助文档
http://support.supermap.com.cn/DataWarehouse/WebDocHelp/iServer/index.htm.
开发准备:
连通性分析呈现与实现,需要rest-api以及SuperMap iClient for Openlayer
- rest-api具体可参考iServer在线帮助文档地址:
http://support.supermap.com.cn/DataWarehouse/WebDocHelp/iServer/index.htm. - SuperMap iClient for Openlayer产品开发指南 地址:
http://iclient.supermap.io/web/introduction/openlayersDevelop.html.
基于iClient for Openlayer实现连通性判断:
为代码简洁实现利用CDN在线引入Openlayer文件,进行单网页的开发。这里不在赘述引入方式,开发指南中有
- 加载地图
map = new ol.Map({
target: 'map',
controls: ol.control.defaults({attributionOptions: {collapsed: false}})
.extend([new ol.supermap.control.Logo()]),
view: new ol.View({
center: [90.42 , 38.36],
zoom: 2,
projection: 'EPSG:4326'
})
});
var layer = new ol.layer.Tile({
source: new ol.source.TileSuperMapRest({
url: url,
wrapX: true
}),
projection: 'EPSG:4326'
});
map.addLayer(layer);
- 添加draw控件,在地图上进行交互点击点,允许点两次一次起点,一次终点
draw=new ol.interaction.Draw({
source: source_one,
type: 'Point',
snapTolerance: 20
});
map.addInteraction(draw);
map.addLayer(vector_one);
draw.on("drawend",function(e){
cout++;
console.log()
points.push(e.feature.N.geometry.A)})
- 将draw控件点选出来的点坐标提取出来,并利用rest-api -path 资源执行 GET 请求,来判断两点之间是否连通。
var entry={
nodes:JSON.stringify([nodes[0] ,nodes[1]]) ,
hasLeastEdgeCount: false,
}
$.ajax({
url:'http://localhost:8090/iserver/services/transportationAnalyst-conne/rest/networkanalyst/conn_Network@conn/path.json',
type:"get",
data:entry,
contentType:"application/x-www-form-urlencoded",
success:function(e){
alert("两点连通")
console.log(e,"sucess");
},
error:function(e){
alert("两点不连通")
var res=JSON.parse(e.responseText)
console.log( res.error.errorMsg,'erro')
}
})
效果展示
全部代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/openlayers/4.6.5/ol.css" rel="stylesheet" />
<link href='http://iclient.supermap.io/dist/openlayers/iclient-openlayers.min.css' rel='stylesheet' />
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/openlayers/4.6.5/ol.js"></script>
<script type="text/javascript" src="http://iclient.supermap.io/dist/openlayers/iclient-openlayers.min.js"></script>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body id="map" style=" margin: 0;overflow: hidden;background: #fff;width: 100%;height:100%;background-color: aqua">
<script>
var map,url = 'http://localhost:8090/iserver/services/map-conne/rest/maps/New_Line@conn';
var cout=0,draw,points=[]
map = new ol.Map({
target: 'map',
controls: ol.control.defaults({attributionOptions: {collapsed: false}})
.extend([new ol.supermap.control.Logo()]),
view: new ol.View({
center: [90.42 , 38.36],
zoom: 2,
projection: 'EPSG:4326'
})
});
var layer = new ol.layer.Tile({
source: new ol.source.TileSuperMapRest({
url: url,
wrapX: true
}),
projection: 'EPSG:4326'
});
map.addLayer(layer);
darw();
function darw(){
var nodes=[];
var source_one = new ol.source.Vector({wrapX: false});
var vector_one = new ol.layer.Vector({
source: source_one
});
draw=new ol.interaction.Draw({
source: source_one,
type: 'Point',
snapTolerance: 20
});
map.addInteraction(draw);
map.addLayer(vector_one);
draw.on("drawend",function(e){
cout++;
console.log()
points.push(e.feature.N.geometry.A)
if(cout>1)
{
clearInteraction();
points.map(function(value){
//console.log(value)
nodes.push({
"x":value[0],
"y":value[1]
})
})
console.log(nodes)
var entry={
nodes:JSON.stringify([nodes[0] ,nodes[1]]) ,
hasLeastEdgeCount: false,
}
$.ajax({
url:'http://localhost:8090/iserver/services/transportationAnalyst-conne/rest/networkanalyst/conn_Network@conn/path.json',
type:"get",
data:entry,
contentType:"application/x-www-form-urlencoded",
success:function(e){
alert("两点连通")
console.log(e,"sucess");
},
error:function(e){
alert("两点不连通")
var res=JSON.parse(e.responseText)
console.log( res.error.errorMsg,'erro')
}
})
}
})
}
function clearInteraction() {
if (draw) {
map.removeInteraction(draw);
}
}
</script>
</body>
</html>