package com.dji.sample.patches.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.dji.sample.patches.config.pojo.PatchesConfigPojo; import com.dji.sample.patches.dao.ShpToDataSourceMapper; import com.dji.sample.patches.model.dto.ShpDTO; import com.dji.sample.patches.model.entity.LotInfo; import com.dji.sample.patches.service.ShpToDataSourceService; import com.dji.sample.patches.utils.*; import com.dji.sample.patches.xml.mode.XMLTemplateModel; import com.dji.sample.patches.xml.utils.CreateWaylineFileUtils; import com.dji.sample.territory.model.entity.TbDkjbxxEntity; import com.dji.sample.wayline.service.IWaylineFileService; import org.locationtech.jts.geom.Coordinate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.UUID; import static com.dji.sample.patches.utils.FormatConversionUtil.getCentros; import static com.dji.sample.patches.utils.MultipartFileTOFileUtil.convert; import static com.dji.sample.patches.utils.ZipUtil.*; import static com.dji.sample.territory.utils.CoordinateSystemUtil.*; import static org.locationtech.jts.io.WKTConstants.POLYGON; @Service public class ShpToDataSourceServiceImpl implements ShpToDataSourceService { @Autowired private ShpToDataSourceMapper shpToDataSourceMapper; private String head = POLYGON; private MultipartFile multipartFile; String json; @Autowired private PatchesConfigPojo patchesConfigPojo; @Transactional public MultipartFile insertGeo(MultipartFile file, String workspaceId, String waylineName, double airportLat, double airportLon,String creator) throws Exception { List list = new ArrayList<>(); File file1 = MultipartFileTOFileUtil.multipartFile2File(file, patchesConfigPojo.getUnzip()); List shpData = ShapeFileUtil.shpToGeoJson(file1); for (ShpDTO shpDatum : shpData) { LotInfo lotInfo = new LotInfo(); String uuid = UUID.randomUUID().toString(); String bsm = uuid.replaceAll("-", ""); lotInfo.setBsm(bsm); lotInfo.setUserName(creator); lotInfo.setWorkspaceId(workspaceId); lotInfo.setDkfw(poylonCGCStoWGS(convertToWKT(shpDatum.getDKFW()))); lotInfo.setDkbh(shpDatum.getDKBH()); lotInfo.setXzb(shpDatum.getXZB()); lotInfo.setYzb(shpDatum.getYZB()); lotInfo.setXzqdm(shpDatum.getXZQDM()); lotInfo.setXmc(DistrictCodeUtils.codeToName(lotInfo.getXzqdm())); list.add(lotInfo); shpToDataSourceMapper.insert(lotInfo); } List coordinates = GeoToolsUtil.getRoutePointOrder(list, airportLat, airportLon); XMLTemplateModel xmlModel = XMLTemplateModel.init(coordinates, list); CreateWaylineFileUtils.createWaylineFile(xmlModel, patchesConfigPojo.getTemplate(), patchesConfigPojo.getTargetTemplate(), patchesConfigPojo.getWaylines(), patchesConfigPojo.getTargetWaylines()); // 压缩文件夹中的内容 String destKMZFile = patchesConfigPojo.getDestKMZFile() + waylineName + ".kmz"; // 输出的KMZ文件路径 zipFolder(patchesConfigPojo.getSourceDir(), destKMZFile); multipartFile = convert(new File(destKMZFile)); MultipartFileTOFileUtil.deleteFile(file1); return multipartFile; } @Transactional public void savaInMysql(List list, String workspaceId,String id,String name) { for (int i = 0; i < list.size(); i++) { LotInfo lotInfo = new LotInfo(); lotInfo.setWorkspaceId(workspaceId); lotInfo.setTaskId(id); lotInfo.setTaskName(name); lotInfo = dbConvertToEntity(list.get(i), workspaceId, id, name); shpToDataSourceMapper.insert(lotInfo); } } /** * 将SQlite数据库中DKJBXX对象转换为LotInfo对象。 * * @param file 需要转换的DKJBXX对象。 * @return 返回一个构建好的LotInfo对象,包含从数据库实体中转换来的信息。 */ private LotInfo dbConvertToEntity(TbDkjbxxEntity file, String workspaceId,String id,String name) { LotInfo.LotInfoBuilder builder = LotInfo.builder(); builder.bsm(file.getFId()) .xzqdm(file.getFXzqdm()) .dkbh(file.getFTbbh()) .dkfw(file.getFShape()) .workspaceId(workspaceId) .isPlan(0) .isPush(0) .xmc(DistrictCodeUtils.nameToCode(file.getFXzqdm())) .investigate(0) .taskId(id) .taskName(name) .build(); return builder.build(); } // private LotInfo shpDtoToLotInfo(ShpDTO shpDTO){ // LotInfo.LotInfoBuilder builder=LotInfo.builder(); // builder. // // } public List getNoPlan(){ return shpToDataSourceMapper.selectList(new LambdaQueryWrapper().eq(LotInfo::getIsPlan,0)); } public static String convertToWKT(String coordinates) { // Remove outermost square brackets and split by comma String cleanedCoordinates = coordinates.substring(4, coordinates.length() - 4); String[] polygons = cleanedCoordinates.split("\\]\\],\\[\\["); StringBuilder wkt = new StringBuilder("MULTIPOLYGON("); for (String polygon : polygons) { wkt.append("(("); String[] points = polygon.split("\\],\\["); for (String point : points) { String[] coords = point.split(","); double x = Double.parseDouble(coords[0]); double y = Double.parseDouble(coords[1]); wkt.append(x).append(" ").append(y).append(", "); } // Remove the last comma and space wkt.setLength(wkt.length() - 2); wkt.append(")), "); } // Remove the last comma and space, and close the polygon wkt.setLength(wkt.length() - 2); wkt.append(")"); return wkt.toString(); } }