java+pgsql实现管网的查询

本文介绍了使用Java结合PostGIS库进行管网查询,包括水平距离、空间距离、垂直距离的计算方法,以及空间查询如获取管段中心点、长度、圆形框选和多边形查询的实现。内容涉及高程、埋深、管径等因素对距离的影响,以及如何在特定地理区域内筛选管网数据。
摘要由CSDN通过智能技术生成

管网查询

距离量测

水平距离

获取两管段的水平距离,需要使用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的空间函数,获取两个管段的空间距离

如果需要考虑管径,则需要计算角度,把管径的斜切面的长度减掉默认坐标在

  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姗姗的鱼尾喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值