No.8 【springboot调用其他mapper和service的方法】计算航道划分+计算周边航道划分+查询周边船舶

该项目涉及计算船舶经纬度的航道划分,包括读取Excel数据、计算航道ID和周边航道ID。同时,通过SpringBoot调用其他mapper和服务,实现查询周边船舶的功能,利用工具类MapperUtil简化调用过程。查询条件使用了MyBatis的criteria API,能够灵活匹配周边航道。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

No.8 计算航道划分+计算周边航道划分+查询周边船舶

项目开发内容:计算船舶经纬度坐标的航道划分,并得到周边航道划分,查询周边船舶。

一、计算船舶经纬度坐标的航道划分

新建工具类ChannelDivisionIDUtil ,建立静态全局变量 static String[][] arrayCD; (存放读到excel的航道划分表)
方法有:读取excel放入数组readExcelInputArray、计算航道划分getChannelDivisionID、计算周边航道划分getNearbyChannelDivisionID

1.读取excel放入数组readExcelInputArray

见上一篇文章,
https://blog.youkuaiyun.com/kingsirvince/article/details/98501675
在主程序application中调用,得到全局变量arrayCD,(存放读到excel的航道划分表)

2.计算航道划分getChannelDivisionID

这里可以调用,下一步,读进来经纬度,调用计算,存在ship_upload中,

 /**
     * 计算经纬度,得到航道划分ID
     * ChannelDivision 简写CD,arrayChannelDivision简写arrayCD
     *
     * @param coordinate
     * @return channelDivisionID
     */
    public static String getChannelDivisionID(Coordinate coordinate) {

        String channelDivisionID = "";
        BigDecimal longitude = coordinate.getLongitude();
        BigDecimal latitude = coordinate.getLatitude();
        Double longitudeDouble = longitude.doubleValue();//bigdecimal转double
        Double latitudeDouble = latitude.doubleValue();


        System.out.println( "******************开始计算航道划分***********************************************");

        for (int j = 0; j < 255; j++) {
            Double longitude_max, longitude_min, latitude_max, latitude_min;

            longitude_max = Double.valueOf(arrayCD[1][j]);
            longitude_min = Double.valueOf(arrayCD[2][j]);
            latitude_max = Double.valueOf(arrayCD[3][j]);
            latitude_min = Double.valueOf(arrayCD[4][j]);


            if (!(longitude_min > longitudeDouble || longitudeDouble > longitude_max)
                    && !(latitude_min > latitudeDouble || latitudeDouble > latitude_max)) {
                channelDivisionID = arrayCD[0][j];
            }
        }

        if (channelDivisionID.isEmpty()){
            channelDivisionID = "NoMatch";
        }
        return channelDivisionID;
    }
3.计算周边航道划分getNearbyChannelDivisionID

普通的周边为加一减一。在航道交叉口和始末点,用if判断,手动识别。

 public static String[] getNearbyChannelDivisionID(String channelDivisionID) {

        String[] arrayNearbyCDID = new String[5];
        String a = channelDivisionID;
        String aSubLast = a.substring(9);           //string截取,表示从第9位开始截取,到最后,从0计数
        String aSubBefore = a.substring(0, 9);      //表示从第0位开始截取,到第9位
        int num1 = Integer.parseInt(aSubLast) + 1;  //string转int
        int num2 = Integer.parseInt(aSubLast) - 1;
        String strNum1= String.format("%04d",num1);  //int转字符串自动补零,"%04d": 0表示前面补得是0,4表示总共4位,d表示是整形
        String strNum2= String.format("%04d",num2);
        String aCombo1 = aSubBefore + strNum1;
        String aCombo2 = aSubBefore + strNum2;
        System.out.println("*********附近航道划分拼接后:" + aCombo1 + " , " + aCombo2 + "*********");


        arrayNearbyCDID[0] = a;

            if (a.equals("JXCH026HD0001")) {
                arrayNearbyCDID[1] = "JXCH026HD0002";
            } else if (a.equals("JXCH026HD0075")) {
                arrayNearbyCDID[1] = "JXCH026HD0074";
                arrayNearbyCDID[2] = "JXCH026HD0076";
                arrayNearbyCDID[3] = "JXCH024HD0190";
            } else if (a.equals("JXCH026HD0078")) {
                arrayNearbyCDID[1] = "JXCH026HD0077";
                arrayNearbyCDID[2] = "JXCH026HD0079";
                arrayNearbyCDID[3] = "JXCH021HD0243";
            } else if (a.equals("JXCH026HD0082")) {
                arrayNearbyCDID[1] = "JXCH026HD0081";
                arrayNearbyCDID[2] = "JXCH026HD0083";
                arrayNearbyCDID[3] = "JXCH024HD0191";
            } else if (a.equals("JXCH001HD0112")) {
                arrayNearbyCDID[1] = "JXCH001HD0111";
            } else if (a.equals("JXCH026HD0101")) {
                arrayNearbyCDID[1] = "JXCH026HD0109";
                arrayNearbyCDID[2] = "JXCH001HD0111";
                arrayNearbyCDID[3] = "JXCH025HD0145";
                arrayNearbyCDID[4] = "JXCH025HD0146";
            } else if (a.equals("JXCH025HD0130")) {
                arrayNearbyCDID[1] = "JXCH025HD0129";
                arrayNearbyCDID[2] = "JXCH025HD0131";
                arrayNearbyCDID[3] = "JXCH024HD0185";
                arrayNearbyCDID[4] = "JXCH024HD0186";
            } else if (a.equals("JXCH025HD0140")) {
                arrayNearbyCDID[1] = "JXCH025HD0139";
                arrayNearbyCDID[2] = "JXCH025HD0141";
                arrayNearbyCDID[3] = "JXCH021HD0225";
            } else if (a.equals("JXCH024HD0164")) {
                arrayNearbyCDID[1] = "JXCH024HD0165";
            } else if (a.equals("JXCH025HD0113")) {
                arrayNearbyCDID[1] = "JXCH025HD0114";
            } else if (a.equals("JXCH025HD0163")) {
                arrayNearbyCDID[1] = "JXCH025HD0162";
            } else if (a.equals("JXCH024HD0242")) {
                arrayNearbyCDID[1] = "JXCH024HD0241";
            } else if (a.equals("JXCH001HD0102")) {
                arrayNearbyCDID[1] = "JXCH026HD0101";
                arrayNearbyCDID[2] = "JXCH001HD0103";
            } else {
                arrayNearbyCDID[1] = aCombo1;
                arrayNearbyCDID[2] = aCombo2;
            }
            for (int i=0;i<arrayNearbyCDID.length;i++){
        System.out.println("*********周围航道划分:"+arrayNearbyCDID[i]);}
        return arrayNearbyCDID;
    }

