基于GIS的光缆故障点定位方式

由于单位的通信光缆需要我们自己维护,每次故障后即使有OTDR(Optical Time Domain Reflectometer,光时域反射仪)能测量出到故障点的光纤长度,但仍然很难准确找到故障点实际地面位置,因为存在光纤的留余、绞曲、弯折等因素,光纤长度总是长于地面距离。因而我们尝试利用GIS(Geographic Information System,地理信息系统)技术得到光纤长度和地面位置的对应关系,以辅助快速定位故障点位置。

具体原理是先分段测量实地光缆长度,按光缆熔接点分段。间隔测量光缆沿线的GPS坐标值,在光缆有大的弯曲处提高GPS坐标采集点密度,对光纤熔接点或上杆入地埋处的盘余以及杆长和地埋深度进行详细测量,由此计算出光缆的实地测量长度S,乘以光纤的绞缩率(扭绞系数),一般根据厂家提供的数据,约p=0.0007,得到光纤的估算长度S’=(p+1)S。然后结合OTDR,对熔接点进行光纤长度测量后得到对应该段(两个熔接点之间的)光纤估算长度进行修订,得到系数k,以得到光纤长度->光缆长度->光缆位置的对应关系,即光纤长度L=kS’=k(p+1)S=αS。要注意由于GPS坐标值的测量存在误差,因而前述光缆长度可能存在大于光纤长度的情况,即α可能小于1,这并不影响,只要α越近似1,说明该方法精度越高,实际使用效果越好。

第一步工作就是地理信息采集,也就是测量光缆经过的地理坐标,这里为了节约成本(都是自费啊)和保证精度(高精度产品特别贵,自己买了个UBlox M8N)我自己做了一个硬件,用来采集坐标信息。详情见我的博客:

太阳能GPS坐标记录器

第二步地理信息显示。这里需要地图瓦片的抓取和绘制,瓦片抓取也很有讲究,因为天朝的种种原因,天朝发明了火星坐标系,对坐标进行不可逆非线性加密,偏移量可达几百至上千米,所以如果是加偏的地图,绘制不成问题,但是根据地图上选择的点获取坐标会存在一定误差。由于我们项目应用场景是离线的(内部使用,基于安全考虑),所以需要获取无偏地图瓦片,网上试了好几个软件,LocaSpaceViewer、全能地图下载器、太乐地图下载器等等,最终下载到了WGS84无偏坐标系横轴墨卡托投影的加水印天地图街道图瓦片和谷歌卫星影像地图瓦片。

下一步就是瓦片拼接,直接用谷歌地图的离线版API,就不重复造轮子了,可以直接完成瓦片拼接显示、缩放移动等基本操作以及获取选择点坐标、做标注等等功能。

然后是线路绘制与显示,这当中遇到一个大坑,详情见博客:

GoogleMap离线API绘制地图折线问题

第三步故障点位置查询,通过输入的故障点光纤距离,显示故障点位置。

首先是距离计算,由于涉及的地理跨度不大,所以可以用近似计算方法,用球模型替换各种椭球地球模型。直接用GPS坐标对应角度,和地球平均半径计算球面距离,然后假设经纬度正交,且用平面距离代替球面距离。经简单估算,地表距离跨度100KM以下,误差不超过100米。

由于线路固定,因而只需计算一次,并将计算的累计距离值附在坐标值之后,当进行故障点查询时,根据查询值和累计距离值可以定位到所在坐标点的区间,然后根据插值得到对应坐标位置,然后标注于地图上。

点击标注点显示标注内容:

var makerlatlng = new google.maps.LatLng(parseFloat(info[0]), parseFloat(info[1]));
var marker = new google.maps.Marker({
	position: makerlatlng, // 标注点的坐标位置
	map: map,
	draggable: false, // 不支持拖动
	title: info[2] // 标注点的名称
});
// 使用弹窗显示名称
attachInfowindow(marker, info[2]);

附带小功能:地图图片标注:

var infowindow = new google.maps.InfoWindow({
	content:  '<img src="./images/flowers.jpg"><br/><center>新村</center>'
});
//defined icons
var image = './images/user.png';
var myLatLng = new google.maps.LatLng(41.365,124.54);
var marker = new google.maps.Marker({
	position: myLatLng,
	map: map,
	title: '',
	icon: image
});
google.maps.event.addListener(marker, 'click', function() {
	infowindow.open(map,marker);
});

查询坐标值:

google.maps.event.addListener(map,'mousemove',function (event){
    document.getElementById("showLat").value=event.latLng.lat();
    document.getElementById("showLng").value=event.latLng.lng();
});
//绑定事件
google.maps.event.addListener(map, 'click', function() {
    document.getElementById("showLatlng").setContent("latlng:" + marker.getPosition().toUrlValue(6));
});

距离值查询:

$("#form_search").submit(function(){
	var i=0;
	var breakDist = $("#breakDist").val();
	if(breakDist<0||breakDist>lineLen){
		alert("输入的距离值超出范围");	
		return false;
	}
	var breakExist = false;
	for(i=1;i<linePoints.length;i++){
		if(breakDist>linePoints[i][3]){
			continue;	
		}else if(breakDist<=linePoints[i][3]){
			breakExist = true;
			break;
		}
	}
	var breakPoint = new Array();
	if(breakExist == linePoints[i]){
		 breakPoint[0] = linePoints[i][0];
		 breakPoint[1] = linePoints[i][1];
	}else{
		var deltaDist = (breakDist-linePoints[i-1][3])/(linePoints[i][3]-linePoints[i-1][3]);
		 breakPoint[0] = deltaDist*(linePoints[i][0]-linePoints[i-1][0])+linePoints[i-1][0];
		 breakPoint[1] = deltaDist*(linePoints[i][1]-linePoints[i-1][1])+linePoints[i-1][1];
	}
	//alert(breakPoint);
	var makerlatlng2 = new google.maps.LatLng(breakPoint[1],breakPoint[0]);

	var marker = new google.maps.Marker({
		position: makerlatlng2, // 标注点的坐标位置
		map: map,
		draggable: false, // 不支持拖动
		title:"故障点位置" // 标注点的名称
	});
	// 使用弹窗显示名称
	attachInfowindow(marker, "故障点位置");
	return false;
});	

function attachInfowindow(marker, msg) {
	var infowindow = new google.maps.InfoWindow({ 
		content: msg,
		size: new google.maps.Size(50,50)
	});
	google.maps.event.addListener(marker, 'click', function(){
		infowindow.open(map,marker);
	});
}

效果图:

图1 光纤故障定位系统示意图

示例代码:【GisDemo

 原博客地址:http://www.straka.cn/blog/gis_optical_cable_fault_locate/

猜你喜欢

转载自blog.csdn.net/atp1992/article/details/80783164