package com.zy.acs.manager.core.service; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.acs.common.utils.RedisSupport; import com.zy.acs.manager.common.domain.AreaShapeDto; import com.zy.acs.manager.common.domain.MapPointDto; import com.zy.acs.manager.core.service.astart.CodeNodeType; import com.zy.acs.manager.core.service.astart.MapDataDispatcher; import com.zy.acs.manager.manager.entity.Area; import com.zy.acs.manager.manager.enums.StatusType; import com.zy.acs.manager.manager.service.AreaService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @Slf4j @Service public class AreaBootService { private final RedisSupport redis = RedisSupport.defaultRedisSupport; @Autowired private AreaService areaService; @Autowired private MapDataDispatcher mapDataDispatcher; // launcher ------------------------------------------------------- @EventListener(ApplicationReadyEvent.class) public void init() { List areaList = areaService.list(new LambdaQueryWrapper().eq(Area::getStatus, StatusType.ENABLE.val)); log.info("areaList: {}", JSON.toJSONString(areaList)); for (Area area : areaList) { AreaShapeDto shapeDto = JSON.parseObject(area.getShapeData(), AreaShapeDto.class); MapPointDto start = shapeDto.getStart(); MapPointDto end = shapeDto.getEnd(); List codeList = this.findCodesInArea(start, end); log.info("codeList: {}", JSON.toJSONString(codeList)); } System.out.println(1); } public List findCodesInArea(MapPointDto start, MapPointDto end) { double minX = Math.min(start.getX(), end.getX()); double maxX = Math.max(start.getX(), end.getX()); double minY = Math.min(start.getY(), end.getY()); double maxY = Math.max(start.getY(), end.getY()); List codeList = new ArrayList<>(); String[][] codeMatrix = mapDataDispatcher.getCodeMatrix(MapDataDispatcher.MAP_DEFAULT_LEV); Double[][][] cdaMatrix = mapDataDispatcher.getCdaMatrix(MapDataDispatcher.MAP_DEFAULT_LEV); int rows = cdaMatrix.length; int cols = cdaMatrix[0].length; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { Double x = cdaMatrix[i][j][0]; Double y = cdaMatrix[i][j][1]; if (x == null || y == null) { continue; } if (this.inRect(x, y, minX, maxX, minY, maxY)) { String code = codeMatrix[i][j]; if (!CodeNodeType.NONE.val.equals(code)) { codeList.add(code); } } } } return codeList; } private boolean inRect(double x, double y, double minX, double maxX, double minY, double maxY) { return x >= minX && x <= maxX && y >= minY && y <= maxY; } }