二、springboot调用其他mapper和service的方法

建立一个工具类MapperUtil,静态的,自动装配其他mapper和service,

1、该类使用@Component注解

2、添加一个本类类型的静态字段

3、创建一个初始化方法,贴上@PostConstruct 标签,用于注入bean

4、创建方法调用mapper或service接口

5、最后直接在普通类中调用即可 MapperUtil.getShipUploadCDID(Integer MMSI)

/**
 * 让其他类能够调用mapper和service的方法
 * https://blog.youkuaiyun.com/qq_21454973/article/details/89446823
 */
@Component
public class MapperUtil {
@Autowired
    private ShipUploadMapper shipUploadMapper;
    public static MapperUtil mapperUtil;

    @PostConstruct
    public void init(){
        mapperUtil = this;
        mapperUtil.shipUploadMapper = this.shipUploadMapper;
    }

    public static String getShipUploadCDID(Integer MMSI){
        return mapperUtil.shipUploadMapper.getChannelDivisionID(MMSI);
    }

三、查询周边船舶(controller中实现)

由于使用了codegenerator,自动生成的mybatis和mysql对应内容。里面自带了 增删查改的简单方法。也提供了 condition这种复杂方法。
criteria作为查询条件,非常牛批。

  1. 调用工具类MapperUtil,来使用其他mapper类的方法。这里是查询当前船舶的MMSI(实时更新在ship_upload表中)——MapperUtil 第二点提到了
  2. 调用工具类ChannelDivisionIDUtil,得到周边航道划分
  3. 查询条件condition,criteria.orEqualTo,把周边航道划分数组对应的都select上来,
  @PostMapping("/nearbyShip")
    public Result nearbyShip(@RequestParam Integer MMSI){

        String channelDivisionID = MapperUtil.getShipUploadCDID(MMSI);
        System.out.println("%%%%%%%%% ShipUpload当前船舶 航道划分:"+channelDivisionID+"%%%%%%%%%");

        String[] nearbyChannelDivisionID = ChannelDivisionIDUtil.getNearbyChannelDivisionID(channelDivisionID);



        for (int i=0;i<nearbyChannelDivisionID.length;i++){
            System.out.println("$$$$$$$$$$$$$$$$$$$--ShipInfo 周围航道划分【数组】:"+nearbyChannelDivisionID[i]);}

        Condition condition = new Condition(ShipInfo.class);
        Example.Criteria criteria = condition.createCriteria();
        criteria.orEqualTo("channelDivisionId", nearbyChannelDivisionID[0]);
        criteria.orEqualTo("channelDivisionId", nearbyChannelDivisionID[1]);
        criteria.orEqualTo("channelDivisionId", nearbyChannelDivisionID[2]);
        criteria.orEqualTo("channelDivisionId", nearbyChannelDivisionID[3]);
        criteria.orEqualTo("channelDivisionId", nearbyChannelDivisionID[4]);

        List<ShipInfo> list = shipInfoService.findByCondition(condition);
        return ResultGenerator.genSuccessResult(list);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值