src/main/java/com/dji/sample/media/model/MediaFileEntity.java
@@ -76,5 +76,8 @@ @TableField(value = "metadata", typeHandler = FastjsonTypeHandler.class) private Object metadata; @TableField("isadd") private Integer isadd; } src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
@@ -162,6 +162,7 @@ if (file != null) { builder.fileName(file.getName()) .filePath(file.getPath()) .isadd(0) .fingerprint(file.getFingerprint()) .objectKey(file.getObjectKey()) .subFileType(file.getSubFileType()) src/main/java/com/dji/sample/patches/model/entity/LotInfo.java
@@ -63,6 +63,9 @@ @TableField("sjlx") private String sjlx; @TableField("isplan") private int isplan; @TableField(value = "create_time", fill = FieldFill.INSERT) private Long createTime; src/main/java/com/dji/sample/patches/service/ShpToDataSourceService.java
@@ -32,4 +32,6 @@ * @param list 需要保存到数据库的TbDkjbxxEntity实体列表。 */ void savaInMysql(List<TbDkjbxxEntity> list, String workspaceId); List<LotInfo> getNoPlan(); } src/main/java/com/dji/sample/patches/service/impl/ShpToDataSourceServiceImpl.java
@@ -1,5 +1,6 @@ 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.entity.LotInfo; @@ -90,6 +91,7 @@ } } /** * 将SQlite数据库中DKJBXX对象转换为LotInfo对象。 * @@ -97,26 +99,20 @@ * @return 返回一个构建好的LotInfo对象,包含从数据库实体中转换来的信息。 */ private LotInfo dbConvertToEntity(TbDkjbxxEntity file, String workspaceId) { double[] coordinates = extractCoordinates(pointCGCStoWGS(file.getXzb(), file.getYzb())); LotInfo.LotInfoBuilder builder = LotInfo.builder(); builder.bsm(file.getBsm()) .bz(file.getBz()) .dkmj(file.getDkmj()) .dkmc(file.getDkmc()) .dkbh(file.getDkbh()) .xmc(file.getXmc()) .xzb(coordinates[0]) .sfbhzdk(file.getSfbhzdk()) .sjlx(file.getSjlx()) .dkfw(poylonCGCStoWGS(file.getDkfw())) .xzqdm(file.getXzqdm()) .yzb(coordinates[1]) .kzxx(file.getKzxx()) .dklx(file.getDklx()) builder.bsm(file.getFId()) .xzqdm(file.getFXzqdmsys()) .dkbh(file.getFTbbh()) .dkfw(file.getFShape()) .workspaceId(workspaceId) .isplan(0) .build(); return builder.build(); } public List<LotInfo> getNoPlan(){ return shpToDataSourceMapper.selectList(new LambdaQueryWrapper<LotInfo>().eq(LotInfo::getIsplan,0)); } } src/main/java/com/dji/sample/territory/controller/TbDkjbxxController.java
@@ -17,11 +17,13 @@ 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.territory.model.entity.param.UploadUrlParam; import com.dji.sample.territory.service.ITbDkjbxxService; import com.dji.sample.territory.service.ITbFJService; import com.dji.sample.wayline.model.entity.WaylineFileEntity; import com.dji.sample.wayline.service.IWaylineFileService; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.annotations.Param; import org.locationtech.jts.geom.Coordinate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -71,8 +73,20 @@ */ @PostMapping("/upload") public ResponseResult uploadFile(@RequestParam("file") MultipartFile file) { String workspaceId="4a574db8-4ad3-48f7-9f16-3edbcd8056e1"; tbDkjbxxService.uploadFile(file); return ResponseResult.success("文件上传成功"); List<TbDkjbxxEntity> list = tbDkjbxxService.list(); shpToDataSourceService.savaInMysql(list, workspaceId); return ResponseResult.success("上传成功"); } @PostMapping("/uploadUrl") public ResponseResult uploadUrl( @RequestBody UploadUrlParam param){ tbDkjbxxService.uploadUrl(param.getDbUrl()); String workspaceId="4a574db8-4ad3-48f7-9f16-3edbcd8056e1"; List<TbDkjbxxEntity> list = tbDkjbxxService.list(); shpToDataSourceService.savaInMysql(list, workspaceId); return ResponseResult.success("上传成功"); } /** src/main/java/com/dji/sample/territory/model/entity/TbDkjbxxEntity.java
@@ -18,35 +18,14 @@ @Builder @NoArgsConstructor @AllArgsConstructor @TableName(value = "DKJBXX") @TableName(value = "table_info") public class TbDkjbxxEntity { @TableId(type = IdType.NONE) private String bsm; private String fXzqdmsys; private String dklx; private String fShape; private String xzqdm; private String fTbbh; private String xmc; private String dkbh; private String dkmc; private Double dkmj; private String sfbhzdk; private Double xzb; private Double yzb; private String bz; private String kzxx; private String dkfw; private String sjlx; private String fId; } src/main/java/com/dji/sample/territory/model/entity/param/UploadUrlParam.java
New file @@ -0,0 +1,18 @@ package com.dji.sample.territory.model.entity.param; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @Builder @AllArgsConstructor @NoArgsConstructor public class UploadUrlParam { private String dbUrl; private String taskName; private String count; } src/main/java/com/dji/sample/territory/service/ITbDkjbxxService.java
@@ -6,6 +6,7 @@ import com.dji.sample.patches.model.entity.LotInfo; import com.dji.sample.territory.model.entity.TbDkjbxxEntity; import com.dji.sample.territory.model.entity.TbFjEntity; import com.dji.sample.territory.model.entity.param.UploadUrlParam; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @@ -24,9 +25,11 @@ * @param file * @return */ ResponseResult<String> uploadFile(MultipartFile file); ResponseResult uploadFile(MultipartFile file); MultipartFile listFile(String workspaceId, String waylineName, double airportLat, double airportLon) throws IOException; ResponseResult uploadUrl(String url); } src/main/java/com/dji/sample/territory/service/impl/TbDkjbxxServiceImpl.java
@@ -14,6 +14,7 @@ import com.dji.sample.territory.dao.ITbFjMapper; import com.dji.sample.territory.model.entity.TbDkjbxxEntity; import com.dji.sample.territory.model.entity.TbFjEntity; import com.dji.sample.territory.model.entity.param.UploadUrlParam; import com.dji.sample.territory.pojo.TerritoryConfigPojo; import com.dji.sample.territory.service.ITbDkjbxxService; import org.locationtech.jts.geom.Coordinate; @@ -27,6 +28,7 @@ import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -47,6 +49,8 @@ public class TbDkjbxxServiceImpl extends ServiceImpl<ITbDkjbxxMapper, TbDkjbxxEntity> implements ITbDkjbxxService { @Autowired private ITbDkjbxxMapper iTbDkjbxxMapper; @Autowired private TbFjServiceImpl tbFjService; @Autowired private PatchesConfigPojo patchesConfigPojo; @Autowired @@ -111,6 +115,37 @@ return convert(new File(destKMZFile)); } @Override public ResponseResult uploadUrl(String url) { if (url.isEmpty()) { throw new IllegalArgumentException("上传文件为空"); } downloadFile(url); return ResponseResult.success(); } public File downloadFile(String fileUrl) { File downloadedFile = null; try { URL url = new URL(fileUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); InputStream inputStream = connection.getInputStream(); downloadedFile = new File(territoryConfigPojo.getPath()); OutputStream outputStream = new FileOutputStream(downloadedFile); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } inputStream.close(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } return downloadedFile; } /** * 将TbDkjbxxEntity类型的列表转换为LotInfo类型的列表。 * @@ -120,25 +155,14 @@ private List<LotInfo> dbConvertToEntity(List<TbDkjbxxEntity> list) { List<LotInfo> infos = new ArrayList<>(); for (TbDkjbxxEntity file : list) { double[] coordinates = extractCoordinates(pointCGCStoWGS(file.getXzb(), file.getYzb())); // 使用Builder模式构建LotInfo对象 LotInfo.LotInfoBuilder builder = LotInfo.builder(); if (file != null) { // 从TbDkjbxxEntity实体中提取信息,构建LotInfo对象 builder.bsm(file.getBsm()) .bz(file.getBz()) .dkmj(file.getDkmj()) .dkmc(file.getDkmc()) .dkbh(file.getDkbh()) .xmc(file.getXmc()) .xzb(coordinates[0]) .sfbhzdk(file.getSfbhzdk()) .sjlx(file.getSjlx()) .dkfw(poylonCGCStoWGS(file.getDkfw())) .xzqdm(file.getXzqdm()) .yzb(coordinates[1]) .kzxx(file.getKzxx()) .dklx(file.getDklx()) builder.bsm(file.getFId()) .dkbh(file.getFTbbh()) .dkfw(file.getFShape()) .xzqdm(file.getFXzqdmsys()) .build(); // 将构建好的LotInfo对象添加到infos列表中 infos.add(builder.build()); src/main/java/com/dji/sample/territory/service/impl/TbFjServiceImpl.java
@@ -96,7 +96,7 @@ //对应图片和视频文件进行不同处理 boolean endsWith = key.endsWith(".mp4"); if (!endsWith) { file1 = WaterMarkUtil.addWatermark(file, patchesConfigPojo.getUnzip(), pssj, lat, lng); file1 = WaterMarkUtil.addWatermark(file, patchesConfigPojo.getUnzip(), pssj, lat, lng,gimbalYawDegree); FJ = fileToByteArray(file1); } else { file1 = VideoZipUtil.compressVideo(file, 800000, 128000, 1280, 720); src/main/java/com/dji/sample/territory/utils/CoordinateSystemUtil.java
@@ -3,6 +3,7 @@ import org.geotools.geometry.jts.JTS; import org.geotools.referencing.CRS; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.WKTReader; import org.opengis.referencing.FactoryException; import org.opengis.referencing.crs.CRSAuthorityFactory; @@ -60,12 +61,16 @@ Geometry geometry = reader.read(wkt); geometry.setSRID(srid); return geometry; } catch (ParseException e) { System.out.println("WKT解析错误: " + e.getMessage()); e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } public static Geometry coordinateTransform(Geometry sourceGeometry, int targetSrid) { if (sourceGeometry == null || sourceGeometry.getSRID() == 0 || targetSrid == 0) { return null; src/main/java/com/dji/sample/territory/utils/WaterMarkUtil.java
@@ -23,7 +23,9 @@ * @return 添加水印并压缩后的图片文件。 * @throws IOException 如果读取或保存图片失败。 */ public static File addWatermark(File file, String path, Long pssj, Double lat, Double lng) throws IOException { public static File addWatermark(File file, String path, Long pssj, Double lat, Double lng, Double angles) throws IOException { String author="机巢"; String angel=angle(angles); Long timestamp = pssj; // 例如:Unix 时间戳(以秒为单位) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String sd = sdf.format(new Date(Long.parseLong(String.valueOf(timestamp)))); @@ -39,31 +41,26 @@ Graphics2D g2d = originalImage.createGraphics(); // 设置水印文字 "国土调查云" String watermarkText = "国土调查云"; // 设置水印文字样式 g2d.setColor(Color.WHITE); // 设置为白色 String watermarkText = "江西调查云"; float alpha = 0.5f; // 设置透明度为 0.5 AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); g2d.setComposite(alphaComposite); g2d.setFont(new Font("宋体", Font.BOLD, 100)); // 使用宋体字体 FontMetrics fms = g2d.getFontMetrics(); int textHeights = fms.getHeight(); g2d.setFont(new Font("宋体", Font.BOLD, 200)); // 使用宋体字体 // 设置水印位置(左上角) int x1 = 400; // 左上角水印位置 x 坐标 int y1 = 1200; // 左上角水印位置 y 坐标 // 设置水印位置(左居中) int x1 = 100; // 左边距离图片左边缘的距离 int y1 = (originalImage.getHeight() - textHeights) / 2; // 垂直居中 // 旋转35度角 double angle = Math.toRadians(35); AffineTransform at = AffineTransform.getRotateInstance(angle, x1, y1); g2d.setTransform(at); // 绘制左上角旋转水印文字 g2d.drawString(watermarkText, x1, y1); // 设置第一个水印完毕,恢复透明度为不透明状态(透明度为 1.0) alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f); g2d.setComposite(alphaComposite); String extraInfo = String.format("时间:%s\nlon:%.9f lat:%.6f", sd, lng, lat); String extraInfo = String.format("%s\nlon:%.9f lat:%.6f\n%s 时间:%s", author,lng, lat,angel,sd); g2d.setFont(new Font("宋体", Font.BOLD, 50)); // 使用宋体字体,更小的字号 g2d.setBackground(Color.black); // 计算文本宽度和高度 @@ -95,8 +92,46 @@ throw new IllegalArgumentException("水印图片保存失败"); } float compressionQuality = 0.5f; // 0.0 - 1.0, higher value means better quality File compressedImageFile = compressImageAndGetFile(originalImageFiles, compressionQuality); return compressedImageFile; return compressImageAndGetFile(originalImageFiles, compressionQuality); } public static String angle(double angle) { if (angle > 0 && angle < 45) { return "北偏东"; } if (angle > 45 && angle < 90) { return "东偏北"; } if (angle > 90 && angle < 135) { return "东偏南"; } if (angle > 135 && angle < 180) { return "南偏东"; } if (angle > -45 && angle < 0) { return "北偏西"; } if (angle > -90 && angle < -45) { return "西偏北"; } if (angle > -135 && angle < -90) { return "西偏南"; } if (angle > -180 && angle < -135) { return "南偏西"; } if (angle == 0) { return "正北"; } if (angle == 90) { return "正东"; } if (angle == 180|| angle == -180) { return "正南"; } if (angle == -90) { return "正西"; } return "未知"; } }