管网查询
距离量测
水平距离
获取两管段的水平距离,需要使用postgis的空间函数 st distance,获取两个管段的水平距离
如果需要考虑到管径,则需要把管径的宽度减掉。
我目前采用的是默认管点坐标在中心,用水平距离-管段1的管径的一半-管段2的管径的一半
先默认取出水平距离
<select id="SelectDistance" resultType="java.lang.Double" >
SELECT st_distance(st_transform(st_geometryfromtext(#{line1},4326),#{epsg}),st_transform(st_geometryfromtext(#{line2},4326),#{epsg})) as distance
</select>
再根据管径计算。(以下计算方式是按照两个管段是水平的情况计算的,因为太多复杂的情况没有好的计算方式考虑全面,暂时是这样计算的,可能不太准确)
//计算两根管段的水平距离
public Double SelectDistance(DistanceCondition condition){
//获取管段1
Map<String,Object> line1=condition.line1;
Double lineDsWidth1=0.0;
if(line1.get("d_s")!=null){)/判断是否有管径字段
String lineDsStr = line1.get("d_s").toString();
//圆形管 100,方形管100X200
if (lineDsStr.contains("X")){
String[] dss = lineDsStr.split("X");//截取管径的宽度
lineDsWidth1 = Double.parseDouble(dss[0])*0.001;//单位转换 毫米转米
}else{
lineDsWidth1 = Double.parseDouble(lineDsStr)*0.001;//单位转换 毫米转米
}
}
//获取管段2
Map<String,Object> line2=condition.line2;
Double lineDsWidth2=0.0;
if(line2.get("d_s")!=null){)/判断是否有管径字段
String lineDsStr = line2.get("d_s").toString();
//圆形管 100,方形管100X200
if (lineDsStr.contains("X")){
String[] dss = lineDsStr.split("X");//截取管径的宽度
lineDsWidth2 = Double.parseDouble(dss[0])*0.001;//单位转换 毫米转米
}else{
lineDsWidth2= Double.parseDouble(lineDsStr)*0.001;//单位转换 毫米转米
}
}
//获取pg计算的两管段的水平距离
Double hor = this.getBaseMapper().SelectDistance(line1.get("geom").toString(),line2.get("geom").toString(),condition.epsg);
if (hor>0) {//如果两管段水平相交了则不需要再计算
if (lineDsWidth1 != null) { //水平距离减去当前管段管径的一半
hor = hor - lineDsWidth1 / 2;
}
if (lineDsWidth2 != null) { //水平距离减去循环管段管径的一半
hor = hor - lineDsWidth2 / 2;
}
}
return hor;
}
空间距离
获取两根管段的空间距离需要使用postois的空间函数,获取两个管段的空间距离
如果需要考虑管径,则需要计算角度,把管径的斜切面的长度减掉默认坐标在管段的中间,然后计算管径,用水平距离-