From a312cb4568115fe6ca7ddeec2b16ebe9eb23f801 Mon Sep 17 00:00:00 2001 From: wzy-warehouse <18135009705@163.com> Date: Thu, 18 Jun 2026 16:11:15 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=AE=80=E5=8C=96QGIS=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=20-=20=E7=A7=BB=E9=99=A4RabbitMQ/=E5=BD=B1=E5=93=8D?= =?UTF-8?q?=E5=9C=BA/=E8=B7=9D=E7=A6=BB=E8=AE=A1=E7=AE=97=EF=BC=8C?= =?UTF-8?q?=E7=BB=9F=E4=B8=80trigger=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 - .../com/gis/xian/config/RabbitConfig.java | 114 ------- .../controller/DZInfluenceController.java | 44 --- .../xian/controller/DZProductController.java | 34 --- .../xian/domain/DeadLetterMessageDomain.java | 22 -- .../xian/dto/qgis/base/ActiveFaultDTO.java | 24 -- .../xian/dto/qgis/base/QgisTriggerDTO.java | 21 ++ .../xian/dto/qgis/base/ShanXiCitiesDTO.java | 22 -- .../xian/dto/qgis/base/ShanXiCountyDTO.java | 22 -- .../xian/dto/qgis/base/ShanXiTownsDTO.java | 22 -- .../earthquake/EarthquakeAssessmentDTO.java | 27 -- .../earthquake/EarthquakeDistanceDTO.java | 23 -- .../earthquake/EarthquakeInfluenceDTO.java | 24 -- .../EarthquakeInfluenceGeoJsonDTO.java | 43 --- .../EarthquakeInformationInfluenceDTO.java | 26 -- .../earthquake/EarthquakeIntensityQuery.java | 20 -- .../xian/dto/qgis/rain/RainAssessmentDTO.java | 28 -- .../xian/entity/qgis/base/ActiveFault.java | 207 ------------- .../gis/xian/entity/qgis/base/SXCities.java | 38 --- .../gis/xian/entity/qgis/base/SXCounty.java | 47 --- .../gis/xian/entity/qgis/base/SXTowns.java | 44 --- .../qgis/earthquake/EarthquakeDistance.java | 46 --- .../earthquake/EarthquakeGisInfluence.java | 58 ---- .../qgis/earthquake/EarthquakeInfluence.java | 57 ---- .../qgis/earthquake/EarthquakeProduct.java | 55 ---- .../com/gis/xian/enums/qgis/BaseEnums.java | 33 --- .../xian/enums/qgis/EarthquakeMapsEnums.java | 41 --- .../gis/xian/enums/qgis/RainMapsEnums.java | 37 --- .../listener/DeadLetterMessageListener.java | 116 -------- .../listener/qgis/MapReceiveListener.java | 110 ------- .../mapper/qgis/base/ActiveFaultMapper.java | 14 - .../mapper/qgis/base/ShanXiCitiesMapper.java | 14 - .../mapper/qgis/base/ShanXiCountyMapper.java | 14 - .../mapper/qgis/base/ShanXiTownsMapper.java | 14 - .../earthquake/EarthquakeDistanceMapper.java | 14 - .../EarthquakeGISInfluenceMapper.java | 14 - .../earthquake/EarthquakeInfluenceMapper.java | 14 - .../earthquake/EarthquakeProductMapper.java | 14 - .../qgis/base/DeadLetterMessageService.java | 54 ---- .../qgis/base/IActiveFaultService.java | 19 -- .../xian/service/qgis/base/IFeignService.java | 18 +- .../qgis/base/IShanXiCitiesService.java | 21 -- .../qgis/base/IShanXiCountyService.java | 26 -- .../qgis/base/IShanXiTownsService.java | 25 -- .../base/impl/ActiveFaultServiceImpl.java | 145 --------- .../qgis/base/impl/FeignServiceImpl.java | 87 ++---- .../base/impl/ShanXiCitiesServiceImpl.java | 136 --------- .../base/impl/ShanXiCountyServiceImpl.java | 109 ------- .../base/impl/ShanXiTownsServiceImpl.java | 109 ------- .../IEarthquakeInfluenceService.java | 25 -- ...IEarthquakeInformationDistanceService.java | 19 -- ...EarthquakeInformationInfluenceService.java | 29 -- .../earthquake/IEarthquakeProductService.java | 29 -- .../earthquake/IEarthquakeQueueService.java | 23 +- .../impl/EarthquakeEventServiceImpl.java | 46 +-- .../impl/EarthquakeInfluenceServiceImpl.java | 121 -------- ...thquakeInformationDistanceServiceImpl.java | 157 ---------- ...hquakeInformationInfluenceServiceImpl.java | 204 ------------- .../impl/EarthquakeProductServiceImpl.java | 280 ------------------ .../impl/EarthquakeQueueServiceImpl.java | 182 +----------- .../qgis/rain/impl/RainEventServiceImpl.java | 53 +--- .../xian/utils/qgis/EarthquakeHandler.java | 114 ------- .../xian/utils/qgis/EllipseToWktHandler.java | 156 ---------- .../xian/utils/qgis/GeoDistanceHandler.java | 219 -------------- .../gis/xian/utils/qgis/GeoFilesHandler.java | 98 ------ src/main/resources/application-dev.yml | 29 -- src/main/resources/application-prod.yml | 25 -- 67 files changed, 88 insertions(+), 3994 deletions(-) delete mode 100644 src/main/java/com/gis/xian/config/RabbitConfig.java delete mode 100644 src/main/java/com/gis/xian/controller/DZInfluenceController.java delete mode 100644 src/main/java/com/gis/xian/controller/DZProductController.java delete mode 100644 src/main/java/com/gis/xian/domain/DeadLetterMessageDomain.java delete mode 100644 src/main/java/com/gis/xian/dto/qgis/base/ActiveFaultDTO.java create mode 100644 src/main/java/com/gis/xian/dto/qgis/base/QgisTriggerDTO.java delete mode 100644 src/main/java/com/gis/xian/dto/qgis/base/ShanXiCitiesDTO.java delete mode 100644 src/main/java/com/gis/xian/dto/qgis/base/ShanXiCountyDTO.java delete mode 100644 src/main/java/com/gis/xian/dto/qgis/base/ShanXiTownsDTO.java delete mode 100644 src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeAssessmentDTO.java delete mode 100644 src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeDistanceDTO.java delete mode 100644 src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeInfluenceDTO.java delete mode 100644 src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeInfluenceGeoJsonDTO.java delete mode 100644 src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeInformationInfluenceDTO.java delete mode 100644 src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeIntensityQuery.java delete mode 100644 src/main/java/com/gis/xian/dto/qgis/rain/RainAssessmentDTO.java delete mode 100644 src/main/java/com/gis/xian/entity/qgis/base/ActiveFault.java delete mode 100644 src/main/java/com/gis/xian/entity/qgis/base/SXCities.java delete mode 100644 src/main/java/com/gis/xian/entity/qgis/base/SXCounty.java delete mode 100644 src/main/java/com/gis/xian/entity/qgis/base/SXTowns.java delete mode 100644 src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeDistance.java delete mode 100644 src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeGisInfluence.java delete mode 100644 src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeInfluence.java delete mode 100644 src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeProduct.java delete mode 100644 src/main/java/com/gis/xian/enums/qgis/BaseEnums.java delete mode 100644 src/main/java/com/gis/xian/enums/qgis/EarthquakeMapsEnums.java delete mode 100644 src/main/java/com/gis/xian/enums/qgis/RainMapsEnums.java delete mode 100644 src/main/java/com/gis/xian/listener/DeadLetterMessageListener.java delete mode 100644 src/main/java/com/gis/xian/listener/qgis/MapReceiveListener.java delete mode 100644 src/main/java/com/gis/xian/mapper/qgis/base/ActiveFaultMapper.java delete mode 100644 src/main/java/com/gis/xian/mapper/qgis/base/ShanXiCitiesMapper.java delete mode 100644 src/main/java/com/gis/xian/mapper/qgis/base/ShanXiCountyMapper.java delete mode 100644 src/main/java/com/gis/xian/mapper/qgis/base/ShanXiTownsMapper.java delete mode 100644 src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeDistanceMapper.java delete mode 100644 src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeGISInfluenceMapper.java delete mode 100644 src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeInfluenceMapper.java delete mode 100644 src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeProductMapper.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/base/DeadLetterMessageService.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/base/IActiveFaultService.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/base/IShanXiCitiesService.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/base/IShanXiCountyService.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/base/IShanXiTownsService.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/base/impl/ActiveFaultServiceImpl.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/base/impl/ShanXiCitiesServiceImpl.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/base/impl/ShanXiCountyServiceImpl.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/base/impl/ShanXiTownsServiceImpl.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeInfluenceService.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeInformationDistanceService.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeInformationInfluenceService.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeProductService.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeInfluenceServiceImpl.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeInformationDistanceServiceImpl.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeInformationInfluenceServiceImpl.java delete mode 100644 src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeProductServiceImpl.java delete mode 100644 src/main/java/com/gis/xian/utils/qgis/EarthquakeHandler.java delete mode 100644 src/main/java/com/gis/xian/utils/qgis/EllipseToWktHandler.java delete mode 100644 src/main/java/com/gis/xian/utils/qgis/GeoDistanceHandler.java delete mode 100644 src/main/java/com/gis/xian/utils/qgis/GeoFilesHandler.java diff --git a/pom.xml b/pom.xml index 4f8df2d..80e8ff4 100644 --- a/pom.xml +++ b/pom.xml @@ -167,13 +167,6 @@ commons-lang3 - - - org.springframework.boot - spring-boot-starter-amqp - 2.7.3 - - diff --git a/src/main/java/com/gis/xian/config/RabbitConfig.java b/src/main/java/com/gis/xian/config/RabbitConfig.java deleted file mode 100644 index 7313ad5..0000000 --- a/src/main/java/com/gis/xian/config/RabbitConfig.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.gis.xian.config; - -import com.gis.xian.constant.BaseConstants; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.core.*; -import org.springframework.amqp.rabbit.connection.ConnectionFactory; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.amqp.support.converter.MessageConverter; -import org.springframework.amqp.support.converter.SimpleMessageConverter; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.Arrays; - -/** - * @author zzw - * @description: RabbitMq 配置 - * @date 2026/5/26 下午6:36 - */ -@Slf4j -@Configuration -public class RabbitConfig { - - - - // 专题图队列 - @Bean - public Queue mapsQueue() { - return new Queue(BaseConstants.MAPS_QUEUE, true); - } - - // 文档队列 - @Bean - public Queue documents() { - return new Queue(BaseConstants.DOCUMENTS_QUEUE, true); - } - - // 死信队列 - @Bean - public Queue dlqQueue() { - return new Queue(BaseConstants.DLQ_QUEUE, true); - } - - // 定义主题交换机 - @Bean - public TopicExchange exchange() { - return new TopicExchange(BaseConstants.ASSESS_EXCHANGE); - } - - // 定义死信交换机 - @Bean - public DirectExchange dlxExchange() { - return new DirectExchange (BaseConstants.DLX_EXCHANGE); - } - // 将 mapsQueue 队列和 assess 交换机绑定,而且绑定的键值为 maps - // 这样只要是消息携带的路由键是 maps,才会分发到该队列 - @Bean - public Binding bindingExchangeMessageOfMaps() { - return BindingBuilder.bind(mapsQueue()).to(exchange()).with(BaseConstants.MAPS_QUEUE); - } - - @Bean - public Binding bindingExchangeMessageOfDocuments() { - return BindingBuilder.bind(documents()).to(exchange()).with(BaseConstants.DOCUMENTS_QUEUE); - } - - @Bean - public Binding bindingExchangeMessageOfFiles() { - return BindingBuilder.bind(dlqQueue()).to(exchange()).with(BaseConstants.DLQ_QUEUE); - } - - @Bean - public MessageConverter messageConverter() { - SimpleMessageConverter converter = new SimpleMessageConverter(); - converter.setAllowedListPatterns(Arrays.asList( - "com.gis.xian.params.QgisArgs", - "com.gis.xian.domain.DlqMessage" - )); - return converter; - } - - // 设置消息回调函数 自动确认消息 ack - @Bean - public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory) { - RabbitTemplate rabbitTemplate = new RabbitTemplate(); - rabbitTemplate.setConnectionFactory(connectionFactory); - rabbitTemplate.setMessageConverter(messageConverter()); - // 设置开启Mandatory,才能触发回调函数,无论消息推送结果怎么样都强制调用回调函数 - rabbitTemplate.setMandatory(true); - - // 1. 确认回调 (ConfirmCallback) - 建议使用 Lambda 简化写法 - rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> { - if (ack) { - System.out.println("✅ 消息成功发送到 Exchange"); - } else { - System.err.println("❌ 消息发送到 Exchange 失败: " + cause); - } - }); - - // 2. 退回回调 (ReturnsCallback) - 修复报错的核心部分 - rabbitTemplate.setReturnsCallback(returnedMessage -> { - System.out.println("⚠️ 消息无法路由被退回!"); - System.out.println("回复码 replyCode: " + returnedMessage.getReplyCode()); - System.out.println("回复文本 replyText: " + returnedMessage.getReplyText()); - System.out.println("交换机 exchange: " + returnedMessage.getExchange()); - System.out.println("路由键 routingKey: " + returnedMessage.getRoutingKey()); - // 获取原始消息内容 - String msgBody = new String(returnedMessage.getMessage().getBody()); - System.out.println("被退回的消息内容: " + msgBody); - }); - - return rabbitTemplate; - } -} diff --git a/src/main/java/com/gis/xian/controller/DZInfluenceController.java b/src/main/java/com/gis/xian/controller/DZInfluenceController.java deleted file mode 100644 index 11ea674..0000000 --- a/src/main/java/com/gis/xian/controller/DZInfluenceController.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.gis.xian.controller; - -import com.gis.xian.domain.ApiResponse; -import com.gis.xian.dto.qgis.earthquake.EarthquakeAssessmentDTO; -import com.gis.xian.dto.qgis.earthquake.EarthquakeQuery; -import com.gis.xian.service.qgis.earthquake.IEarthquakeInformationInfluenceService; -import com.gis.xian.service.qgis.earthquake.IEarthquakeInfluenceService; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Map; - -/** - * @author zzw - * @description: 影响场控制类 - * @date 2026/6/4 下午3:09 - */ -@Slf4j -@RestController -@RequestMapping("/open") -public class DZInfluenceController { - - @Resource - private IEarthquakeInfluenceService IEarthquakeInfluenceService; - @Resource - private IEarthquakeInformationInfluenceService IEarthquakeInformationInfluenceService; - - @PostMapping("/influence") - public ApiResponse> getInfluence(@RequestBody @Validated EarthquakeQuery query) { - Map influence = IEarthquakeInfluenceService.getInfluence(query); - return ApiResponse.ok(influence); - } - - @PostMapping("/generate/influence") - public ApiResponse generateInfluence(@RequestBody @Validated EarthquakeAssessmentDTO assess) { - IEarthquakeInformationInfluenceService.handle(assess); - return ApiResponse.ok("地震影响场已生成!"); - } -} diff --git a/src/main/java/com/gis/xian/controller/DZProductController.java b/src/main/java/com/gis/xian/controller/DZProductController.java deleted file mode 100644 index be28b2c..0000000 --- a/src/main/java/com/gis/xian/controller/DZProductController.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.gis.xian.controller; - -import com.gis.xian.domain.ApiResponse; -import com.gis.xian.dto.qgis.earthquake.EarthquakeProductDTO; -import com.gis.xian.dto.qgis.base.ProductQuery; -import com.gis.xian.service.qgis.earthquake.IEarthquakeProductService; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -/** - * @author zzw - * @description: 产出结果控制类 - * @date 2026/6/4 下午3:38 - */ -@Slf4j -@RestController -@RequestMapping("/open") -public class DZProductController { - - @Resource - private IEarthquakeProductService IEarthquakeProductService; - - @PostMapping("/product") - public ApiResponse> getProducts(@RequestBody ProductQuery query) { - List products = IEarthquakeProductService.getProducts(query); - return ApiResponse.ok(products); - } -} diff --git a/src/main/java/com/gis/xian/domain/DeadLetterMessageDomain.java b/src/main/java/com/gis/xian/domain/DeadLetterMessageDomain.java deleted file mode 100644 index 9bf21a6..0000000 --- a/src/main/java/com/gis/xian/domain/DeadLetterMessageDomain.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.gis.xian.domain; - -import com.gis.xian.dto.qgis.base.QgisArgsParams; -import lombok.Builder; -import lombok.Data; - -/** - * @author zzw - * @description: 死信队列参数 - * @date 2026/5/26 下午5:04 - */ -@Data -@Builder -public class DeadLetterMessageDomain { - - private QgisArgsParams qgisArgsParams; // 原始参数 - private String failReason; // 失败原因 - private Long failTime; // 失败时间戳 - private Integer retryCount; // 已重试次数 - - -} diff --git a/src/main/java/com/gis/xian/dto/qgis/base/ActiveFaultDTO.java b/src/main/java/com/gis/xian/dto/qgis/base/ActiveFaultDTO.java deleted file mode 100644 index 3bcef4d..0000000 --- a/src/main/java/com/gis/xian/dto/qgis/base/ActiveFaultDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.gis.xian.dto.qgis.base; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; -import org.locationtech.jts.geom.Geometry; - -/** - * @author zzw - * @description: 活动断层DTO类 - * @date 2026/5/26 上午10:20 - */ -@Data -public class ActiveFaultDTO { - - private String name; // 断层名称 - private Integer strike; // 走向 - private Integer direction; // 倾向 - private Integer clination; // 倾角 - private Double shapeLen; //形状长度 - @JsonSerialize(using = ToStringSerializer.class) - private Geometry geometry; // 范围 - private Double distance; -} diff --git a/src/main/java/com/gis/xian/dto/qgis/base/QgisTriggerDTO.java b/src/main/java/com/gis/xian/dto/qgis/base/QgisTriggerDTO.java new file mode 100644 index 0000000..720c1c4 --- /dev/null +++ b/src/main/java/com/gis/xian/dto/qgis/base/QgisTriggerDTO.java @@ -0,0 +1,21 @@ +package com.gis.xian.dto.qgis.base; + +import lombok.Data; + +/** + * 统一专题图触发请求 + * 只传递 simulationId 和类型,Python 端负责所有计算和产图 + */ +@Data +public class QgisTriggerDTO { + + /** + * 模拟ID(事件唯一标识) + */ + private String simulationId; + + /** + * 类型:earthquake(地震)/ rainstorm(暴雨) + */ + private String type; +} diff --git a/src/main/java/com/gis/xian/dto/qgis/base/ShanXiCitiesDTO.java b/src/main/java/com/gis/xian/dto/qgis/base/ShanXiCitiesDTO.java deleted file mode 100644 index 9423622..0000000 --- a/src/main/java/com/gis/xian/dto/qgis/base/ShanXiCitiesDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.gis.xian.dto.qgis.base; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; -import org.locationtech.jts.geom.Geometry; - -/** - * @author zzw - * @description: 陕西市州 - * @date 2026/5/26 上午8:36 - */ -@Data -public class ShanXiCitiesDTO { - - private String NAME; - private Double X; - private Double Y; - @JsonSerialize(using = ToStringSerializer.class) - private Geometry geometry; - private Double distance; -} diff --git a/src/main/java/com/gis/xian/dto/qgis/base/ShanXiCountyDTO.java b/src/main/java/com/gis/xian/dto/qgis/base/ShanXiCountyDTO.java deleted file mode 100644 index 80a72e3..0000000 --- a/src/main/java/com/gis/xian/dto/qgis/base/ShanXiCountyDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.gis.xian.dto.qgis.base; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; -import org.locationtech.jts.geom.Geometry; - -/** - * @author zzw - * @description: 陕西省区县 - * @date 2026/5/26 上午9:48 - */ -@Data -public class ShanXiCountyDTO { - - private String NAME; - private Double X; - private Double Y; - @JsonSerialize(using = ToStringSerializer.class) - private Geometry geometry; - private Double distance; -} diff --git a/src/main/java/com/gis/xian/dto/qgis/base/ShanXiTownsDTO.java b/src/main/java/com/gis/xian/dto/qgis/base/ShanXiTownsDTO.java deleted file mode 100644 index c6ff452..0000000 --- a/src/main/java/com/gis/xian/dto/qgis/base/ShanXiTownsDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.gis.xian.dto.qgis.base; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; -import org.locationtech.jts.geom.Geometry; - -/** - * @author zzw - * @description: 陕西省乡镇 - * @date 2026/5/26 上午9:57 - */ -@Data -public class ShanXiTownsDTO { - - private String NAME; - private Double X; - private Double Y; - @JsonSerialize(using = ToStringSerializer.class) - private Geometry geometry; - private Double distance; -} diff --git a/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeAssessmentDTO.java b/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeAssessmentDTO.java deleted file mode 100644 index e4e5c10..0000000 --- a/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeAssessmentDTO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.gis.xian.dto.qgis.earthquake; - -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * @author zzw - * @description: 地震评估dto类 - * @date 2026/5/25 下午6:04 - */ -@Data -public class EarthquakeAssessmentDTO { - - private String event; // 地震编码 - private String eqQueueId; // 评估编码 - private LocalDateTime eqTime; // 地震发生时间 - private Double longitude; // 经度 - private Double latitude; // 纬度 - private String eqAddr; // 地址 - private Double eqMagnitude; // 震级 - private Double eqDepth; // 深度 - private String eqFullName; // 震源名称 - private String eqName; // 震源名称 - private String eqType; // 震源类型 - -} diff --git a/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeDistanceDTO.java b/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeDistanceDTO.java deleted file mode 100644 index c0ba2e1..0000000 --- a/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeDistanceDTO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.gis.xian.dto.qgis.earthquake; - -import lombok.Data; -import org.locationtech.jts.geom.Geometry; - -/** - * @author zzw - * @description: DZXXDistanceDTO - * @date 2026/5/26 上午10:03 - */ -@Data -public class EarthquakeDistanceDTO { - - private Geometry geom; - private String eqQueueId; - private Integer distanceId; // 市1、县2、镇3 - private String pId; // 行政id - private String pname; // 省市县镇名称 - private String bgmc; // 行政区划等级 - private Double distance; // 距离 - private String remark; - -} diff --git a/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeInfluenceDTO.java b/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeInfluenceDTO.java deleted file mode 100644 index 74db86a..0000000 --- a/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeInfluenceDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.gis.xian.dto.qgis.earthquake; - -import lombok.Data; - -/** - * @author zzw - * @description: 影响场文件 - * @date 2026/5/26 上午10:46 - */ -@Data -public class EarthquakeInfluenceDTO { - - private String eqQueueId; - private String event; - private String name; - private String file; - private String path; - private String content; - private String intensityColumn; - private String source; - private Integer isEdit; - private Integer isPg; - -} diff --git a/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeInfluenceGeoJsonDTO.java b/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeInfluenceGeoJsonDTO.java deleted file mode 100644 index c0dc1e2..0000000 --- a/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeInfluenceGeoJsonDTO.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.gis.xian.dto.qgis.earthquake; - -import lombok.Data; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author zzw - * @description: 影响场geojson格式规范 - * @date 2026/5/26 上午10:43 - */ -@Data -public class EarthquakeInfluenceGeoJsonDTO { - - private final String type = "FeatureCollection"; - private List features = new ArrayList<>(); - - @Data - public static class GeoJsonFeature { - private final String type = "Feature"; - private GeoJsonGeometry geometry; - private GeoJsonProperties properties = new GeoJsonProperties(); - - @Data - public static class GeoJsonGeometry { - private String type; - private List>> coordinates; // 坐标数组 - } - - @Data - public static class GeoJsonProperties { - private String intensity; // 烈度等级 - private String eqAddr; - private Double longitude; - private Double latitude; - private String description = "地震影响场范围"; - } - } - - -} - diff --git a/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeInformationInfluenceDTO.java b/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeInformationInfluenceDTO.java deleted file mode 100644 index da9d710..0000000 --- a/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeInformationInfluenceDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.gis.xian.dto.qgis.earthquake; - -import lombok.Data; -import org.locationtech.jts.geom.Geometry; - -/** - * @author zzw - * @description: 地震影响场DTO - * @date 2026/5/26 上午10:11 - */ -@Data -public class EarthquakeInformationInfluenceDTO { - - private Geometry geom; - private String eqQueueId; - private String event; - private String eqName; - private Integer inty; // 烈度值 - private String sInty; - private double area; - private double longUranium; - private double shortUranium; - private double direction; - private double longitude; - private double latitude; -} diff --git a/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeIntensityQuery.java b/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeIntensityQuery.java deleted file mode 100644 index c9e37c3..0000000 --- a/src/main/java/com/gis/xian/dto/qgis/earthquake/EarthquakeIntensityQuery.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.gis.xian.dto.qgis.earthquake; - -import lombok.Data; - -/** - * @author zzw - * @description: 烈度参数 - * @date 2026/5/26 上午10:33 - */ -@Data -public class EarthquakeIntensityQuery { - - private double centerLon; // 中心点经度 - private double centerLat; // 中心点纬度 - private double semiMajor; // 长半轴(米) - private double semiMinor; // 短半轴(米) - private double rotation; // 旋转角度(度,顺时针为正,以北为0度) - private int numVertices; // 生成的顶点数,越多越接近椭圆 - -} diff --git a/src/main/java/com/gis/xian/dto/qgis/rain/RainAssessmentDTO.java b/src/main/java/com/gis/xian/dto/qgis/rain/RainAssessmentDTO.java deleted file mode 100644 index eeb0139..0000000 --- a/src/main/java/com/gis/xian/dto/qgis/rain/RainAssessmentDTO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.gis.xian.dto.qgis.rain; - -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * @author zzw - * @description: 评估DTO类 - * @date 2026/5/26 下午5:51 - */ -@Data -public class RainAssessmentDTO implements Serializable { - - private String rainId; - private String rainQueueId; - private String rainName; // 暴雨名称 - private String position; // 区县 - private double longitude; // 经度 - private double latitude; // 纬度 - private String rainfall; // 降雨量 - private String duration; // 已持续时间 - private String rainType; // 暴雨类型 - private LocalDateTime occurrenceTime; // 发生时间 - - -} diff --git a/src/main/java/com/gis/xian/entity/qgis/base/ActiveFault.java b/src/main/java/com/gis/xian/entity/qgis/base/ActiveFault.java deleted file mode 100644 index 9ffa566..0000000 --- a/src/main/java/com/gis/xian/entity/qgis/base/ActiveFault.java +++ /dev/null @@ -1,207 +0,0 @@ -package com.gis.xian.entity.qgis.base; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import com.gis.xian.config.typehandler.GeometryTypeHandler; -import lombok.Data; -import org.locationtech.jts.geom.Geometry; - -/** - * @author zzw - * @description: 陕西省活断层实体 - * @date 2026/5/26 上午10:18 - */ -@Data -@TableName("base.active_fault") -public class ActiveFault { - - @TableId("\"ID\"") - private String ID; - - @TableField("\"SmUserID\"") - private Integer SmUserID; - - @TableField("\"Scale\"") - private Integer Scale; - - @TableField("\"FractureZo\"") - private String FractureZo; - - @TableField("\"Name\"") - private String Name; - - @TableField("\"FaultSegme\"") - private String FaultSegme; - - @TableField("\"StrikeDire\"") - private Integer StrikeDire; - - @TableField("\"Strike\"") - private Integer Strike; - - @TableField("\"Direction\"") - private Integer Direction; - - @TableField("\"Clination\"") - private Integer Clination; - - @TableField("\"Length\"") - private Double Length; - - @TableField("\"TopDepth\"") - private String TopDepth; - - @TableField("\"Width\"") - private Double Width; - - @TableField("\"FractureBe\"") - private Double FractureBe; - - @TableField("\"Feature\"") - private Integer Feature; - - @TableField("\"LatestActi\"") - private Integer LatestActi; - - @TableField("\"StartTimeE\"") - private String StartTimeE; - - @TableField("\"VDisplaceE\"") - private Double VDisplaceE; - - @TableField("\"VDisplac_1\"") - private Double VDisplac_1; - - @TableField("\"HDisplaceE\"") - private Double HDisplaceE; - - @TableField("\"HDisplac_1\"") - private Double HDisplac_1; - - @TableField("\"TDisplaceE\"") - private Double TDisplaceE; - - @TableField("\"TDisplac_1\"") - private Double TDisplac_1; - - @TableField("\"AveVRate\"") - private Double AveVRate; - - @TableField("\"AveVRateEr\"") - private Double AveVRateEr; - - @TableField("\"AveHRate\"") - private Double AveHRate; - - @TableField("\"AveHRateEr\"") - private Double AveHRateEr; - - @TableField("\"StartTimeN\"") - private Double StartTimeN; - - @TableField("\"NewVRate\"") - private Double NewVRate; - - @TableField("\"NewVRateEr\"") - private Double NewVRateEr; - - @TableField("\"NewHRate\"") - private Double NewHRate; - - @TableField("\"NewHRateEr\"") - private Double NewHRateEr; - - @TableField("\"MaxVRate\"") - private Double MaxVRate; - - @TableField("\"MaxVRateEr\"") - private Double MaxVRateEr; - - @TableField("\"MaxHRate\"") - private Double MaxHRate; - - @TableField("\"MaxHRateEr\"") - private Double MaxHRateEr; - - @TableField("\"EQEventCou\"") - private Integer EQEventCou; - - @TableField("\"EQEventRIB\"") - private Integer EQEventRIB; - - @TableField("\"EQEventRIT\"") - private Integer EQEventRIT; - - @TableField("\"Method\"") - private String Method; - - @TableField("\"MaxRupture\"") - private Integer MaxRupture; - - @TableField("\"AverageRup\"") - private Integer AverageRup; - - @TableField("\"ElapseTime\"") - private Integer ElapseTime; - - @TableField("\"SlipDepthE\"") - private Integer SlipDepthE; - - @TableField("\"SlipDept_1\"") - private Integer SlipDept_1; - - @TableField("\"AverageSli\"") - private Double AverageSli; - - @TableField("\"AverageS_1\"") - private Double AverageS_1; - - @TableField("\"CreepRateE\"") - private Double CreepRateE; - - @TableField("\"CreepRat_1\"") - private Double CreepRat_1; - - @TableField("\"CoSeismicM\"") - private Double CoSeismicM; - - @TableField("\"CoSeismi_1\"") - private Double CoSeismi_1; - - @TableField("\"CoSeismicA\"") - private Double CoSeismicA; - - @TableField("\"CoSeismi_2\"") - private Double CoSeismi_2; - - @TableField("\"LatestCoSe\"") - private Double LatestCoSe; - - @TableField("\"LatestCo_1\"") - private Double LatestCo_1; - - @TableField("\"CommentInf\"") - private String CommentInf; - - @TableField("\"Shape_Leng\"") - private Double Shape_Leng; - - @TableField("\"Project\"") - private String Project; - - @TableField("\"Coordinate\"") - private String Coordinate; - - @TableField("\"DateSource\"") - private String DateSource; - - @TableField(value = "\"Geometry\"", typeHandler = GeometryTypeHandler.class) - @JsonSerialize(using = ToStringSerializer.class) - private Geometry geometry; - - -} - diff --git a/src/main/java/com/gis/xian/entity/qgis/base/SXCities.java b/src/main/java/com/gis/xian/entity/qgis/base/SXCities.java deleted file mode 100644 index 0b79940..0000000 --- a/src/main/java/com/gis/xian/entity/qgis/base/SXCities.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.gis.xian.entity.qgis.base; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; -import org.locationtech.jts.geom.Geometry; - -/** - * @author zzw - * @description: 陕西省市区 - * @date 2026/5/26 上午8:31 - */ -@Data -@TableName("base.sx_zb_city") -public class SXCities { - - @TableField("\"SmUserID\"") - private Integer SmUserID; - @TableField("\"Field_SmUserID\"") - private Integer Field_SmUserID; - @TableField("\"CLASS\"") - private String CLASS; - @TableField("\"NAME\"") - private String NAME; - @TableField("\"NAMEABBR\"") - private String NAMEABBR; - @TableField("\"X\"") - private Double X; - @TableField("\"Y\"") - private Double Y; - @TableField("\"Geometry\"") - @JsonSerialize(using = ToStringSerializer.class) - private Geometry geometry; - - -} diff --git a/src/main/java/com/gis/xian/entity/qgis/base/SXCounty.java b/src/main/java/com/gis/xian/entity/qgis/base/SXCounty.java deleted file mode 100644 index 2431103..0000000 --- a/src/main/java/com/gis/xian/entity/qgis/base/SXCounty.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gis.xian.entity.qgis.base; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; -import org.locationtech.jts.geom.Geometry; - -/** - * @author zzw - * @description: 陕西省区县 - * @date 2026/5/26 上午9:46 - */ -@Data -@TableName("base.sx_zb_county") -public class SXCounty { - - - @TableField("\"SmUserID\"") - private Integer SmUserID; - @TableField("\"Field_SmUserID\"") - private Integer Field_SmUserID; - @TableField("\"Field_Field_SmUserID\"") - private Integer Field_Field_SmUserID; - @TableField("\"CLASS\"") - private String CLASS; - @TableField("\"NAME\"") - private String NAME; - @TableField("\"PINYIN\"") - private String PINYIN; - @TableField("\"GNID\"") - private Integer GNID; - @TableField("\"XZNAME\"") - private String XZNAME; - @TableField("\"X\"") - private Double X; - @TableField("\"Y\"") - private Double Y; - @TableField("\"Geometry\"") - @JsonSerialize(using = ToStringSerializer.class) - private Geometry geometry; - - - -} - diff --git a/src/main/java/com/gis/xian/entity/qgis/base/SXTowns.java b/src/main/java/com/gis/xian/entity/qgis/base/SXTowns.java deleted file mode 100644 index d5e2e89..0000000 --- a/src/main/java/com/gis/xian/entity/qgis/base/SXTowns.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.gis.xian.entity.qgis.base; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; -import org.locationtech.jts.geom.Geometry; - -/** - * @author zzw - * @description: 陕西省乡镇 - * @date 2026/5/26 上午9:56 - */ -@Data -@TableName("base.sx_towns") -public class SXTowns { - - - @TableField("\"SmUserID\"") - private Integer SmUserID; - @TableField("\"Field_SmUserID\"") - private Integer Field_SmUserID; - @TableField("\"CLASS\"") - private String CLASS; - @TableField("\"NAME\"") - private String NAME; - @TableField("\"PINYIN\"") - private String PINYIN; - @TableField("\"GNID\"") - private String GNID; - @TableField("\"XZNAME\"") - private String XZNAME; - @TableField("\"X\"") - private Double X; - @TableField("\"Y\"") - private Double Y; - @TableField("\"Geometry\"") - @JsonSerialize(using = ToStringSerializer.class) - private Geometry geometry; - - - -} diff --git a/src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeDistance.java b/src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeDistance.java deleted file mode 100644 index 5f2ef0b..0000000 --- a/src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeDistance.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.gis.xian.entity.qgis.earthquake; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import org.locationtech.jts.geom.Geometry; - -import java.time.LocalDateTime; - -/** - * @ClassName DZXXDistance - * @Description 震中距省市县乡镇距离 - * @Author zzw - * @Date 2026/5/25 11:51 - */ -@Data -@TableName("dzxx.dz_gis_distance") -public class EarthquakeDistance { - - @TableId(value = "id",type = IdType.ASSIGN_ID) - private Long Id; - @TableField("geom") - private Geometry geom; - @TableField("eqqueue_id") - private String eqQueueId; - @TableField("distance_id") - private Integer distanceId; - @TableField("pid") - private String pId; - @TableField("pname") - private String pname; - @TableField("bgmc") - private String bgmc; - @TableField("distance") - private Double distance; - @TableLogic - @TableField("del_flag") - private Integer delFlag = 0; - @TableField(value = "create_by",fill = FieldFill.INSERT_UPDATE) - private String createBy; - @TableField(value = "create_time",fill = FieldFill.INSERT_UPDATE) - private LocalDateTime createTime; - @TableField("remark") - private String remark; - -} - diff --git a/src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeGisInfluence.java b/src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeGisInfluence.java deleted file mode 100644 index 08574a5..0000000 --- a/src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeGisInfluence.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.gis.xian.entity.qgis.earthquake; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import org.locationtech.jts.geom.Geometry; - -import java.time.LocalDateTime; - -/** - * @author zzw - * @description: 地震烈度影响场 - * @date 2026/5/26 上午10:09 - */ - -@Data -@TableName("dzxx.dz_gis_influence") -public class EarthquakeGisInfluence { - - @TableId(value = "id",type = IdType.ASSIGN_ID) - private Long Id; - @TableField("geom") - private Geometry geom; // 椭圆面积 - @TableField("eqqueue_id") - private String eqQueueId; - @TableField("event") - private String event; - @TableField("eqname") - private String eqName; - @TableField("inty") - private Integer inty; // 烈度值 - @TableField("sinty") // 字符烈度值 - private String sInty; - @TableField("type") - private String type; - @TableField("area") - private Double area; // 烈度区面积 - @TableField("long_uranium") - private Double longUranium; - @TableField("short_uranium") - private Double shortUranium; - @TableField("direction") - private Double direction; // 偏转角度 - @TableLogic - @TableField("del_flag") - private Integer delFlag = 0; - @TableField(value = "create_by",fill = FieldFill.INSERT_UPDATE) - private String createBy; - @TableField(value = "create_time",fill = FieldFill.INSERT_UPDATE) - private LocalDateTime createTime; - @TableField("remark") - private String remark; - @TableField("longitude") - private Double longitude; - @TableField("latitude") - private Double latitude; - -} - diff --git a/src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeInfluence.java b/src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeInfluence.java deleted file mode 100644 index c871ec6..0000000 --- a/src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeInfluence.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.gis.xian.entity.qgis.earthquake; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * @author zzw - * @description: 地震影响场文件表 - * @date 2026/5/26 上午10:36 - */ -@Data -@TableName("public.dz_influence") -public class EarthquakeInfluence { - - @TableId(value = "id",type = IdType.ASSIGN_ID) - private Long Id; - @TableField("event") - private String event; - @TableField("name") - private String name; - @TableField("file") - private String file; - @TableField("path") - private String path; - @TableField("content") - private String content; - @TableField("intensity_column") - private String intensityColumn; - @TableField("source") - private String source; - @TableField("is_edit") - private Integer isEdit; - @TableField("is_pg") - private Integer isPg; - @TableLogic - @TableField("del_flag") - private Integer delFlag = 0; - @TableField(value = "create_by",fill = FieldFill.INSERT_UPDATE) - private String createBy; - @TableField(value = "create_time",fill = FieldFill.INSERT_UPDATE) - private LocalDateTime createTime; - @TableField(value = "create_dept",fill = FieldFill.INSERT_UPDATE) - private Integer createDept; - @TableField(value = "update_by",fill = FieldFill.INSERT_UPDATE) - private String updateBy; - @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; - @TableField("remark") - private String remark; - @TableField("eqqueue_id") - private String eqQueueId; - - -} - diff --git a/src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeProduct.java b/src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeProduct.java deleted file mode 100644 index 1676c16..0000000 --- a/src/main/java/com/gis/xian/entity/qgis/earthquake/EarthquakeProduct.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.gis.xian.entity.qgis.earthquake; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * @author zzw - * @description: 地震产品产出 - * @date 2026/5/26 上午10:57 - */ -@Data -@TableName("public.dz_product") -public class EarthquakeProduct { - - @TableId(value = "id",type = IdType.ASSIGN_ID) - private Long Id; - @TableField("eqqueue_id") - private String eqQueueId; - @TableField("templet_id") - private Integer templetId; // 模板编码id - @TableField("code") - private String code; - @TableField("pro_time") - private LocalDateTime proTime; - @TableField("file_type") - private String fileType; - @TableField("file_name") - private String fileName; - @TableField("file_path") - private String filePath; - @TableField("file_extension") - private String fileExtension; - @TableField("file_size") - private Double fileSize; - @TableField("pro_type") - private String proType; - @TableField("source_file") - private String sourceFile; - @TableField(value = "create_by",fill = FieldFill.INSERT_UPDATE) - private String createBy; - @TableField(value = "create_time",fill = FieldFill.INSERT_UPDATE) - private LocalDateTime createTime; - @TableField(value = "create_dept",fill = FieldFill.INSERT_UPDATE) - private Integer createDept; - @TableField(value = "update_by",fill = FieldFill.INSERT_UPDATE) - private String updateBy; - @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; - @TableField("remark") - private String remark; - -} - diff --git a/src/main/java/com/gis/xian/enums/qgis/BaseEnums.java b/src/main/java/com/gis/xian/enums/qgis/BaseEnums.java deleted file mode 100644 index e51d0c2..0000000 --- a/src/main/java/com/gis/xian/enums/qgis/BaseEnums.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.gis.xian.enums.qgis; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author zzw - * @description: 同用枚举 - * @date 2026/5/26 上午10:46 - */ -@Getter -@AllArgsConstructor -public enum BaseEnums { - // 评估枚举 - NOT_STARTED(0, "未开始"), - CALCULATING(1, "正在计算"), - NORMAL_COMPLETED(2, "正常完成"), - MANUAL_STOPPED(3, "人工停止"), - TIMEOUT_OR_EXCEPTION(4, "超时或异常结束"), - NOT_CALCULATE(5, "不计算"), - - // 制图枚举 - NO(10, "不缩放"), - PAN(11, "平移"), - LAYER(12, "单图层"), - M_LAYER(13, "多图层"), - DISTANCE(14, "距离"), // 需要数值。 - M_LAYER2(15, "按图层合并缩放"); - - - private final Integer code; - private final String desc; -} diff --git a/src/main/java/com/gis/xian/enums/qgis/EarthquakeMapsEnums.java b/src/main/java/com/gis/xian/enums/qgis/EarthquakeMapsEnums.java deleted file mode 100644 index 5a3056a..0000000 --- a/src/main/java/com/gis/xian/enums/qgis/EarthquakeMapsEnums.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.gis.xian.enums.qgis; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author zzw - * @description: 地震专题图集枚举 - * @date 2026/5/26 上午10:46 - */ -@Getter -@AllArgsConstructor -public enum EarthquakeMapsEnums { - - // 制图枚举 - EARTHQUAKE_DISTRIBUTION(1, "地震影响估计范围分布图"), - EARTHQUAKE_RUPTURE(2, "震中附近活动断裂分布图"), - EARTHQUAKE_HOSPITAL(3, "震区医院分布图"), - EARTHQUAKE_RESCUE_TEAM(4, "震中附近救援队伍分布图"), - EARTHQUAKE_RESCUE_MATERIAL(5, "震区附近救援物资分布图"), - EARTHQUAKE_VILLAGES_DISTANCE(6, "震中与乡镇距离图"), - EARTHQUAKE_TRAFFIC(7, "震区交通图"), - EARTHQUAKE_SCHOOL(8, "震区学校分布图"), - EARTHQUAKE_PEOPLE(9, "震区附近人口分布图"), - EARTHQUAKE_SAFE_PLACE(10, "震区附近疏散场地分布图"), - EARTHQUAKE_PUBLIC_PLACE(11, "震区附近公共场所分布图"), - EARTHQUAKE_DANGER_SOURCE(12, "震区危险源分布图"), - EARTHQUAKE_RISK_AREA(13, "震中附近风险区分布图"), - EARTHQUAKE_HIDE_POINT(14, "震区潜在地质灾害分布图"), - EARTHQUAKE_IMPORTANT_OBJECTS(15, "震区附近重要目标分布图"), - EARTHQUAKE_TOURIST_SPOT(16, "震区附近景区分布图"), - EARTHQUAKE_RESERVOIR(17, "震区附近水库分布图"), - EARTHQUAKE_DX(18, "震中地形图"), - EARTHQUAKE_CROPS(19, "震区附近农作物分布图"); - - private final Integer num; - private final String name; - - -} - diff --git a/src/main/java/com/gis/xian/enums/qgis/RainMapsEnums.java b/src/main/java/com/gis/xian/enums/qgis/RainMapsEnums.java deleted file mode 100644 index 84b9227..0000000 --- a/src/main/java/com/gis/xian/enums/qgis/RainMapsEnums.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gis.xian.enums.qgis; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author zzw - * @description: 暴雨专题图集枚举 - * @date 2026/5/26 上午10:46 - */ -@Getter -@AllArgsConstructor -public enum RainMapsEnums { - - // 制图枚举 - EARTHQUAKE_PEOPLE(1, "暴雨滑坡潜在隐患点及人口分布图"), - EARTHQUAKE_HOSPITAL(2, "暴雨山洪潜在隐患点及人口分布图"), - EARTHQUAKE_HIDE_POINT(3, "暴雨内涝潜在隐患点及人口分布图"), - EARTHQUAKE_VILLAGES_DISTANCE(4, "暴雨避难场所分布图"), - EARTHQUAKE_RESCUE_TEAM(5, "暴雨泥石流潜在隐患点及人口分布图"), - EARTHQUAKE_CROPS(6, "暴雨地灾风险区分布图"), - EARTHQUAKE_DX(7, "暴雨防汛物资分布图"), - EARTHQUAKE_RESERVOIR(8, "暴雨救援队伍分布图"), - EARTHQUAKE_DISTRIBUTION(9, "暴雨城市生命线工程分布图"), - EARTHQUAKE_PUBLIC_PLACE(10, "暴雨附近水库分布图"), - EARTHQUAKE_RESCUE_MATERIAL(11, "暴雨附近医院分布图"), - EARTHQUAKE_IMPORTANT_OBJECTS(12, "暴雨滑坡潜在隐患点及农作物分布图"), - EARTHQUAKE_RISK_AREA(13, "暴雨山洪潜在隐患点及农作物分布图"), - EARTHQUAKE_SAFE_PLACE(14, "暴雨内涝潜在隐患点及农作物分布图"), - EARTHQUAKE_TOURIST_SPOT(15, "暴雨泥石流潜在隐患点及农作物分布图"); - - private final Integer num; - private final String name; - - -} - diff --git a/src/main/java/com/gis/xian/listener/DeadLetterMessageListener.java b/src/main/java/com/gis/xian/listener/DeadLetterMessageListener.java deleted file mode 100644 index f7a6354..0000000 --- a/src/main/java/com/gis/xian/listener/DeadLetterMessageListener.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.gis.xian.listener; - -import com.alibaba.fastjson2.JSON; -import com.gis.xian.config.QgisProperties; -import com.gis.xian.domain.DeadLetterMessageDomain; -import com.gis.xian.constant.BaseConstants; -import com.gis.xian.enums.qgis.BaseEnums; -import com.gis.xian.dto.qgis.base.QgisArgsParams; -import com.gis.xian.service.qgis.earthquake.IEarthquakeQueueService; -import com.gis.xian.utils.BaseUtils; -import com.gis.xian.utils.HttpRequestClientUtils; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.rabbit.annotation.RabbitListener; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.stereotype.Component; - -/** - * @author zzw - * @description: DlqConsumer - * @date 2026/5/26 下午6:40 - */ -@Slf4j -@Component -public class DeadLetterMessageListener { - - @Resource - private HttpRequestClientUtils restclient; - @Resource - private RabbitTemplate rabbitTemplate; - @Resource - private IEarthquakeQueueService IEarthquakeQueueService; - @Resource - private QgisProperties qgisProperties; - - // 最大重试次数 - private int maxRetry = 3; - - // 死信队列消费者 - @RabbitListener(queues = BaseConstants.DLQ_QUEUE) - public void handleDlqMessage(DeadLetterMessageDomain deadLetterMessageDomain) { - QgisArgsParams arg = deadLetterMessageDomain.getQgisArgsParams(); - int currentRetryCount = deadLetterMessageDomain.getRetryCount(); - - try { - log.info("处理死信队列消息! 参数ID:{} 重试次数:{}", arg.getId(), currentRetryCount); - - // 判断是否超过最大重试次数 - if (currentRetryCount >= maxRetry) { - log.error("消息重试次数已达上限! 参数ID:{} 失败原因:{}", arg.getId(), deadLetterMessageDomain.getFailReason()); - // 处理:告警+记录到失败表+人工介入 - sendAlarm(arg, deadLetterMessageDomain); - saveToFailTable(deadLetterMessageDomain); - return; - } - - // 重试处理逻辑(复用原invoke的核心逻辑) - ParameterizedTypeReference res = new ParameterizedTypeReference() { - }; - String mapName = restclient.post(qgisProperties.getUrl(), JSON.toJSON(arg), res); - - if (mapName == null || mapName.equals("")) { - throw new Exception("重试后产出图件仍失败"); - } - - // 重试成功:记录日志 + 推送原业务消息 - log.info("死信消息处理成功! 参数ID:{} 图件名称:{}", arg.getId(), mapName); - // 更新进度 - double p = 0; - if (arg.getDisaster() == BaseConstants.EQ_DISASTER_MAP) { - p = BaseUtils.compute(arg.getId() + 1, 0); - } - if (arg.getDisaster() == BaseConstants.RAIN_DISASTER_MAP) { - p = BaseUtils.compute(arg.getId() + 1, 1); - } - IEarthquakeQueueService.updated(arg.getEvent(), arg.getQueueId(), p, BaseEnums.CALCULATING.getCode()); - // 推送原业务消息 - rabbitTemplate.convertAndSend(BaseConstants.ASSESS_EXCHANGE, BaseConstants.MAPS_QUEUE, arg); - - } catch (Exception e) { - log.error("死信消息重试失败! 参数ID:{} 重试次数:{}", arg.getId(), currentRetryCount, e); - // 重试失败:更新重试次数,重新发送到死信队列(设置延迟) - deadLetterMessageDomain.setRetryCount(currentRetryCount + 1); - deadLetterMessageDomain.setFailReason(deadLetterMessageDomain.getFailReason() + " | 重试失败:" + e.getMessage()); - // 延迟发送(需要安装rabbitmq_delayed_message_exchange插件) - rabbitTemplate.convertAndSend( - BaseConstants.DLX_EXCHANGE, - BaseConstants.DLQ_QUEUE, - deadLetterMessageDomain, - message -> { - // 设置延迟时间(指数退避:10s, 30s, 60s) - long delay = 10000 * (long) Math.pow(3, currentRetryCount); -// message.getMessageProperties().setDelay((int) delay); - message.getMessageProperties().setHeader("x-delay", (int) delay); - return message; - } - ); - log.info("死信消息已重新投递! 参数ID:{} 下次重试延迟:{}ms", arg.getId(), - 10000 * (long) Math.pow(3, currentRetryCount)); - } - } - - // 发送告警(邮件/短信/钉钉等) - private void sendAlarm(QgisArgsParams arg, DeadLetterMessageDomain deadLetterMessageDomain) { - // 实现告警逻辑:调用钉钉机器人/邮件接口等 - log.error("【告警】图件处理失败需要人工介入! 参数ID:{} 失败原因:{}", arg.getId(), deadLetterMessageDomain.getFailReason()); - } - - // 保存失败记录到数据库 - private void saveToFailTable(DeadLetterMessageDomain deadLetterMessageDomain) { - // 实现数据库存储逻辑,便于人工排查和处理 - log.info("失败记录已保存到数据库! 参数ID:{}", deadLetterMessageDomain.getQgisArgsParams().getId()); - } -} - diff --git a/src/main/java/com/gis/xian/listener/qgis/MapReceiveListener.java b/src/main/java/com/gis/xian/listener/qgis/MapReceiveListener.java deleted file mode 100644 index 121904f..0000000 --- a/src/main/java/com/gis/xian/listener/qgis/MapReceiveListener.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.gis.xian.listener.qgis; - -import com.gis.xian.config.DataSourceContextHolder; -import com.gis.xian.constant.BaseConstants; -import com.gis.xian.entity.qgis.earthquake.EarthquakeProduct; -import com.gis.xian.dto.qgis.base.QgisArgsParams; -import com.gis.xian.service.ex.ServeException; -import com.gis.xian.service.qgis.earthquake.IEarthquakeProductService; -import com.rabbitmq.client.Channel; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.core.Message; -import org.springframework.amqp.rabbit.annotation.RabbitListener; -import org.springframework.amqp.support.AmqpHeaders; -import org.springframework.messaging.handler.annotation.Header; -import org.springframework.stereotype.Component; - - -import java.io.File; -import java.io.IOException; -import java.time.LocalDateTime; - -/** - * @author zzw - * @description: 专题图产出监听器 - * @date 2026/6/4 下午4:10 - */ -@Slf4j -@Component -public class MapReceiveListener { - - @Resource - private IEarthquakeProductService IEarthquakeProductService; - - @PostConstruct - public void init() { - log.info("========================================"); - log.info("MapReceiveListener 监听器已初始化"); - log.info("正在监听队列: maps"); - log.info("监听方法: receive(QgisArgs args, Channel channel, ...)"); - log.info("ACK模式: MANUAL (手动确认)"); - log.info("========================================"); - } - - // rabbitmq 监听专题图队列 - @RabbitListener(queues = "maps", ackMode = "MANUAL") - public void receive(QgisArgsParams args, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag, Message message) throws IOException { - log.info("接收通知:{} 已生成!", args.getName()); - try { - // 获取路径 - File originFile = new File(args.getOutFile()); - if (!originFile.exists()) { - throw new ServeException(BaseConstants.FILE_NOT_FOUND_ERROR); - } - - // 直接使用本地文件路径保存到数据库 - handleData(args, originFile.getAbsolutePath()); - log.info("{} 本地路径已保存到数据库!", args.getName()); - - // 手动确认消息 - channel.basicAck(deliveryTag, false); - log.info("ack:消息确认成功!"); - - } catch (Exception ex) { - ex.printStackTrace(); - log.error("处理消息失败: {}", ex); - - /** - * 参数说明: - * 1. deliveryTag:消息唯一标识 - * 2. multiple:是否拒绝多条 - * 3. requeue:是否重新入队(false=直接丢弃,true=重新入队重试) - * 建议:非幂等业务设置为 false,避免死循环;幂等业务可设置为 true - */ - channel.basicNack(deliveryTag, false, false); - - // 抛出异常 - throw new ServeException(BaseConstants.THEMATIC_FAILED); - } - } - - private void handleData(QgisArgsParams args, String filePath) { - try { - DataSourceContextHolder.setDataSource("slave1"); - log.debug("切换数据源到: slave1"); - - EarthquakeProduct product = new EarthquakeProduct(); - product.setEqQueueId(args.getQueueId()); - product.setProTime(LocalDateTime.now()); - product.setCode(args.getMapLayout()); - product.setFileType("图片"); - product.setFileName(args.getName()); - product.setFilePath(args.getPath()); - product.setFileExtension(".jpg"); - // 地震/暴雨 专题图 - product.setProType(args.getDisaster()); - - // 将本地文件路径设置到源文件字段中 - product.setSourceFile(filePath); - - // 将图件信息插入到结果表中 - IEarthquakeProductService.save(product); - log.info("{} 已保存到数据库!", args.getName()); - } finally { - DataSourceContextHolder.clearDataSource(); - log.debug("清除数据源上下文"); - } - } -} diff --git a/src/main/java/com/gis/xian/mapper/qgis/base/ActiveFaultMapper.java b/src/main/java/com/gis/xian/mapper/qgis/base/ActiveFaultMapper.java deleted file mode 100644 index c28621d..0000000 --- a/src/main/java/com/gis/xian/mapper/qgis/base/ActiveFaultMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gis.xian.mapper.qgis.base; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gis.xian.entity.qgis.base.ActiveFault; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author zzw - * @description: ShanXiCitiesMapper - * @date 2026/5/25 下午5:21 - */ -@Mapper -public interface ActiveFaultMapper extends BaseMapper { -} diff --git a/src/main/java/com/gis/xian/mapper/qgis/base/ShanXiCitiesMapper.java b/src/main/java/com/gis/xian/mapper/qgis/base/ShanXiCitiesMapper.java deleted file mode 100644 index 23d0606..0000000 --- a/src/main/java/com/gis/xian/mapper/qgis/base/ShanXiCitiesMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gis.xian.mapper.qgis.base; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gis.xian.entity.qgis.base.SXCities; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author zzw - * @description: ShanXiCitiesMapper - * @date 2026/5/25 下午5:21 - */ -@Mapper -public interface ShanXiCitiesMapper extends BaseMapper { -} diff --git a/src/main/java/com/gis/xian/mapper/qgis/base/ShanXiCountyMapper.java b/src/main/java/com/gis/xian/mapper/qgis/base/ShanXiCountyMapper.java deleted file mode 100644 index 45fb094..0000000 --- a/src/main/java/com/gis/xian/mapper/qgis/base/ShanXiCountyMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gis.xian.mapper.qgis.base; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gis.xian.entity.qgis.base.SXCounty; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author zzw - * @description: ShanXiCountyMapper - * @date 2026/5/25 下午5:21 - */ -@Mapper -public interface ShanXiCountyMapper extends BaseMapper { -} diff --git a/src/main/java/com/gis/xian/mapper/qgis/base/ShanXiTownsMapper.java b/src/main/java/com/gis/xian/mapper/qgis/base/ShanXiTownsMapper.java deleted file mode 100644 index 96f1945..0000000 --- a/src/main/java/com/gis/xian/mapper/qgis/base/ShanXiTownsMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gis.xian.mapper.qgis.base; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gis.xian.entity.qgis.base.SXTowns; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author zzw - * @description: ShanXiCountyMapper - * @date 2026/5/25 下午5:21 - */ -@Mapper -public interface ShanXiTownsMapper extends BaseMapper { -} diff --git a/src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeDistanceMapper.java b/src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeDistanceMapper.java deleted file mode 100644 index e90abc9..0000000 --- a/src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeDistanceMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gis.xian.mapper.qgis.earthquake; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gis.xian.entity.qgis.earthquake.EarthquakeDistance; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author zzw - * @description: 震中到省市县乡距离表 - * @date 2026/5/25 下午6:20 - */ -@Mapper -public interface EarthquakeDistanceMapper extends BaseMapper { -} diff --git a/src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeGISInfluenceMapper.java b/src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeGISInfluenceMapper.java deleted file mode 100644 index 158ef2d..0000000 --- a/src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeGISInfluenceMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gis.xian.mapper.qgis.earthquake; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gis.xian.entity.qgis.earthquake.EarthquakeGisInfluence; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author zzw - * @description: 震中到省市县乡距离表 - * @date 2026/5/25 下午6:20 - */ -@Mapper -public interface EarthquakeGISInfluenceMapper extends BaseMapper { -} diff --git a/src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeInfluenceMapper.java b/src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeInfluenceMapper.java deleted file mode 100644 index 72f88d9..0000000 --- a/src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeInfluenceMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gis.xian.mapper.qgis.earthquake; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gis.xian.entity.qgis.earthquake.EarthquakeInfluence; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author zzw - * @description: EarthquakeInfluenceMapper - * @date 2026/5/25 下午6:01 - */ -@Mapper -public interface EarthquakeInfluenceMapper extends BaseMapper { -} diff --git a/src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeProductMapper.java b/src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeProductMapper.java deleted file mode 100644 index 6dbe332..0000000 --- a/src/main/java/com/gis/xian/mapper/qgis/earthquake/EarthquakeProductMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gis.xian.mapper.qgis.earthquake; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gis.xian.entity.qgis.earthquake.EarthquakeProduct; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author zzw - * @description: EarthquakeProductMapper - * @date 2026/5/25 下午6:01 - */ -@Mapper -public interface EarthquakeProductMapper extends BaseMapper { -} diff --git a/src/main/java/com/gis/xian/service/qgis/base/DeadLetterMessageService.java b/src/main/java/com/gis/xian/service/qgis/base/DeadLetterMessageService.java deleted file mode 100644 index 810f51a..0000000 --- a/src/main/java/com/gis/xian/service/qgis/base/DeadLetterMessageService.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.gis.xian.service.qgis.base; - -import com.gis.xian.domain.DeadLetterMessageDomain; -import com.gis.xian.constant.BaseConstants; -import com.gis.xian.dto.qgis.base.QgisArgsParams; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.stereotype.Component; - -/** - * @author zzw - * @description: 死信队列 - * @date 2026/5/26 下午4:59 - */ -@Slf4j -@Component -public class DeadLetterMessageService { - - @Resource - private RabbitTemplate rabbitTemplate; - - /** - * 发送消息到死信队列 - * - * @param arg 失败的参数 - * @param reason 失败原因 - * @param e 异常信息 - */ - public void sendToDlq(QgisArgsParams arg, String reason, Exception e) { - try { - // 封装死信消息体,包含原始参数、失败原因、异常信息、重试次数等 - DeadLetterMessageDomain deadLetterMessageDomain = DeadLetterMessageDomain.builder() - .qgisArgsParams(arg) - .failReason(reason + (e != null ? " | " + e.getMessage() : "")) - .failTime(System.currentTimeMillis()) - .retryCount(0) // 初始重试次数为0 - .build(); - // 发送到死信队列 - rabbitTemplate.convertAndSend( - BaseConstants.DLX_EXCHANGE, - BaseConstants.DLQ_QUEUE, - deadLetterMessageDomain - ); - log.info("消息已发送到死信队列! 参数ID:{}", arg.getId()); - } catch (Exception ex) { - log.error("发送死信队列失败! 参数ID:{}", arg.getId(), ex); - // 记录到数据库,避免消息丢失 - // saveToDb(arg, reason, e); - } - } - - -} diff --git a/src/main/java/com/gis/xian/service/qgis/base/IActiveFaultService.java b/src/main/java/com/gis/xian/service/qgis/base/IActiveFaultService.java deleted file mode 100644 index 3cfd70c..0000000 --- a/src/main/java/com/gis/xian/service/qgis/base/IActiveFaultService.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.gis.xian.service.qgis.base; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gis.xian.config.DataSource; -import com.gis.xian.dto.qgis.base.ActiveFaultDTO; -import com.gis.xian.entity.qgis.base.ActiveFault; - -/** - * @author zzw - * @description: 活动断层服务 - * @date 2026/5/26 上午8:31 - */ -@DataSource("slave1") -public interface IActiveFaultService extends IService { - - // 查找距离震中最近的一条断层数据 - public ActiveFaultDTO getShortlyFault(double lon, double lat); - -} diff --git a/src/main/java/com/gis/xian/service/qgis/base/IFeignService.java b/src/main/java/com/gis/xian/service/qgis/base/IFeignService.java index 0ea447e..620305c 100644 --- a/src/main/java/com/gis/xian/service/qgis/base/IFeignService.java +++ b/src/main/java/com/gis/xian/service/qgis/base/IFeignService.java @@ -1,18 +1,16 @@ package com.gis.xian.service.qgis.base; -import com.gis.xian.config.DataSource; -import com.gis.xian.dto.qgis.base.QgisArgsParams; - -import java.util.List; +import com.gis.xian.dto.qgis.base.QgisTriggerDTO; /** - * @author zzw - * @description: 三方服务接口 - * @date 2026/5/25 下午6:01 + * 统一专题图触发接口 + * 只负责调用 Python 端,不返回结果 */ -@DataSource("slave1") public interface IFeignService { - // 调用专题图 - public void invoke(List args); + /** + * 触发专题图生成 + * @param triggerDTO 包含 simulationId 和 type + */ + void trigger(QgisTriggerDTO triggerDTO); } diff --git a/src/main/java/com/gis/xian/service/qgis/base/IShanXiCitiesService.java b/src/main/java/com/gis/xian/service/qgis/base/IShanXiCitiesService.java deleted file mode 100644 index c911cc4..0000000 --- a/src/main/java/com/gis/xian/service/qgis/base/IShanXiCitiesService.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.gis.xian.service.qgis.base; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gis.xian.config.DataSource; -import com.gis.xian.dto.qgis.base.ShanXiCitiesDTO; -import com.gis.xian.entity.qgis.base.SXCities; - -import java.util.List; - -/** - * @author zzw - * @description: 陕西省市区 - * @date 2026/5/26 上午8:31 - */ -@DataSource("slave1") -public interface IShanXiCitiesService extends IService { - - // 查询距离震中最近的市州 - public List getMostIntensityAreaCities(double lon, double lat); - -} diff --git a/src/main/java/com/gis/xian/service/qgis/base/IShanXiCountyService.java b/src/main/java/com/gis/xian/service/qgis/base/IShanXiCountyService.java deleted file mode 100644 index fe9ea78..0000000 --- a/src/main/java/com/gis/xian/service/qgis/base/IShanXiCountyService.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.gis.xian.service.qgis.base; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gis.xian.config.DataSource; -import com.gis.xian.dto.qgis.base.ShanXiCountyDTO; -import com.gis.xian.entity.qgis.base.SXCounty; - -import java.util.List; - -/** - * @author zzw - * @description: 陕西省区县 - * @date 2026/5/26 上午9:46 - */ -@DataSource("slave1") -public interface IShanXiCountyService extends IService { - - /** - * 根据距离来查询附近公里的承载体数量 - * - * @param dis 距离(km) - * @return 返回极震区县区 - */ - public List getMostIntensityAreaCounty(double dis, double lon, double lat); - -} diff --git a/src/main/java/com/gis/xian/service/qgis/base/IShanXiTownsService.java b/src/main/java/com/gis/xian/service/qgis/base/IShanXiTownsService.java deleted file mode 100644 index 6eec032..0000000 --- a/src/main/java/com/gis/xian/service/qgis/base/IShanXiTownsService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gis.xian.service.qgis.base; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gis.xian.config.DataSource; -import com.gis.xian.dto.qgis.base.ShanXiTownsDTO; -import com.gis.xian.entity.qgis.base.SXTowns; - -import java.util.List; - -/** - * @author zzw - * @description: 陕西省乡镇 - * @date 2026/5/26 上午9:56 - */ -@DataSource("slave1") -public interface IShanXiTownsService extends IService { - - /** - * 根据来查询附近公里的承载体数量 - * @param dis 距离(km) - * @return 返回极震区乡镇 - */ - public List getMostIntensityAreaTowns(double dis, double lon, double lat); - -} diff --git a/src/main/java/com/gis/xian/service/qgis/base/impl/ActiveFaultServiceImpl.java b/src/main/java/com/gis/xian/service/qgis/base/impl/ActiveFaultServiceImpl.java deleted file mode 100644 index f3289d3..0000000 --- a/src/main/java/com/gis/xian/service/qgis/base/impl/ActiveFaultServiceImpl.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.gis.xian.service.qgis.base.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gis.xian.config.DataSource; -import com.gis.xian.constant.BaseConstants; -import com.gis.xian.dto.qgis.base.ActiveFaultDTO; -import com.gis.xian.entity.qgis.base.ActiveFault; -import com.gis.xian.service.qgis.base.IActiveFaultService; -import com.gis.xian.utils.qgis.GeoDistanceHandler; -import com.gis.xian.mapper.qgis.base.ActiveFaultMapper; -import com.gis.xian.service.ex.ParmaException; -import com.gis.xian.utils.StringUtils; -import lombok.extern.slf4j.Slf4j; -import org.locationtech.jts.geom.Geometry; -import org.locationtech.jts.io.WKTWriter; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * @author zzw - * @description: 活断层业务层 - * @date 2026/5/26 上午10:21 - */ -@Slf4j -@Service -@DataSource("slave1") -public class ActiveFaultServiceImpl extends ServiceImpl implements IActiveFaultService { - private static final WKTWriter WKT_WRITER = new WKTWriter(); - - /** - * 根据震中点获取距离最近的断层数据 - * - * @param lon 震中经度 - * @param lat 震中纬度 - * @return 返回距离震中点最近的断层数据 - */ - @Override - public ActiveFaultDTO getShortlyFault(double lon, double lat) { - if (lon < -180 || lon > 180 || lat < -90 || lat > 90) { - throw new ParmaException(BaseConstants.PARAMS_ERROR); - } - // 获取所有断层数据 - List faults = this.baseMapper.selectList(null); - if (faults == null || faults.isEmpty()) { - throw new ParmaException(BaseConstants.RESULT_ERROR); - } - // 查找最近的一条 - ActiveFaultDTO fault = handle(faults, lon, lat); - - if (fault == null) { - throw new ParmaException(BaseConstants.RESULT_ERROR); - } - // 避难断层走向为空 - if (fault.getStrike() == null) { - fault.setStrike(0); - } - - // 返回 - return fault; - } - - /** - * 处理断层数据 - * - * @param lon 震中经度 - * @param lat 震中纬度 - * @return 返回实DTO断层实体 - */ - private ActiveFaultDTO handle(List faults, double lon, double lat) { - - // 记录最近断层、最小距离 - ActiveFault nearest = null; - // 所有断层中的最小距离 - double minTotalDistance = Double.MAX_VALUE; - // 计算距离并筛选最近 - for (ActiveFault fault : faults) { - try { - // 获取Geometry对象,并转换为标准WKT字符串 - Geometry geometry = fault.getGeometry(); - if (geometry == null) { - log.warn("断层名称:{} 无有效Geometry对象,跳过", fault.getName()); - continue; - } - - // 使用WKTWriter将Geometry对象转换为标准WKT字符串 - String lineStringWkt = WKT_WRITER.write(geometry); - - if (StringUtils.isBlank(lineStringWkt)) { - log.warn("断层名称:{} 转换后无有效WKT数据,跳过", fault.getName()); - continue; - } - - // 解析LINESTRING为端点坐标数组 - double[][] coordinates = GeoDistanceHandler.parseLineStringCoordinates(lineStringWkt); - if (coordinates.length < 2) { - log.warn("断层名称:{} 的LINESTRING无有效线段(端点数量<2),跳过", fault.getName()); - continue; - } - - // 计算该断层所有子线段的最短距离 - double minFaultDistance = Double.MAX_VALUE; // 单个断层内的最小子线段距离 - for (int i = 0; i < coordinates.length - 1; i++) { - // 提取子线段的两个端点(A和B) - double lonA = coordinates[i][0]; - double latA = coordinates[i][1]; - double lonB = coordinates[i + 1][0]; - double latB = coordinates[i + 1][1]; - - // 计算震中到该子线段的最短距离 - double segmentDistance = GeoDistanceHandler.calculateDistanceFromPointToLineString( - lon, lat, lonA, latA, lonB, latB - ); - - // 更新单个断层内的最小距离 - if (segmentDistance < minFaultDistance) { - minFaultDistance = segmentDistance; - } - } - - // 更新所有断层中的最近断层 - if (minFaultDistance < minTotalDistance) { - minTotalDistance = minFaultDistance; - nearest = fault; - } - } catch (Exception e) { - log.warn("处理断层名称:{} 失败,异常信息:{}", fault.getName(), e.getMessage(), e); - continue; - } - } - - // 转换 - ActiveFaultDTO activeFaultDTO = new ActiveFaultDTO(); - activeFaultDTO.setName(nearest.getName()); - activeFaultDTO.setDirection(nearest.getDirection()); - activeFaultDTO.setClination(nearest.getClination()); - activeFaultDTO.setShapeLen(nearest.getShape_Leng()); - activeFaultDTO.setGeometry(nearest.getGeometry()); - activeFaultDTO.setDistance(minTotalDistance); - - return activeFaultDTO; - } - - -} diff --git a/src/main/java/com/gis/xian/service/qgis/base/impl/FeignServiceImpl.java b/src/main/java/com/gis/xian/service/qgis/base/impl/FeignServiceImpl.java index ea4a010..fb8cd5b 100644 --- a/src/main/java/com/gis/xian/service/qgis/base/impl/FeignServiceImpl.java +++ b/src/main/java/com/gis/xian/service/qgis/base/impl/FeignServiceImpl.java @@ -1,99 +1,46 @@ package com.gis.xian.service.qgis.base.impl; import com.alibaba.fastjson2.JSON; -import com.gis.xian.config.DataSource; import com.gis.xian.config.QgisProperties; -import com.gis.xian.constant.BaseConstants; -import com.gis.xian.service.qgis.base.DeadLetterMessageService; -import com.gis.xian.enums.qgis.BaseEnums; -import com.gis.xian.dto.qgis.base.QgisArgsParams; -import com.gis.xian.service.ex.ParmaException; -import com.gis.xian.service.qgis.earthquake.IEarthquakeQueueService; +import com.gis.xian.dto.qgis.base.QgisTriggerDTO; import com.gis.xian.service.qgis.base.IFeignService; -import com.gis.xian.utils.BaseUtils; import com.gis.xian.utils.HttpRequestClientUtils; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Lazy; -import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.core.ParameterizedTypeReference; import org.springframework.stereotype.Service; -import java.util.List; - /** - * @author zzw - * @description: 三方服务接口 - * @date 2026/5/26 上午11:33 + * 统一专题图触发服务 + * 只负责调用 Python QGIS 服务,不处理计算和存库 */ @Slf4j @Service -@DataSource("slave1") public class FeignServiceImpl implements IFeignService { - @Resource private HttpRequestClientUtils restclient; - @Resource - private RabbitTemplate rabbitTemplate; - @Resource - @Lazy - private IEarthquakeQueueService IEarthquakeQueueService; - @Resource - private DeadLetterMessageService dlqOperate; + @Resource private QgisProperties qgisProperties; - // 调用制图服务 @Override - public void invoke(List args) { - // 进度 - double p = 0; - // 异常参数 - if (args == null || args.size() == 0) { - throw new ParmaException(BaseConstants.PARAMS_ERROR); + public void trigger(QgisTriggerDTO triggerDTO) { + if (triggerDTO == null || triggerDTO.getSimulationId() == null || triggerDTO.getType() == null) { + log.error("触发参数为空,simulationId={}, type={}", + triggerDTO != null ? triggerDTO.getSimulationId() : null, + triggerDTO != null ? triggerDTO.getType() : null); + return; } - // 保证尽可能的多产, 这里不要进行任何异常抛出, 只能记录失败的图层 + + log.info("触发专题图生成: simulationId={}, type={}", triggerDTO.getSimulationId(), triggerDTO.getType()); + try { - log.info("开始调用pyqgis服务"); - for (QgisArgsParams arg : args) { - try { // 处理单个图件 - // 返回数据格式 - ParameterizedTypeReference res = new ParameterizedTypeReference() { - }; - // 制图 - String mapName = restclient.post(qgisProperties.getUrl(), JSON.toJSON(arg), res); - // 专题图名称 - if (mapName == null || mapName.equals("")) { - log.error("产出图件失败!"); - // 进入死信队列 - dlqOperate.sendToDlq(arg, "产出图件返回空", null); - } - log.info("图件产品:{}-产出成功", mapName); - // 这里可能会出现线程抢占, 需要加入乐观锁 - if (arg.getDisaster() == BaseConstants.EQ_DISASTER_MAP) { - // 更新状态 专题图是第二部分产品 保证进度同步 所以需要 num+1 处理 - p = BaseUtils.compute(arg.getId() + 1, 0); - } - if (arg.getDisaster() == BaseConstants.RAIN_DISASTER_MAP) { - p = BaseUtils.compute(arg.getId() + 1, 1); - } - IEarthquakeQueueService.updated(arg.getEvent(), arg.getQueueId(), p, BaseEnums.CALCULATING.getCode()); - // 推送消息 - rabbitTemplate.convertAndSend(BaseConstants.ASSESS_EXCHANGE, BaseConstants.MAPS_QUEUE, arg); - } catch (Exception ex) { - log.error("制图服务出现错误,请检查服务问题! {}", ex.getMessage()); - // 进入死信队列 - dlqOperate.sendToDlq(arg, "图层处理异常", ex); - } - } + ParameterizedTypeReference res = new ParameterizedTypeReference() {}; + String result = restclient.post(qgisProperties.getUrl(), JSON.toJSON(triggerDTO), res); + log.info("Python 端响应: {}", result); } catch (Exception e) { - log.error("制图服务出现错误,请检查服务问题! {}", e.getMessage(), e); - // 批量失败时,将所有未处理的参数投递到死信 - for (QgisArgsParams arg : args) { - // 进入死信队列 - dlqOperate.sendToDlq(arg, "制图服务整体异常", e); - } + log.error("调用 Python QGIS 服务失败: {}", e.getMessage(), e); } } } diff --git a/src/main/java/com/gis/xian/service/qgis/base/impl/ShanXiCitiesServiceImpl.java b/src/main/java/com/gis/xian/service/qgis/base/impl/ShanXiCitiesServiceImpl.java deleted file mode 100644 index 63e3afb..0000000 --- a/src/main/java/com/gis/xian/service/qgis/base/impl/ShanXiCitiesServiceImpl.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.gis.xian.service.qgis.base.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gis.xian.config.DataSource; -import com.gis.xian.constant.BaseConstants; -import com.gis.xian.dto.qgis.base.ShanXiCitiesDTO; -import com.gis.xian.entity.qgis.base.SXCities; -import com.gis.xian.service.qgis.base.IShanXiCitiesService; -import com.gis.xian.utils.qgis.GeoDistanceHandler; -import com.gis.xian.mapper.qgis.base.ShanXiCitiesMapper; -import com.gis.xian.service.ex.ParmaException; -import com.gis.xian.utils.StringUtils; -import lombok.extern.slf4j.Slf4j; -import org.locationtech.jts.geom.Geometry; -import org.locationtech.jts.io.WKTWriter; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; - -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; - -/** - * @author zzw - * @description: ShanXiCitiesServiceImpl - * @date 2026/5/26 上午8:38 - */ -@Slf4j -@Service -@DataSource("slave1") -public class ShanXiCitiesServiceImpl extends ServiceImpl implements IShanXiCitiesService { - - - private static final WKTWriter WKT_WRITER = new WKTWriter(); - - // 查询距离震中最近的市州 - @Override - public List getMostIntensityAreaCities(double lon, double lat) { - // 边界判断 - if (lon < -180 || lon > 180 || lat < -90 || lat > 90) { - throw new ParmaException(BaseConstants.PARAMS_ERROR); - } - // 获取所有市州 - List cities = this.baseMapper.selectList(null); - if (cities == null || cities.isEmpty()) { - throw new ParmaException(BaseConstants.RESULT_ERROR); - } - - // 获取附近震中 最近的市州(本地和外地) - List citiesDto = handle(cities, lon, lat); - if (citiesDto == null) { - throw new ParmaException(BaseConstants.RESULT_ERROR); - } - // 城市数据 - return citiesDto; - } - - /** - * 处理最近距离震中最近 - * - * @param cities - * @param lon - * @param lat - */ - private List handle(List cities, double lon, double lat) { - // 记录距离最近的市州 - List citiesdots = new ArrayList<>(); - // 记录最近市州、最小距离 - SXCities nearest = null; - // 所有市州中的最小距离 - double minTotalDistance = Double.MAX_VALUE; - // 保留两位小数 - DecimalFormat df = new DecimalFormat("#.00"); - df.setRoundingMode(java.math.RoundingMode.HALF_UP); - - // 计算距离并筛选最近 - for (SXCities city : cities) { - try { - // 获取Geometry对象,并转换为标准WKT字符串 - Geometry geometry = city.getGeometry(); - if (geometry == null) { - log.warn("市州名称:{} 无有效Geometry对象,无法解析该空间类型", city.getNAME()); - continue; - } - // 使用WKTWriter将Geometry对象转换为标准WKT字符串 - String pointStringWkt = WKT_WRITER.write(geometry); - if (StringUtils.isBlank(pointStringWkt)) { - log.warn("市州名称:{} 转换后无有效WKT数据,无法解析该空间类型", city.getNAME()); - continue; - } - // 计算震中到当前点的距离 - double distance = GeoDistanceHandler.calculateDistanceFromEpicenterToRegionPoint(lon, lat, pointStringWkt); - // 计算该断层所有市州段的最短距离 - double minCityDistance = Double.MAX_VALUE; - if (distance < minCityDistance) { - minCityDistance = distance; - } - - // 更新市州距离 - if (minCityDistance < minTotalDistance) { - minTotalDistance = minCityDistance; - nearest = city; - } - - } catch (Exception e) { - log.warn("处理市州名称:{} 失败,异常信息:{}", city.getNAME(), e.getMessage(), e); - continue; - } - } - log.info("震中距{}市中{}km!", nearest.getNAME(), minTotalDistance); - ShanXiCitiesDTO citiesdto = new ShanXiCitiesDTO(); - // 是否西安,不是的话需要返回临市和本市 - if (!nearest.getNAME().equals("西安市")) { - - // 计算震中到西安的距离 - double distance = GeoDistanceHandler.calculateDistanceFromEpicenterToRegionPoint(lon, lat, "POINT (108.935124 34.343595)"); - // citiesdto.setGeometry(); - citiesdto.setDistance(Double.parseDouble(df.format(distance))); - citiesdto.setX(108.935124); - citiesdto.setY(34.343595); - citiesdto.setNAME("西安市"); - - citiesdots.add(citiesdto); - return citiesdots; - } - // 西安属地 - BeanUtils.copyProperties(nearest,citiesdto); - // 保留两位小数 - citiesdto.setDistance(Double.parseDouble(df.format(minTotalDistance))); - - citiesdots.add(citiesdto); - // 距离最近的市州 - return citiesdots; - } - -} diff --git a/src/main/java/com/gis/xian/service/qgis/base/impl/ShanXiCountyServiceImpl.java b/src/main/java/com/gis/xian/service/qgis/base/impl/ShanXiCountyServiceImpl.java deleted file mode 100644 index f7b6950..0000000 --- a/src/main/java/com/gis/xian/service/qgis/base/impl/ShanXiCountyServiceImpl.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.gis.xian.service.qgis.base.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gis.xian.config.DataSource; -import com.gis.xian.constant.BaseConstants; -import com.gis.xian.dto.qgis.base.ShanXiCountyDTO; -import com.gis.xian.entity.qgis.base.SXCounty; -import com.gis.xian.service.qgis.base.IShanXiCountyService; -import com.gis.xian.utils.qgis.GeoDistanceHandler; -import com.gis.xian.mapper.qgis.base.ShanXiCountyMapper; -import com.gis.xian.service.ex.ParmaException; -import com.gis.xian.utils.StringUtils; -import lombok.extern.slf4j.Slf4j; -import org.locationtech.jts.geom.Geometry; -import org.locationtech.jts.io.WKTWriter; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author zzw - * @description: ShanXiCountyServiceImpl - * @date 2026/5/26 上午9:49 - */ -@Slf4j -@Service -@DataSource("slave1") -public class ShanXiCountyServiceImpl extends ServiceImpl implements IShanXiCountyService { - - private static final WKTWriter WKT_WRITER = new WKTWriter(); - - // 查询距离震中最近的市州 - @Override - public List getMostIntensityAreaCounty(double dis, double lon, double lat) { - // 边界判断 - if (lon < -180 || lon > 180 || lat < -90 || lat > 90) { - throw new ParmaException(BaseConstants.PARAMS_ERROR); - } - // 距离值判断 - if (dis < 0) { - throw new ParmaException(BaseConstants.PARAMS_ERROR); - } - - // 获取所有区县 - List counties = this.baseMapper.selectList(null); - if (counties == null || counties.isEmpty()) { - throw new ParmaException(BaseConstants.RESULT_ERROR); - } - - // 获取附近震中 区县 - List countiesDto = handle(counties, lon, lat, dis); - if (countiesDto == null) { - throw new ParmaException(BaseConstants.RESULT_ERROR); - } - // 区县数据 - return countiesDto; - } - - /** - * 筛选指定距离下的所有区县 - * @param counties - * @param lon - * @param lat - */ - private List handle(List counties, double lon, double lat, double dis) { - // 区县距离表 - List countiesdots = new ArrayList<>(); - - // 计算距离并筛选最近 - for (SXCounty county : counties) { - try { - // 获取Geometry对象,并转换为标准WKT字符串 - Geometry geometry = county.getGeometry(); - if (geometry == null) { - log.warn("市州名称:{} 无有效Geometry对象,无法解析该空间类型", county.getNAME()); - continue; - } - // 使用WKTWriter将Geometry对象转换为标准WKT字符串 - String pointStringWkt = WKT_WRITER.write(geometry); - if (StringUtils.isBlank(pointStringWkt)) { - log.warn("市州名称:{} 转换后无有效WKT数据,无法解析该空间类型", county.getNAME()); - continue; - } - // 计算震中到当前点的距离 - double distance = GeoDistanceHandler.calculateDistanceFromEpicenterToRegionPoint(lon, lat, pointStringWkt); - - // 判断是否在指定范围内 - if (distance < dis) { - ShanXiCountyDTO countydto = new ShanXiCountyDTO(); - BeanUtils.copyProperties(county, countydto); - countydto.setDistance(distance); - // 指定范围内的所有县区 - countiesdots.add(countydto); - } - - } catch (Exception e) { - log.warn("处理区县名称:{} 失败,异常信息:{}", county.getNAME(), e.getMessage(), e); - continue; - } - } - log.info("震中{}km范围内共有{}个县区!", dis, countiesdots.size()); - - // 距离最近的市州 - return countiesdots; - } - -} diff --git a/src/main/java/com/gis/xian/service/qgis/base/impl/ShanXiTownsServiceImpl.java b/src/main/java/com/gis/xian/service/qgis/base/impl/ShanXiTownsServiceImpl.java deleted file mode 100644 index d3741d4..0000000 --- a/src/main/java/com/gis/xian/service/qgis/base/impl/ShanXiTownsServiceImpl.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.gis.xian.service.qgis.base.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gis.xian.config.DataSource; -import com.gis.xian.constant.BaseConstants; -import com.gis.xian.dto.qgis.base.ShanXiTownsDTO; -import com.gis.xian.entity.qgis.base.SXTowns; -import com.gis.xian.service.qgis.base.IShanXiTownsService; -import com.gis.xian.utils.qgis.GeoDistanceHandler; -import com.gis.xian.mapper.qgis.base.ShanXiTownsMapper; -import com.gis.xian.service.ex.ParmaException; -import com.gis.xian.utils.StringUtils; -import lombok.extern.slf4j.Slf4j; -import org.locationtech.jts.geom.Geometry; -import org.locationtech.jts.io.WKTWriter; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author zzw - * @description: ShanXiTownsServiceImpl - * @date 2026/5/26 上午9:59 - */ -@Slf4j -@Service -@DataSource("slave1") -public class ShanXiTownsServiceImpl extends ServiceImpl implements IShanXiTownsService { - - private static final WKTWriter WKT_WRITER = new WKTWriter(); - - // 查询距离震中最近的市州 - @Override - public List getMostIntensityAreaTowns(double dis, double lon, double lat) { - // 边界判断 - if (lon < -180 || lon > 180 || lat < -90 || lat > 90) { - throw new ParmaException(BaseConstants.PARAMS_ERROR); - } - // 距离值判断 - if (dis < 0) { - throw new ParmaException(BaseConstants.PARAMS_ERROR); - } - - // 获取所有乡镇 - List towns = this.baseMapper.selectList(null); - if (towns == null || towns.isEmpty()) { - throw new ParmaException(BaseConstants.RESULT_ERROR); - } - - // 获取附近震中 乡镇 - List townsDto = handle(towns, lon, lat, dis); - if (townsDto == null) { - throw new ParmaException(BaseConstants.RESULT_ERROR); - } - // 乡镇数据 - return townsDto; - } - - /** - * 筛选指定距离下的所有乡镇 - * @param towns - * @param lon - * @param lat - */ - private List handle(List towns, double lon, double lat, double dis) { - // 乡镇距离表 - List townsdots = new ArrayList<>(); - - // 计算距离并筛选最近 - for (SXTowns town : towns) { - try { - // 获取Geometry对象,并转换为标准WKT字符串 - Geometry geometry = town.getGeometry(); - if (geometry == null) { - log.warn("乡镇名称:{} 无有效Geometry对象,无法解析该空间类型", town.getNAME()); - continue; - } - // 使用WKTWriter将Geometry对象转换为标准WKT字符串 - String pointStringWkt = WKT_WRITER.write(geometry); - if (StringUtils.isBlank(pointStringWkt)) { - log.warn("乡镇名称:{} 转换后无有效WKT数据,无法解析该空间类型", town.getNAME()); - continue; - } - // 计算震中到当前点的距离 - double distance = GeoDistanceHandler.calculateDistanceFromEpicenterToRegionPoint(lon, lat, pointStringWkt); - - // 判断是否在指定范围内 - if (distance < dis) { - ShanXiTownsDTO towndto = new ShanXiTownsDTO(); - BeanUtils.copyProperties(town, towndto); - towndto.setDistance(distance); - // 指定范围内的所有乡镇 - townsdots.add(towndto); - } - - } catch (Exception e) { - log.warn("处理乡镇名称:{} 失败,异常信息:{}", town.getNAME(), e.getMessage(), e); - continue; - } - } - log.info("震中{}km范围内共有{}个乡镇!", dis, townsdots.size()); - - // 距离最近的市州 - return townsdots; - } - -} diff --git a/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeInfluenceService.java b/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeInfluenceService.java deleted file mode 100644 index bdfa050..0000000 --- a/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeInfluenceService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gis.xian.service.qgis.earthquake; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gis.xian.config.DataSource; -import com.gis.xian.dto.qgis.earthquake.EarthquakeInformationInfluenceDTO; -import com.gis.xian.entity.qgis.earthquake.EarthquakeInfluence; -import com.gis.xian.dto.qgis.earthquake.EarthquakeQuery; -import java.util.List; -import java.util.Map; - -/** - * @author zzw - * @description: 地震影响场 - * @date 2026/5/25 下午6:01 - */ -@DataSource("slave1") -public interface IEarthquakeInfluenceService extends IService { - - // 以文件形式 保存影响场 - public void handle(List dzxx); - - // 获取影响场文件 - public Map getInfluence(EarthquakeQuery query); - -} diff --git a/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeInformationDistanceService.java b/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeInformationDistanceService.java deleted file mode 100644 index 9056629..0000000 --- a/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeInformationDistanceService.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.gis.xian.service.qgis.earthquake; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gis.xian.config.DataSource; -import com.gis.xian.entity.qgis.earthquake.EarthquakeDistance; - -/** - * @ClassName IDZXXDistanceService - * @Description 震中到省市县乡距离 - * @Author zzw - * @Date 2026/5/25 12:06 - */ -@DataSource("slave1") -public interface IEarthquakeInformationDistanceService extends IService { - - // 处理震中到省市区镇 - public void handle(double lon, double lat, String eqQueueId); - -} diff --git a/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeInformationInfluenceService.java b/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeInformationInfluenceService.java deleted file mode 100644 index 53d8623..0000000 --- a/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeInformationInfluenceService.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.gis.xian.service.qgis.earthquake; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gis.xian.config.DataSource; -import com.gis.xian.dto.qgis.earthquake.EarthquakeInformationInfluenceDTO; -import com.gis.xian.dto.qgis.earthquake.EarthquakeAssessmentDTO; -import com.gis.xian.entity.qgis.earthquake.EarthquakeGisInfluence; -import com.gis.xian.dto.qgis.earthquake.EarthquakeQuery; - -import java.util.List; - -/** - * @author zzw - * @description: 地震影响场接口 - * @date 2026/5/25 下午6:09 - */ -@DataSource("slave1") -public interface IEarthquakeInformationInfluenceService extends IService { - - // 处理地震影响场数据 - public void handle(EarthquakeAssessmentDTO trigger); - - // 根据地震编码查询影响场范围 - public List findInfluenceById(EarthquakeQuery query); - - // 获取最大烈度影响场 - public EarthquakeInformationInfluenceDTO findInfluenceMaxIntyById(EarthquakeQuery query); - -} diff --git a/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeProductService.java b/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeProductService.java deleted file mode 100644 index 11f3eb9..0000000 --- a/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeProductService.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.gis.xian.service.qgis.earthquake; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gis.xian.config.DataSource; -import com.gis.xian.dto.qgis.earthquake.EarthquakeProductDTO; -import com.gis.xian.dto.qgis.earthquake.EarthquakeAssessmentDTO; -import com.gis.xian.dto.qgis.rain.RainAssessmentDTO; -import com.gis.xian.entity.qgis.earthquake.EarthquakeProduct; -import com.gis.xian.dto.qgis.base.ProductQuery; - -import java.util.List; - -/** - * @author zzw - * @description: IDZProductService - * @date 2026/5/25 下午6:01 - */ -@DataSource("slave1") -public interface IEarthquakeProductService extends IService { - - // qgis 地震制图服务 - public void makeEarthquakeMaps(EarthquakeAssessmentDTO assess); - - // qgis 暴雨制图服务 - public void makeRainstormMaps(RainAssessmentDTO assess); - - // 获取产品 - public List getProducts(ProductQuery query); -} diff --git a/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeQueueService.java b/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeQueueService.java index a464303..335c1af 100644 --- a/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeQueueService.java +++ b/src/main/java/com/gis/xian/service/qgis/earthquake/IEarthquakeQueueService.java @@ -1,25 +1,18 @@ package com.gis.xian.service.qgis.earthquake; import com.baomidou.mybatisplus.extension.service.IService; -import com.gis.xian.config.DataSource; -import com.gis.xian.dto.qgis.earthquake.EarthquakeAssessmentDTO; -import com.gis.xian.dto.qgis.rain.RainAssessmentDTO; import com.gis.xian.entity.qgis.earthquake.EarthquakeQueue; /** - * @author zzw - * @description: 地震评估 - * @date 2026/5/25 下午6:01 + * 地震评估队列服务 + * 简化为只负责触发 Python 端 */ -@DataSource("slave1") public interface IEarthquakeQueueService extends IService { - // 地震评估 - public void assess(EarthquakeAssessmentDTO assess); - - // 暴雨评估 - public void assess(RainAssessmentDTO assess); - - // 更新评估进度、状态 - public void updated(String event, String queueId, double progress, int state); + /** + * 触发专题图生成 + * @param simulationId 模拟ID + * @param type 类型:earthquake / rainstorm + */ + void trigger(String simulationId, String type); } diff --git a/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeEventServiceImpl.java b/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeEventServiceImpl.java index 1eeae4b..e732cbd 100644 --- a/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeEventServiceImpl.java +++ b/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeEventServiceImpl.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gis.xian.config.DataSource; import com.gis.xian.constant.BaseConstants; import com.gis.xian.dto.qgis.earthquake.EarthquakeCenterDTO; -import com.gis.xian.dto.qgis.earthquake.EarthquakeAssessmentDTO; import com.gis.xian.dto.qgis.earthquake.EarthquakeTriggerDTO; import com.gis.xian.entity.qgis.earthquake.EarthquakeEvent; import com.gis.xian.mapper.qgis.earthquake.EarthquakeEventMapper; @@ -24,81 +23,56 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** - * @author zzw - * @description: 地震事件实现 - * @date 2026/5/25 下午5:01 + * 地震事件服务 */ @Slf4j @Service @DataSource("slave1") -public class EarthquakeEventServiceImpl extends ServiceImpl implements IEarthquakeEventService { +public class EarthquakeEventServiceImpl extends ServiceImpl + implements IEarthquakeEventService { @Resource - private IEarthquakeInformationCenterService IEarthquakeInformationCenterService; + private IEarthquakeInformationCenterService informationCenterService; @Resource - private IEarthquakeQueueService IEarthquakeQueueService; + private IEarthquakeQueueService queueService; - // 地震业务触发 @Transactional @Override public EarthquakeQuery trigger(EarthquakeTriggerDTO trigger) { log.info("地震参数:{}", trigger); - // 异常值 if (trigger == null) { throw new ParmaException(BaseConstants.PARAMS_ERROR); } - // 专题图命名代码 + String code = BaseUtils.generationCode(trigger.getEqTime()); - // 地震业务 + try { EarthquakeCenterDTO dzxx = new EarthquakeCenterDTO(); BeanUtils.copyProperties(trigger, dzxx); dzxx.setEvent(code); log.info("地震专题图编码:{}", code); - // 震中位置存储 - IEarthquakeInformationCenterService.handle(dzxx); - // 地震基本信息存储 + informationCenterService.handle(dzxx); EarthquakeEvent dzeq = new EarthquakeEvent(); BeanUtils.copyProperties(dzxx, dzeq); save(dzeq); log.info("地震基本信息已存库..."); } catch (Exception ex) { log.error(ex.getMessage()); - ex.printStackTrace(); throw new ServeException(BaseConstants.EQ_SERVER_ERROR); } String batch = BaseUtils.generationBatchCode(code); - // 评估业务 - try { - EarthquakeAssessmentDTO assess = new EarthquakeAssessmentDTO(); - BeanUtils.copyProperties(trigger, assess); - assess.setEvent(code); - assess.setEqQueueId(batch); - - // 开始评估 - IEarthquakeQueueService.assess(assess); - } catch (Exception ex) { - log.error(ex.getMessage()); - ex.printStackTrace(); - throw new ServeException(BaseConstants.ASSESS_SERVER_ERROR); - } - // 地震编码 + queueService.trigger(code, "earthquake"); return new EarthquakeQuery(code, batch); } - // 删除地震 @Override public Boolean deletedById(Long Id) { - // 空值 if (Id == null) { throw new ParmaException(BaseConstants.PARAMS_ERROR); } - // 条件构造 LambdaQueryWrapper lambdaQuery = Wrappers.lambdaQuery(EarthquakeEvent.class); lambdaQuery.eq(EarthquakeEvent::getId, Id); - int flag = this.baseMapper.delete(lambdaQuery); - return flag > 0 ? true : false; + return this.baseMapper.delete(lambdaQuery) > 0; } - } diff --git a/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeInfluenceServiceImpl.java b/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeInfluenceServiceImpl.java deleted file mode 100644 index 3b54366..0000000 --- a/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeInfluenceServiceImpl.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.gis.xian.service.qgis.earthquake.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gis.xian.config.DataSource; -import com.gis.xian.config.QgisProperties; -import com.gis.xian.constant.BaseConstants; -import com.gis.xian.dto.qgis.earthquake.EarthquakeInformationInfluenceDTO; -import com.gis.xian.dto.qgis.earthquake.EarthquakeInfluenceDTO; -import com.gis.xian.dto.qgis.earthquake.EarthquakeInfluenceGeoJsonDTO; -import com.gis.xian.entity.qgis.earthquake.EarthquakeInfluence; -import com.gis.xian.service.qgis.earthquake.IEarthquakeInfluenceService; -import com.gis.xian.utils.qgis.GeoFilesHandler; -import com.gis.xian.mapper.qgis.earthquake.EarthquakeInfluenceMapper; -import com.gis.xian.dto.qgis.earthquake.EarthquakeQuery; -import com.gis.xian.service.ex.ParmaException; -import com.gis.xian.service.ex.ServiceException; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.locationtech.jts.geom.Polygon; -import org.springframework.beans.BeanUtils; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author zzw - * @description: 地震影响场实现 - * @date 2026/5/26 上午10:39 - */ -@Slf4j -@Service -@DataSource("slave1") -public class EarthquakeInfluenceServiceImpl extends ServiceImpl implements IEarthquakeInfluenceService { - - @Resource - private QgisProperties qgisProperties; - - - // 将影响场以文件形式保存 - @Async("xianPool") - @Override - public void handle(List dzxxs) { - // 异常 - if (dzxxs == null || dzxxs.isEmpty()) { - throw new ParmaException(BaseConstants.PARAMS_ERROR); - } - try { - // 影响场名称 - String fineName = ""; - EarthquakeInfluenceGeoJsonDTO features = new EarthquakeInfluenceGeoJsonDTO(); - EarthquakeInfluenceDTO influence = new EarthquakeInfluenceDTO(); - // 处理影响场数据 - for (EarthquakeInformationInfluenceDTO dzxx : dzxxs) { - // 接收面数据 - Polygon polygon = (Polygon) dzxx.getGeom(); - // 转换Polygon为GeoJSON Geometry结构 - EarthquakeInfluenceGeoJsonDTO.GeoJsonFeature feature = GeoFilesHandler.convertPolygonToGeoJsonFeature(polygon, dzxx); - features.getFeatures().add(feature); - // 根据批次编码拼接目录和文件名 - fineName = dzxx.getEqQueueId() + "/" + dzxx.getEqName(); - // 获取地震影响场信息 - influence.setEqQueueId(dzxx.getEqQueueId()); - influence.setEvent(dzxx.getEvent()); - influence.setName(dzxx.getEqName()); - } - - if (features.getFeatures() == null || features.getFeatures().isEmpty()) { - throw new ServiceException(BaseConstants.INFLUENCE_CONVERT_ERROR); - } - - // 保存GeoJSON文件 - GeoFilesHandler.writeGeoJsonToFile(features, fineName, qgisProperties); - log.info("地震影响场GeoJson文件已生成成功!"); - - influence.setPath(qgisProperties.getBasePath() + qgisProperties.getIntensityGeojsonPath() + fineName + ".geojson"); - handleDzxxData(influence); - - } catch (Exception ex) { - log.error("影响场保存为geojson失败!:", ex.getMessage()); - throw new ServiceException(BaseConstants.INFLUENCE_CONVERT_ERROR); - } - } - - // 获取影响场文件 - @Override - public Map getInfluence(EarthquakeQuery query) { - // 异常 - if (query == null) { - throw new ParmaException(BaseConstants.PARAMS_ERROR); - } - // 条件 - LambdaQueryWrapper lambdaQuery = Wrappers.lambdaQuery(EarthquakeInfluence.class); - lambdaQuery.select(EarthquakeInfluence::getPath); - lambdaQuery.eq(EarthquakeInfluence::getEvent, query.getEvent()); - lambdaQuery.eq(EarthquakeInfluence::getEqQueueId, query.getEqQueueId()); - lambdaQuery.orderByDesc(EarthquakeInfluence::getCreateTime); // 防止多条记录 - lambdaQuery.last("limit 1"); - // 查询 - EarthquakeInfluence influence = (EarthquakeInfluence) this.baseMapper.selectList(lambdaQuery); - if (influence == null) { - throw new ParmaException(BaseConstants.RESULT_ERROR); - } - Map hashmap = new HashMap<>(); - hashmap.put("file", influence.getPath()); - return hashmap; - } - - - // 处理地震信息数据 - private void handleDzxxData(EarthquakeInfluenceDTO dto) { - EarthquakeInfluence influence = new EarthquakeInfluence(); - BeanUtils.copyProperties(dto, influence); - // 存库 - save(influence); - } -} diff --git a/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeInformationDistanceServiceImpl.java b/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeInformationDistanceServiceImpl.java deleted file mode 100644 index 877c346..0000000 --- a/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeInformationDistanceServiceImpl.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.gis.xian.service.qgis.earthquake.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gis.xian.config.DataSource; -import com.gis.xian.constant.BaseConstants; -import com.gis.xian.dto.qgis.base.ShanXiCitiesDTO; -import com.gis.xian.dto.qgis.base.ShanXiCountyDTO; -import com.gis.xian.dto.qgis.base.ShanXiTownsDTO; -import com.gis.xian.dto.qgis.earthquake.EarthquakeDistanceDTO; -import com.gis.xian.entity.qgis.earthquake.EarthquakeDistance; -import com.gis.xian.mapper.qgis.earthquake.EarthquakeDistanceMapper; -import com.gis.xian.service.qgis.base.IShanXiCitiesService; -import com.gis.xian.service.qgis.base.IShanXiCountyService; -import com.gis.xian.service.qgis.base.IShanXiTownsService; -import com.gis.xian.service.qgis.earthquake.IEarthquakeInformationDistanceService; -import com.gis.xian.service.ex.ParmaException; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.locationtech.jts.geom.*; -import org.springframework.beans.BeanUtils; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author zzw - * @description: 震中到省市县乡距离 - * @date 2026/5/25 下午6:20 - */ -@Slf4j -@Service -@DataSource("slave1") -public class EarthquakeInformationDistanceServiceImpl extends ServiceImpl implements IEarthquakeInformationDistanceService { - private static final GeometryFactory GEOMETRY_FACTORY = new GeometryFactory(new PrecisionModel(PrecisionModel.FLOATING), 4326); - - @Resource - private IShanXiCitiesService iShanXiCitiesService; - @Resource - private IShanXiCountyService iShanXiCountyService; - @Resource - private IShanXiTownsService iShanXiTownsService; - - // 处理所有乡镇表 - @Override - public void handle(double lon, double lat, String eqQueueId) { - - // 查询距震中最近市州 - List cities = iShanXiCitiesService.getMostIntensityAreaCities(lon, lat); - // 查询距震中50km县区 - List counties50km = iShanXiCountyService.getMostIntensityAreaCounty(50, lon, lat); - // 查询距震中20km乡镇 - List towns20km = iShanXiTownsService.getMostIntensityAreaTowns(20, lon, lat); - // 所有行政区划数 - List combined = combine(cities, counties50km, towns20km, eqQueueId, lon, lat); - // 存库 - asyncSave(combined); - } - - // 将行政区划组合 - private List combine(List cities, - List counties20km, - List towns10km, - String eqQueueId, double lon, double lat) { - // 震中到行政区划距离 - List distancedtos = new ArrayList<>(); - - // 处理市州 - for (ShanXiCitiesDTO city : cities) { - EarthquakeDistanceDTO dzxx = new EarthquakeDistanceDTO(); - // 处理震中到市州的线段 - dzxx.setGeom(p2pLines(lon, lat, city.getX(), city.getY())); - - dzxx.setEqQueueId(eqQueueId); - dzxx.setDistanceId(1); - dzxx.setPId(""); - dzxx.setPname(city.getNAME()); - dzxx.setBgmc("市州"); - dzxx.setDistance(city.getDistance()); - - distancedtos.add(dzxx); - } - - // 处理县区 - for (ShanXiCountyDTO county : counties20km) { - EarthquakeDistanceDTO dzxx = new EarthquakeDistanceDTO(); - // 处理震中到县区的线段 - dzxx.setGeom(p2pLines(lon, lat, county.getX(), county.getY())); - - dzxx.setEqQueueId(eqQueueId); - dzxx.setDistanceId(2); - dzxx.setPId(""); - dzxx.setPname(county.getNAME()); - dzxx.setBgmc("县区"); - dzxx.setDistance(county.getDistance()); - - distancedtos.add(dzxx); - } - - // 处理乡镇 - for (ShanXiTownsDTO town : towns10km) { - EarthquakeDistanceDTO dzxx = new EarthquakeDistanceDTO(); - // 处理震中到乡镇的线段 - dzxx.setGeom(p2pLines(lon, lat, town.getX(), town.getY())); - - dzxx.setEqQueueId(eqQueueId); - dzxx.setDistanceId(3); - dzxx.setPId(""); - dzxx.setPname(town.getNAME()); - dzxx.setBgmc("乡镇"); - dzxx.setDistance(town.getDistance()); - - distancedtos.add(dzxx); - } - - // 各级别行政区划距离 - return distancedtos; - } - - // 将震中点与区划点进行组合 形成一条牵引线 - private Geometry p2pLines(double x1, double y1, double x2, double y2) { - // 边界值判断 - if (x1 < -180 || x1 > 180 || x2 < -180 || x2 > 180) { - throw new ParmaException(BaseConstants.POM_ERROR); - } - - if (y1 < -90 || y1 > 90 || y2 < -90 || y2 > 90) { - throw new ParmaException(BaseConstants.POM_ERROR); - } - - // 创建坐标点 - Coordinate startPoint = new Coordinate(x1, y1); - Coordinate endPoint = new Coordinate(x2, y2); - Coordinate[] coordinates = new Coordinate[]{startPoint, endPoint}; - // 牵引线 - LineString lineString = GEOMETRY_FACTORY.createLineString(coordinates); - - return lineString; - } - - @Async("xianPool") - protected void asyncSave(List data) { - // 批量存储 - List dzxxs = new ArrayList<>(); - //处理数据 - for (EarthquakeDistanceDTO datum : data) { - EarthquakeDistance dzxx = new EarthquakeDistance(); - BeanUtils.copyProperties(datum, dzxx); - dzxx.getGeom().setSRID(4490); - dzxxs.add(dzxx); - } - // 批量保存 - saveBatch(dzxxs); - log.info("震中到行政区划距离表已计算保存!"); - } -} diff --git a/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeInformationInfluenceServiceImpl.java b/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeInformationInfluenceServiceImpl.java deleted file mode 100644 index 3ca0384..0000000 --- a/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeInformationInfluenceServiceImpl.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.gis.xian.service.qgis.earthquake.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gis.xian.config.DataSource; -import com.gis.xian.constant.BaseConstants; -import com.gis.xian.dto.qgis.base.ActiveFaultDTO; -import com.gis.xian.dto.qgis.earthquake.EarthquakeInformationInfluenceDTO; -import com.gis.xian.dto.qgis.earthquake.EarthquakeAssessmentDTO; -import com.gis.xian.entity.qgis.earthquake.EarthquakeGisInfluence; -import com.gis.xian.utils.qgis.EarthquakeHandler; -import com.gis.xian.utils.qgis.EllipseToWktHandler; -import com.gis.xian.mapper.qgis.earthquake.EarthquakeGISInfluenceMapper; -import com.gis.xian.dto.qgis.earthquake.EarthquakeQuery; -import com.gis.xian.dto.qgis.earthquake.EarthquakeIntensityQuery; -import com.gis.xian.service.qgis.base.IActiveFaultService; -import com.gis.xian.service.qgis.earthquake.IEarthquakeInformationInfluenceService; -import com.gis.xian.service.ex.ParmaException; -import com.gis.xian.service.ex.ServiceException; -import com.gis.xian.service.qgis.earthquake.IEarthquakeInfluenceService; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.locationtech.jts.geom.Polygon; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author zzw - * @description: 地震影响场业务 - * @date 2026/5/26 上午10:13 - */ -@Slf4j -@Service -@DataSource("slave1") -public class EarthquakeInformationInfluenceServiceImpl extends ServiceImpl implements IEarthquakeInformationInfluenceService { - - - @Resource - private IActiveFaultService faultService; - @Resource - private IEarthquakeInfluenceService IEarthquakeInfluenceService; - - // 处理地震影响场数据 - @Override - public void handle(EarthquakeAssessmentDTO assess) { - // 异常处理 - if (assess == null) { - throw new ParmaException(BaseConstants.PARAMS_ERROR); - } - // 处理地震影响场数据 - try { - // 获取烈度值 - int[] intensities = gainIntensityLevels(assess.getEqMagnitude()); - // 根据烈度值和震级生成影响场 - for (int intensity : intensities) { - // 根据烈度和震级计算长轴 - double longUranium = EarthquakeHandler.calculateRa(assess.getEqMagnitude(), intensity); - // 根据烈度和震级计算短轴 - double shortUranium = EarthquakeHandler.calculateRb(assess.getEqMagnitude(), intensity); - // 根据长短轴计算面积 - double area = EarthquakeHandler.calculateArea(longUranium, shortUranium); - - // 获取断层走向 角度 - ActiveFaultDTO shortlyFault = faultService.getShortlyFault(assess.getLongitude(), assess.getLatitude()); - // 根据烈度长短轴、走向、面积计算生成影响场 - EarthquakeIntensityQuery query = compute(longUranium, shortUranium, shortlyFault, assess); - // 影响场范围 - Polygon polygon = EllipseToWktHandler.ellipseToPolygonWkt(query); - - // 转换存库 - convert(longUranium, shortUranium, area, intensity, polygon, shortlyFault, assess); - log.info("地震影响场已生成!"); - } - - } catch (Exception ex) { - log.error("处理影响场数据时出错:" + ex.getMessage()); - ex.printStackTrace(); - throw new ServiceException(BaseConstants.EQ_SERVER_ERROR); - } - - // 获取地震影响场数据 - List influences = findInfluenceById(new EarthquakeQuery(assess.getEvent(), assess.getEqQueueId())); - // 输出geojson文件 - IEarthquakeInfluenceService.handle(influences); - - } - - // 查询地震影响场 - @Override - public List findInfluenceById(EarthquakeQuery query) { - // 查询条件 - LambdaQueryWrapper lambdaQuery = Wrappers.lambdaQuery(EarthquakeGisInfluence.class); - lambdaQuery.eq(EarthquakeGisInfluence::getEvent, query.getEvent()); - lambdaQuery.eq(EarthquakeGisInfluence::getEqQueueId, query.getEqQueueId()); - - // 该场地震影响场 - List influences = this.baseMapper.selectList(lambdaQuery); - - if (influences == null || influences.size() == 0) { - log.error("查询地震影响场结果为空!"); - throw new ParmaException(BaseConstants.RESULT_ERROR); - } - // 处理 - List dzxxs = new ArrayList<>(); - for (EarthquakeGisInfluence influence : influences) { - EarthquakeInformationInfluenceDTO dzxx = new EarthquakeInformationInfluenceDTO(); - BeanUtils.copyProperties(influence, dzxx); - dzxxs.add(dzxx); - } - - return dzxxs; - } - - - // 获取最大烈度影响场 - @Override - public EarthquakeInformationInfluenceDTO findInfluenceMaxIntyById(EarthquakeQuery query) { - - LambdaQueryWrapper lambdaQuery = Wrappers.lambdaQuery(EarthquakeGisInfluence.class); - lambdaQuery - .eq(EarthquakeGisInfluence::getEvent, query.getEvent()) - .eq(EarthquakeGisInfluence::getEqQueueId, query.getEqQueueId()) - .orderByDesc(EarthquakeGisInfluence::getInty) - .last("limit 1"); // 最大烈度 - - // 获取单条数据 - EarthquakeGisInfluence influence = this.baseMapper.selectOne(lambdaQuery); - - if (influence == null) { - log.error("查询地震影响场结果为空!"); - throw new ParmaException(BaseConstants.RESULT_ERROR); - } - EarthquakeInformationInfluenceDTO dzxx = new EarthquakeInformationInfluenceDTO(); - BeanUtils.copyProperties(influence, dzxx); - - return dzxx; - } - - - // 根据震级获取对应的烈度值数组 - private int[] gainIntensityLevels(double magnitude) { - // 对震级进行四舍五入处理,取整数级别 - int magLevel = (int) Math.round(magnitude); - // 根据震级范围返回对应的烈度值数组 - if (magLevel >= 5.5 && magLevel < 7.0) { - return new int[]{6, 7, 8}; - } else if (magLevel >= 7.0 && magLevel < 8.0) { - return new int[]{6, 7, 8, 9}; - } else if (magLevel >= 8.0 && magLevel < 9.0) { - return new int[]{6, 7, 8, 9, 10}; - } else if (magLevel >= 9.0) { - // 9级及以上都返回9-12级烈度 - return new int[]{6, 7, 8, 9, 10, 11, 12}; - } else { - // 对于6级以下的震级,默认返回低烈度值 - return new int[]{6}; - } - } - - // 根据烈度长短轴、走向、面积计算生成影响场 - private EarthquakeIntensityQuery compute(double longUranium, double shortUranium, - ActiveFaultDTO shortlyFault, EarthquakeAssessmentDTO assess) { - - EarthquakeIntensityQuery query = new EarthquakeIntensityQuery(); - query.setCenterLon(assess.getLongitude()); - query.setCenterLat(assess.getLatitude()); - query.setSemiMajor(longUranium); - query.setSemiMinor(shortUranium); - query.setRotation(shortlyFault.getStrike()); - query.setNumVertices(BaseConstants.NUM_VERTICES); - - return query; - } - - // 转换存库 - private void convert(double longUranium, double shortUranium, double area, int intensity, - Polygon polygon, ActiveFaultDTO shortlyFault, EarthquakeAssessmentDTO assess) { - EarthquakeInformationInfluenceDTO dzxxDto = new EarthquakeInformationInfluenceDTO(); - dzxxDto.setArea(area); - dzxxDto.setGeom(polygon); - dzxxDto.setDirection(Double.valueOf(shortlyFault.getDirection())); - dzxxDto.setLongitude(assess.getLongitude()); - dzxxDto.setLatitude(assess.getLatitude()); - dzxxDto.setEqName(assess.getEqName()); - dzxxDto.setEqQueueId(assess.getEqQueueId()); - dzxxDto.setEvent(assess.getEvent()); - dzxxDto.setInty(intensity); - dzxxDto.setSInty(BaseConstants.SEISMIC_INTENSITY_MAPPING.get(intensity)); - dzxxDto.setLongUranium(longUranium); - dzxxDto.setShortUranium(shortUranium); - - // 存库 - EarthquakeGisInfluence earthquakeGisInfluence = new EarthquakeGisInfluence(); - BeanUtils.copyProperties(dzxxDto, earthquakeGisInfluence); - earthquakeGisInfluence.getGeom().setSRID(4490); - save(earthquakeGisInfluence); - log.info("地震影响场已保存!"); - } - -} diff --git a/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeProductServiceImpl.java b/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeProductServiceImpl.java deleted file mode 100644 index fb04311..0000000 --- a/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeProductServiceImpl.java +++ /dev/null @@ -1,280 +0,0 @@ -package com.gis.xian.service.qgis.earthquake.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gis.xian.config.DataSource; -import com.gis.xian.config.QgisProperties; -import com.gis.xian.constant.BaseConstants; -import com.gis.xian.dto.qgis.earthquake.EarthquakeProductDTO; -import com.gis.xian.dto.qgis.earthquake.EarthquakeAssessmentDTO; -import com.gis.xian.dto.qgis.rain.RainAssessmentDTO; -import com.gis.xian.entity.qgis.earthquake.EarthquakeProduct; -import com.gis.xian.enums.qgis.BaseEnums; -import com.gis.xian.enums.qgis.EarthquakeMapsEnums; -import com.gis.xian.enums.qgis.RainMapsEnums; -import com.gis.xian.dto.qgis.base.QgisArgsParams; -import com.gis.xian.service.qgis.earthquake.IEarthquakeProductService; -import com.gis.xian.utils.qgis.EarthquakeHandler; -import com.gis.xian.mapper.qgis.earthquake.EarthquakeProductMapper; -import com.gis.xian.dto.qgis.base.ProductQuery; -import com.gis.xian.service.ex.ParmaException; -import com.gis.xian.service.ex.ServeException; -import com.gis.xian.service.qgis.base.IFeignService; -import com.gis.xian.utils.BaseUtils; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -import java.security.SecureRandom; -import java.time.LocalDateTime; -import java.util.*; - -import org.springframework.util.StringUtils; - -/** - * @author zzw - * @description: 地震产品类 - * @date 2026/5/26 上午11:26 - */ -@Slf4j -@Service -@DataSource("slave1") -public class EarthquakeProductServiceImpl extends ServiceImpl implements IEarthquakeProductService { - - private static final SecureRandom secureRandom = new SecureRandom(); - - @Resource - private IFeignService iFeignService; - @Resource - private QgisProperties qgisProperties; - - // qgis 地震制图服务 - @Override - @Async("xianPool") - public void makeEarthquakeMaps(EarthquakeAssessmentDTO assess) { - // 待产专题图集 - List maps = Arrays.asList(EarthquakeMapsEnums.values()); - // 设置制图参数 - List args = setMakeEqMapsArgs(assess, maps); - // 调用出图服务 - iFeignService.invoke(args); - } - - @Override - @Async("xianPool") - public void makeRainstormMaps(RainAssessmentDTO assess) { - // 待产专题图集 - List maps = Arrays.asList(RainMapsEnums.values()); - // 设置制图参数 - List args = setMakeRainstormMapsArgs(assess, maps); - // 调用出图服务 - iFeignService.invoke(args); - } - - // 获取产品 - @Override - public List getProducts(ProductQuery query) { - try { - log.info("查询产品参数:{}", query); - // 空值 - if (query.getQueueId() == null || query.getQueueId().trim().isEmpty()) { - throw new ParmaException(BaseConstants.QUEUE_ID_ERROR); - } - // 构造条件 - LambdaQueryWrapper lambdaQuery = Wrappers.lambdaQuery(EarthquakeProduct.class); - // 必填项 - lambdaQuery.eq(EarthquakeProduct::getEqQueueId, query.getQueueId()); - // 选填项 - lambdaQuery.or().eq(StringUtils.hasText(query.getCode()), EarthquakeProduct::getCode, query.getCode()); - lambdaQuery.or().eq(StringUtils.hasText(query.getFileType()), EarthquakeProduct::getFileType, query.getFileType()); - lambdaQuery.or().like(StringUtils.hasText(query.getFileName()), EarthquakeProduct::getFileName, query.getFileName()); - lambdaQuery.or().eq(StringUtils.hasText(query.getProType()), EarthquakeProduct::getProType, query.getProType()); - // 获取产品服务 - List productList = this.baseMapper.selectList(lambdaQuery); - List dtos = new ArrayList<>(); - for (EarthquakeProduct product : productList) { - EarthquakeProductDTO dto = new EarthquakeProductDTO(); - BeanUtils.copyProperties(product, dto); - dto.setTempletId(null); - - dtos.add(dto); - } - return dtos; - } catch (Exception ex) { - log.error(ex.getMessage()); - throw new ServeException(BaseConstants.PRODUCTS_ERROR); - } - } - - // 地震 制图参数 - private List setMakeEqMapsArgs(EarthquakeAssessmentDTO assess, List maps) { - // 专题图集参数 - List args = new ArrayList<>(); - - // A4 画幅 - for (EarthquakeMapsEnums map : maps) { - // qgis参数 - QgisArgsParams arg = new QgisArgsParams(); - arg.setId(map.getNum()); - arg.setEvent(assess.getEvent()); - arg.setQueueId(assess.getEqQueueId()); - arg.setCenterX(assess.getLongitude()); - arg.setCenterY(assess.getLatitude()); - arg.setInfo(EarthquakeHandler.parseInfo(assess.getEqTime(), assess.getEqMagnitude(), assess.getEqAddr())); - arg.setMapTitle(EarthquakeHandler.combine(assess.getEqName(), assess.getEqType(), map)); - arg.setMapTime(BaseUtils.formatTime(LocalDateTime.now(), false)); - arg.setMapLayout(BaseConstants.MAP_LAYOUT_A4); // A4 - arg.setMapUint(BaseConstants.MAP_UNIT); // 单位 - // 死信队列中获取单张图片 - arg.setName(map.getName()); - arg.setOutFile(EarthquakeHandler.getPath(assess.getEvent(), assess.getEqQueueId(), BaseConstants.MAP_LAYOUT_A4, map, qgisProperties)); - arg.setPath(qgisProperties.getEqMapsTemplatePath() + map.getName() + ".qgz"); - arg.setDisaster(BaseConstants.EQ_DISASTER_MAP); // 地震灾害 - - // 缩放规则 - Map changed = change(assess, "A4", map.getName()); - arg.setZoomRule(changed.get("k")); // 默认不缩放 - arg.setZoomValue(changed.get("v")); // 默认缩放值 - - args.add(arg); - } - - // 增加 A3 画幅 - for (EarthquakeMapsEnums map : maps) { - // qgis参数 - QgisArgsParams arg = new QgisArgsParams(); - arg.setId(map.getNum()); - arg.setEvent(assess.getEvent()); - arg.setQueueId(assess.getEqQueueId()); - arg.setCenterX(assess.getLongitude()); - arg.setCenterY(assess.getLatitude()); - arg.setInfo(EarthquakeHandler.parseInfo(assess.getEqTime(), assess.getEqMagnitude(), assess.getEqAddr())); - arg.setMapTitle(EarthquakeHandler.combine(assess.getEqName(), assess.getEqType(), map)); - arg.setMapTime(BaseUtils.formatTime(LocalDateTime.now(), false)); - arg.setMapLayout(BaseConstants.MAP_LAYOUT_A3); // A3 - arg.setMapUint(BaseConstants.MAP_UNIT); // 单位 - // 死信队列中获取单张图片 - arg.setName(map.getName()); - arg.setOutFile(EarthquakeHandler.getPath(assess.getEvent(), assess.getEqQueueId(), BaseConstants.MAP_LAYOUT_A3, map, qgisProperties)); - arg.setPath(qgisProperties.getEqMapsTemplatePath() + map.getName() + ".qgz"); - arg.setDisaster(BaseConstants.EQ_DISASTER_MAP); // 地震灾害 - - // 缩放规则 - Map changed = change(assess, "A3", map.getName()); - arg.setZoomRule(changed.get("k")); // 默认不缩放 - arg.setZoomValue(changed.get("v")); // 默认缩放值 - - args.add(arg); - } - log.info("制图参数设置完成!"); - - return args; - } - - // 暴雨 制图参数 - private List setMakeRainstormMapsArgs(RainAssessmentDTO assess, List maps) { - // 专题图集参数 - List args = new ArrayList<>(); - - // A4 画幅 - for (RainMapsEnums map : maps) { - // qgis参数 - QgisArgsParams arg = new QgisArgsParams(); - arg.setId(map.getNum()); - arg.setEvent(assess.getRainId()); - arg.setQueueId(assess.getRainQueueId()); - arg.setCenterX(assess.getLongitude()); - arg.setCenterY(assess.getLatitude()); - arg.setInfo(EarthquakeHandler.parseRInfo(assess.getOccurrenceTime(), assess.getRainfall(), assess.getDuration())); - arg.setMapTitle(EarthquakeHandler.combineR(assess.getPosition(), assess.getRainType(), map)); - arg.setMapTime(BaseUtils.formatTime(LocalDateTime.now(), false)); - arg.setMapLayout(BaseConstants.MAP_LAYOUT_A3); // A4 - arg.setMapUint(BaseConstants.MAP_UNIT); // 单位 - // 死信队列中获取单张图片 - arg.setName(map.getName()); - arg.setOutFile(EarthquakeHandler.getRPath(assess.getRainId(), assess.getRainQueueId(), BaseConstants.MAP_LAYOUT_A4, map, qgisProperties)); - arg.setPath(qgisProperties.getRainMapsTemplatePath() + map.getName() + ".qgz"); - arg.setDisaster(BaseConstants.RAIN_DISASTER_MAP); // 暴雨灾害 - // 按规则缩放 - arg.setZoomRule(BaseEnums.NO.getCode().toString()); // 默认不缩放 - arg.setZoomValue(""); // 默认缩放值 - - args.add(arg); - } - - // 增加 A3 画幅 - for (RainMapsEnums map : maps) { - // qgis参数 - QgisArgsParams arg = new QgisArgsParams(); - arg.setId(map.getNum()); - arg.setEvent(assess.getRainId()); - arg.setQueueId(assess.getRainQueueId()); - arg.setCenterX(assess.getLongitude()); - arg.setCenterY(assess.getLatitude()); - arg.setInfo(EarthquakeHandler.parseRInfo(assess.getOccurrenceTime(), assess.getRainfall(), assess.getDuration())); - arg.setMapTitle(EarthquakeHandler.combineR(assess.getPosition(), assess.getRainType(), map)); - arg.setMapTime(BaseUtils.formatTime(LocalDateTime.now(), false)); - arg.setMapLayout(BaseConstants.MAP_LAYOUT_A4); // A4 - arg.setMapUint(BaseConstants.MAP_UNIT); // 单位 - // 死信队列中获取单张图片 - arg.setName(map.getName()); - arg.setOutFile(EarthquakeHandler.getRPath(assess.getRainId(), assess.getRainQueueId(), BaseConstants.MAP_LAYOUT_A3, map, qgisProperties)); - arg.setPath(qgisProperties.getRainMapsTemplatePath() + map.getName() + ".qgz"); - arg.setDisaster(BaseConstants.RAIN_DISASTER_MAP); // 暴雨灾害 - arg.setZoomRule(BaseEnums.NO.getCode().toString()); // 默认不缩放 - arg.setZoomValue(""); // 默认缩放值 - - args.add(arg); - } - - log.info("制图参数设置完成!"); - - return args; - } - - - /** - * 专题图缩放变化: - * A3: - * 4级地震:不放缩 - * 5-6级地震:所有A3都放缩到intensity - * 6级以上,除了影响场intensity,其他不变 - *

- * A4: - * 所有都不变 - */ - public Map change(EarthquakeAssessmentDTO assess, String size, String name) { - Map map = new HashMap<>(); - - if (size.equals("A3")) { - if (assess.getEqMagnitude() >= 4 && assess.getEqMagnitude() < 5) { - map.put("k", BaseEnums.NO.getCode().toString()); - map.put("v", ""); - return map; - } - if (assess.getEqMagnitude() >= 5 && assess.getEqMagnitude() < 6) { - map.put("k", BaseEnums.M_LAYER2.getCode().toString()); - map.put("v", "intensity"); - return map; - } - if (assess.getEqMagnitude() >= 6) { - if (name.equals("地震影响估计范围分布图")) { - map.put("k", BaseEnums.M_LAYER2.getCode().toString()); - map.put("v", "intensity"); - return map; - } else { - map.put("k", BaseEnums.NO.getCode().toString()); - map.put("v", ""); - return map; - } - } - } - map.put("k", BaseEnums.NO.getCode().toString()); - map.put("v", ""); - return map; - } - -} diff --git a/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeQueueServiceImpl.java b/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeQueueServiceImpl.java index 0364ec3..b35b355 100644 --- a/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeQueueServiceImpl.java +++ b/src/main/java/com/gis/xian/service/qgis/earthquake/impl/EarthquakeQueueServiceImpl.java @@ -1,190 +1,36 @@ package com.gis.xian.service.qgis.earthquake.impl; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gis.xian.config.DataSource; -import com.gis.xian.constant.BaseConstants; -import com.gis.xian.dto.qgis.earthquake.EarthquakeAssessmentDTO; -import com.gis.xian.dto.qgis.rain.RainAssessmentDTO; +import com.gis.xian.dto.qgis.base.QgisTriggerDTO; import com.gis.xian.entity.qgis.earthquake.EarthquakeQueue; -import com.gis.xian.enums.qgis.BaseEnums; import com.gis.xian.mapper.qgis.earthquake.EarthquakeQueueMapper; -import com.gis.xian.service.qgis.earthquake.IEarthquakeInformationDistanceService; -import com.gis.xian.service.qgis.earthquake.IEarthquakeInformationInfluenceService; -import com.gis.xian.service.ex.ParmaException; -import com.gis.xian.service.ex.ServeException; -import com.gis.xian.service.qgis.earthquake.IEarthquakeProductService; +import com.gis.xian.service.qgis.base.IFeignService; import com.gis.xian.service.qgis.earthquake.IEarthquakeQueueService; -import com.gis.xian.utils.BaseUtils; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; /** - * @author zzw - * @description: 地震评估业务 - * @date 2026/5/25 下午6:09 + * 地震评估队列服务 + * 简化为只负责触发 Python 端生成专题图 */ @Slf4j @Service @DataSource("slave1") -public class EarthquakeQueueServiceImpl extends ServiceImpl implements IEarthquakeQueueService { +public class EarthquakeQueueServiceImpl extends ServiceImpl + implements IEarthquakeQueueService { @Resource - private IEarthquakeInformationDistanceService IEarthquakeInformationDistanceService; - @Resource - private IEarthquakeInformationInfluenceService IEarthquakeInformationInfluenceService; - @Resource - private IEarthquakeProductService IEarthquakeProductService; + private IFeignService feignService; - // 地震评估 - @Transactional @Override - public void assess(EarthquakeAssessmentDTO assess) { - log.info("开始评估,评估参数:{}", assess); - // 异常值 - if (assess == null) { - throw new ParmaException(BaseConstants.PARAMS_ERROR); - } - // 评估业务 - try { - // 初始化评估 - initial(assess, BaseConstants.MANUAL); - // 地震影响场评估 5s - IEarthquakeInformationInfluenceService.handle(assess); - updated(assess.getEvent(), assess.getEqQueueId(), BaseUtils.compute(1, 0), BaseEnums.CALCULATING.getCode()); - // 震中距评估 - IEarthquakeInformationDistanceService.handle(assess.getLongitude(), assess.getLatitude(), assess.getEqQueueId()); - // 专题图产出 - IEarthquakeProductService.makeEarthquakeMaps(assess); - } catch (Exception ex) { - log.error(ex.getMessage()); - throw new ServeException(BaseConstants.ASSESS_SERVER_ERROR); - } + public void trigger(String simulationId, String type) { + log.info("触发专题图生成: simulationId={}, type={}", simulationId, type); + QgisTriggerDTO triggerDTO = new QgisTriggerDTO(); + triggerDTO.setSimulationId(simulationId); + triggerDTO.setType(type); + feignService.trigger(triggerDTO); + log.info("专题图触发完成: simulationId={}", simulationId); } - - @Transactional - @Override - public void assess(RainAssessmentDTO assess) { - log.info("开始评估,评估参数:{}", assess); - // 异常值 - if (assess == null) { - throw new ParmaException(BaseConstants.PARAMS_ERROR); - } - // 评估业务 - try { - // 初始化评估 - initial(assess, BaseConstants.MANUAL); - // 专题图产出 - IEarthquakeProductService.makeRainstormMaps(assess); - } catch (Exception ex) { - log.error(ex.getMessage()); - throw new ServeException(BaseConstants.ASSESS_SERVER_ERROR); - } - } - - // 地震初始化评估进度和评估状态 - private void initial(EarthquakeAssessmentDTO assess, int type) { - - EarthquakeQueue dzqueue = new EarthquakeQueue(); - BeanUtils.copyProperties(assess, dzqueue); - dzqueue.setId(assess.getEqQueueId()); - dzqueue.setBatch(1); - dzqueue.setType(type); // 手动 - dzqueue.setState(BaseEnums.NOT_STARTED.getCode()); - dzqueue.setMode(1); // 0 地震参数 1 影响场 - dzqueue.setBeginTime(LocalDateTime.now()); - dzqueue.setProgress(0.0); // 评估进度 - dzqueue.setRemark(BaseEnums.NOT_STARTED.getDesc()); - - save(dzqueue); - log.info("地震评估业务初始化完成!"); - } - - // 暴雨初始化评估进度和评估状态 - private void initial(RainAssessmentDTO assess, int type) { - - EarthquakeQueue dzqueue = new EarthquakeQueue(); - BeanUtils.copyProperties(assess, dzqueue); - dzqueue.setId(assess.getRainQueueId()); - dzqueue.setBatch(1); - dzqueue.setType(type); // 手动 - dzqueue.setState(BaseEnums.NOT_STARTED.getCode()); - dzqueue.setMode(null); // 0 地震参数 1 影响场 - dzqueue.setBeginTime(LocalDateTime.now()); - dzqueue.setProgress(0.0); // 评估进度 - dzqueue.setRemark(BaseEnums.NOT_STARTED.getDesc()); - - save(dzqueue); - log.info("暴雨评估业务初始化完成!"); - } - - - // 更新评估进度和评估状态 - public void updated(String event, String queueId, double progress, int state) { - - EarthquakeQueue dzqueue = new EarthquakeQueue(); - // 条件 - LambdaQueryWrapper lambdaQuery = Wrappers.lambdaQuery(EarthquakeQueue.class) - .eq(EarthquakeQueue::getEvent, event) - .eq(EarthquakeQueue::getId, queueId); - - // 评估异常终止 - if (state == BaseEnums.TIMEOUT_OR_EXCEPTION.getCode()) { - dzqueue.setState(BaseEnums.TIMEOUT_OR_EXCEPTION.getCode()); - dzqueue.setEndTime(LocalDateTime.now()); - dzqueue.setProgress(progress); // 评估进度 - dzqueue.setRemark(BaseEnums.TIMEOUT_OR_EXCEPTION.getDesc()); - // 更新状态 - update(dzqueue, lambdaQuery); - log.info("评估异常结束!"); - return; - } - // 人工停止 - if (state == BaseEnums.MANUAL_STOPPED.getCode()) { - dzqueue.setState(BaseEnums.MANUAL_STOPPED.getCode()); - dzqueue.setEndTime(LocalDateTime.now()); - dzqueue.setProgress(progress); // 评估进度 - dzqueue.setRemark(BaseEnums.MANUAL_STOPPED.getDesc()); - // 更新状态 - update(dzqueue, lambdaQuery); - log.info("评估人工停止!"); - return; - } - // 不计算 - if (state == BaseEnums.NOT_CALCULATE.getCode()) { - dzqueue.setState(BaseEnums.NOT_CALCULATE.getCode()); - dzqueue.setEndTime(LocalDateTime.now()); - dzqueue.setProgress(progress); // 评估进度 - dzqueue.setRemark(BaseEnums.NOT_CALCULATE.getDesc()); - // 更新状态 - update(dzqueue, lambdaQuery); - log.info("本次事件不参与评估计算!"); - return; - } - // 正常继续评估 - if (state == BaseEnums.CALCULATING.getCode()) { - if (progress < 100) { - dzqueue.setProgress(progress); - // 更新进度 - update(dzqueue, lambdaQuery); - log.info("评估业务进度:{}%", progress); - return; - } - // 评估完成 - dzqueue.setState(BaseEnums.NORMAL_COMPLETED.getCode()); - dzqueue.setEndTime(LocalDateTime.now()); - dzqueue.setProgress(progress); // 评估进度 - dzqueue.setRemark(BaseEnums.NORMAL_COMPLETED.getDesc()); - update(dzqueue, lambdaQuery); - log.info("评估工作结束!"); - } - - } - } diff --git a/src/main/java/com/gis/xian/service/qgis/rain/impl/RainEventServiceImpl.java b/src/main/java/com/gis/xian/service/qgis/rain/impl/RainEventServiceImpl.java index a7d3fdb..56d5959 100644 --- a/src/main/java/com/gis/xian/service/qgis/rain/impl/RainEventServiceImpl.java +++ b/src/main/java/com/gis/xian/service/qgis/rain/impl/RainEventServiceImpl.java @@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gis.xian.config.DataSource; import com.gis.xian.constant.BaseConstants; -import com.gis.xian.dto.qgis.rain.RainAssessmentDTO; import com.gis.xian.dto.qgis.rain.RainEventDTO; import com.gis.xian.dto.qgis.rain.RainTriggerDTO; import com.gis.xian.entity.qgis.rain.RainEvent; @@ -27,31 +26,27 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** - * @author zzw - * @description: REventServiceImpl - * @date 2026/6/8 下午4:45 + * 暴雨事件服务 */ @Slf4j @Service @DataSource("slave1") public class RainEventServiceImpl extends ServiceImpl implements IREventService { - @Resource - private IEarthquakeQueueService IEarthquakeQueueService; - // 暴雨触发 + @Resource + private IEarthquakeQueueService queueService; + @Transactional @Override public RainQuery trigger(RainTriggerDTO trigger) { log.info("暴雨参数:{}", trigger); - // 异常值 if (trigger == null) { throw new ParmaException(BaseConstants.PARAMS_ERROR); } - // 专题图命名代码 + String code = BaseUtils.generationRainCode(trigger.getOccurrenceTime()); - // 暴雨业务 + try { - // 暴雨信息存储 RainEventDTO eventdto = new RainEventDTO(); BeanUtils.copyProperties(trigger, eventdto); eventdto.setRainId(code); @@ -59,70 +54,42 @@ public class RainEventServiceImpl extends ServiceImpl lambdaQuery = Wrappers.lambdaQuery(RainEvent.class); lambdaQuery.eq(RainEvent::getId, Id); - int flag = this.baseMapper.delete(lambdaQuery); - return flag > 0 ? true : false; + return this.baseMapper.delete(lambdaQuery) > 0; } - - // 处理暴雨数据 private void handle(RainEventDTO eventdto) { - // 抛出异常 if (eventdto == null) { throw new ParmaException(BaseConstants.PARAMS_ERROR); } - try { RainEvent revent = new RainEvent(); BeanUtils.copyProperties(eventdto, revent); - // 处理空间数据 GeometryFactory geometryFactory = new GeometryFactory(); Point point = geometryFactory.createPoint(new Coordinate( eventdto.getLongitude(), eventdto.getLatitude() )); revent.setGeom(point); revent.getGeom().setSRID(4490); - // 存库 save(revent); - log.info("暴雨位基本信息已存库..."); + log.info("暴雨基本信息已存库..."); } catch (Exception ex) { log.error("暴雨触发:暴雨基本信息保存失败!", ex.getMessage()); - ex.printStackTrace(); throw new ServiceException(BaseConstants.RAIN_SERVER_ERROR); } - - } - } diff --git a/src/main/java/com/gis/xian/utils/qgis/EarthquakeHandler.java b/src/main/java/com/gis/xian/utils/qgis/EarthquakeHandler.java deleted file mode 100644 index 83b326c..0000000 --- a/src/main/java/com/gis/xian/utils/qgis/EarthquakeHandler.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.gis.xian.utils.qgis; - -import com.gis.xian.config.QgisProperties; -import com.gis.xian.constant.BaseConstants; -import com.gis.xian.enums.qgis.EarthquakeMapsEnums; -import com.gis.xian.enums.qgis.RainMapsEnums; -import com.gis.xian.utils.BaseUtils; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; - -/** - * @author zzw - * @description: 地震烈度核心服务 - * @date 2026/5/26 上午10:47 - */ -public class EarthquakeHandler { - - /** - * 获取不同烈度下的面积 - * - * @param a 长轴 - * @param b 短轴 - * @return 返回椭圆的面积 - */ - public static double calculateArea(double a, double b) { - return Math.PI * a * b; - } - - /** - * @param M 震级 - * @param Ia 烈度 - * @author: xiaodemos - * @date: 2025/3/25 10:57 - * @description: 计算椭圆的长轴 - * @return: 返回长轴 - */ - public static double calculateRa(double M, double Ia) { - return (Math.pow(10, (4.0293 + 1.3003 * M - Ia) / 3.6404) - 10) * 1000; - } - - /** - * @param M 震级 - * @param Ib 烈度 - * @author: xiaodemos - * @date: 2025/3/25 10:58 - * @description: 计算椭圆的短轴 - * @return: 返回短轴 - */ - public static double calculateRb(double M, double Ib) { - return (Math.pow(10, (2.3816 + 1.3003 * M - Ib) / 2.8573) - 5) * 1000; - } - - - // 格式化地震三要素信息 - public static String parseInfo(LocalDateTime eqTime, double magnitude, String addr) { - String time = BaseUtils.formatTime(eqTime, true); - return String.format("时间:%s\r\n震级:%s级\r\n位置:%s", time, magnitude, addr); - } - - // 格式化暴雨三要素信息 - public static String parseRInfo(LocalDateTime eqTime, String magnitude, String addr) { - String time = BaseUtils.formatTime(eqTime, true); - return String.format("时间:%s\r\n累计降雨量:%s毫米\r\n已持续:%s小时", time, magnitude, addr); - } - - // 拼接地震图件标题 - public static String combine(String eqName, String eqType, EarthquakeMapsEnums map) { - // 地点 + 震级 - String name = eqName; - // 图名称 + 地震类型 - String mapName = map.getName() + BaseConstants.EQ_TYPE.get(eqType); - return String.format("%s", name + mapName); - } - - // 拼接暴雨图件标题 - public static String combineR(String rainName, String rainType, RainMapsEnums map) { - // 地点 + 暴雨名称 - String name = rainName; - // 图名称 + 暴雨类型 - String mapName = map.getName() + BaseConstants.RAIN_TYPE.get(rainType); - return String.format("%s", name + mapName); - } - - // 拼接导出路径 - - // 拼接导出路径 - public static String getPath(String event, String queueId, String size, EarthquakeMapsEnums map, QgisProperties qgisProperties) { - // 地震事件 + 批次 - String batch = queueId.substring(event.length()); - String path = event + "/" + batch + "/" + size + "/" + map.getName(); - return String.format("%s", qgisProperties.getBasePath() + qgisProperties.getEqMapsOutputPath() + path + ".jpg"); - } - - // 拼接导出路径 - public static String getRPath(String rainId, String queueId, String size, RainMapsEnums map, QgisProperties qgisProperties) { - // 地震事件 + 批次 - String batch = queueId.substring(rainId.length()); - String path = rainId + "/" + batch + "/" + size + "/" + map.getName(); - return String.format("%s", qgisProperties.getBasePath() + qgisProperties.getRainMapsOutputPath() + path + ".jpg"); - } - - public static String format(LocalDateTime time) { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM月dd日HH时mm分"); - String timestamp = time.format(formatter); - return timestamp; - } - - public static String formatTime(LocalDateTime time) { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日HH时mm分"); - String timestamp = time.format(formatter); - return timestamp; - } -} diff --git a/src/main/java/com/gis/xian/utils/qgis/EllipseToWktHandler.java b/src/main/java/com/gis/xian/utils/qgis/EllipseToWktHandler.java deleted file mode 100644 index 0f4bef0..0000000 --- a/src/main/java/com/gis/xian/utils/qgis/EllipseToWktHandler.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.gis.xian.utils.qgis; - -import com.gis.xian.dto.qgis.earthquake.EarthquakeIntensityQuery; -import org.locationtech.jts.geom.Geometry; -import org.locationtech.jts.geom.GeometryFactory; -import org.locationtech.jts.geom.Polygon; -import org.locationtech.jts.io.WKTReader; -import org.locationtech.proj4j.*; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.ArrayList; -import java.util.List; - -/** - * @author zzw - * @description: 椭圆烈度衰减圈转换为WKT格式 - * @date 2026/5/26 上午10:25 - */ -public class EllipseToWktHandler { - // 投影转换工厂 - private static final CRSFactory crsFactory = new CRSFactory(); - private static final CoordinateTransformFactory ctFactory = new CoordinateTransformFactory(); - private static final GeometryFactory geometryFactory = new GeometryFactory(); - - /** - * 将椭圆参数转换为 POLYGON 格式的 WKT 字符串 - * @param query 椭圆烈度参数 - * @return POLYGON格式的WKT字符串 - */ - public static Polygon ellipseToPolygonWkt(EarthquakeIntensityQuery query) { - try { - // 确定UTM投影带并创建转换器 - int utmZone = (int) Math.floor((query.getCenterLon() + 180) / 6) + 1; - String epsgCode = query.getCenterLat() >= 0 ? "EPSG:326" + utmZone : "EPSG:327" + utmZone; - - // 创建坐标参考系(WGS84 -> UTM) - CoordinateReferenceSystem wgs84 = crsFactory.createFromName("EPSG:4326"); - CoordinateReferenceSystem utm = crsFactory.createFromName(epsgCode); - - // 创建转换器 - CoordinateTransform toUtmTransform = ctFactory.createTransform(wgs84, utm); - CoordinateTransform toWgs84Transform = ctFactory.createTransform(utm, wgs84); - - // 将中心点经纬度转换为UTM坐标 - ProjCoordinate centerWgs84 = new ProjCoordinate(query.getCenterLon(), query.getCenterLat()); - ProjCoordinate centerUtm = new ProjCoordinate(); - toUtmTransform.transform(centerWgs84, centerUtm); - double centerX = centerUtm.x; - double centerY = centerUtm.y; - - // 生成椭圆的平面顶点(极坐标方式) - double rotationRad = Math.toRadians(query.getRotation()); - List verticesUtm = new ArrayList<>(); - - // 生成0到2π的角度序列 - double angleStep = 2 * Math.PI / query.getNumVertices(); - for (int i = 0; i < query.getNumVertices(); i++) { - double theta = i * angleStep; - // 椭圆极坐标方程 - double xEllipse = query.getSemiMajor() * Math.cos(theta); - double yEllipse = query.getSemiMinor() * Math.sin(theta); - // 旋转矩阵计算 - double xRot = xEllipse * Math.cos(rotationRad) - yEllipse * Math.sin(rotationRad); - double yRot = xEllipse * Math.sin(rotationRad) + yEllipse * Math.cos(rotationRad); - // 加上中心点坐标 - double xFinal = centerX + xRot; - double yFinal = centerY + yRot; - - verticesUtm.add(new ProjCoordinate(xFinal, yFinal)); - } - - // 将UTM顶点转换回经纬度 - List verticesWgs84 = new ArrayList<>(); - for (ProjCoordinate utmCoord : verticesUtm) { - ProjCoordinate wgs84Coord = new ProjCoordinate(); - toWgs84Transform.transform(utmCoord, wgs84Coord); - verticesWgs84.add(wgs84Coord); - } - - // 拼接WKT字符串(保留6位小数,闭合多边形) - StringBuilder verticesStr = new StringBuilder(); - for (ProjCoordinate coord : verticesWgs84) { - verticesStr.append(roundTo6Decimals(coord.x)) - .append(" ") - .append(roundTo6Decimals(coord.y)) - .append(", "); - } - - // 添加第一个点闭合多边形 - ProjCoordinate firstCoord = verticesWgs84.get(0); - verticesStr.append(roundTo6Decimals(firstCoord.x)) - .append(" ") - .append(roundTo6Decimals(firstCoord.y)); - // 构建最终WKT字符串 - String POLYGON = String.format("POLYGON ((%s)) | 4490", verticesStr); - // 返回Polygon类型 - Polygon polygon = buildPolygonFromWKTString(POLYGON); - - return polygon; - } catch (Exception e) { - throw new RuntimeException("生成烈度多边形失败", e); - } - } - - /** - * 解析WKT获取经纬度范围 - */ - public static void printLatLonRange(String wkt) { - // 提取顶点坐标 - String coordsPart = wkt.replace("POLYGON ((", "").replace("))", ""); - String[] coordStrs = coordsPart.split(", "); - - double minLon = Double.MAX_VALUE; - double maxLon = Double.MIN_VALUE; - double minLat = Double.MAX_VALUE; - double maxLat = Double.MIN_VALUE; - - for (String coordStr : coordStrs) { - String[] lonLat = coordStr.split(" "); - double lon = Double.parseDouble(lonLat[0]); - double lat = Double.parseDouble(lonLat[1]); - - minLon = Math.min(minLon, lon); - maxLon = Math.max(maxLon, lon); - minLat = Math.min(minLat, lat); - maxLat = Math.max(maxLat, lat); - } - - System.out.println("\n椭圆的经纬度范围:"); - System.out.printf("经度范围:%.6f ~ %.6f%n", minLon, maxLon); - System.out.printf("纬度范围:%.6f ~ %.6f%n", minLat, maxLat); - } - - /** - * 保留6位小数 - */ - private static double roundTo6Decimals(double value) { - return new BigDecimal(value).setScale(6, RoundingMode.HALF_UP).doubleValue(); - } - - // 构建 Polygon 对象 - public static Polygon buildPolygonFromWKTString(String wktPolygon) { - try { - // WKT解析器 - WKTReader wktReader = new WKTReader(geometryFactory); - // 解析 POLYGON 字符串 - Geometry geometry = wktReader.read(wktPolygon); - return (Polygon) geometry; - } catch (Exception e) { - throw new RuntimeException("解析 POLYGON 字符串失败", e); - } - } - - -} diff --git a/src/main/java/com/gis/xian/utils/qgis/GeoDistanceHandler.java b/src/main/java/com/gis/xian/utils/qgis/GeoDistanceHandler.java deleted file mode 100644 index 2a41a26..0000000 --- a/src/main/java/com/gis/xian/utils/qgis/GeoDistanceHandler.java +++ /dev/null @@ -1,219 +0,0 @@ -package com.gis.xian.utils.qgis; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.Assert; - -/** - * @author zzw - * @description: 地理距离计算工具类 - * @date 2026/5/26 上午9:41 - */ -@Slf4j -public class GeoDistanceHandler { - - /** - *地球平均半径(千米) - */ - private static final double EARTH_RADIUS = 6371.0; - /** - * 计算两个经纬度点之间的球面距离(单位:千米) - * @param lon1 点1经度 - * @param lat1 点1纬度 - * @param lon2 点2经度 - * @param lat2 点2纬度 - * @return 两点之间的距离(千米) - */ - public static double calculateHaversineDistance(double lon1, double lat1, double lon2, double lat2) { - // 参数校验(经纬度合理范围) - Assert.isTrue(lon1 >= -180 && lon1 <= 180 && lat1 >= -90 && lat1 <= 90, "点1经纬度格式非法"); - Assert.isTrue(lon2 >= -180 && lon2 <= 180 && lat2 >= -90 && lat2 <= 90, "点2经纬度格式非法"); - - // 转换为弧度(Math类三角函数默认使用弧度) - double radLat1 = Math.toRadians(lat1); - double radLon1 = Math.toRadians(lon1); - double radLat2 = Math.toRadians(lat2); - double radLon2 = Math.toRadians(lon2); - - // 计算纬度差、经度差 - double deltaLat = radLat1 - radLat2; - double deltaLon = radLon1 - radLon2; - - // Haversine公式核心计算 - double a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) - + Math.cos(radLat1) * Math.cos(radLat2) - * Math.sin(deltaLon / 2) * Math.sin(deltaLon / 2); - double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - - // 返回距离(千米) - return EARTH_RADIUS * c; - } - - /** - * 计算震中点到断层的最短球面距离(单位:千米) - * @param lon 震中经度 - * @param lat 震中纬度 - * @param lonA 线段端点A经度 - * @param latA 线段端点A纬度 - * @param lonB 线段端点B经度 - * @param latB 线段端点B纬度 - * @return 震中到线段的最短距离(千米) - */ - public static double calculateDistanceFromPointToLineString(double lon, double lat, double lonA, double latA, double lonB, double latB) { - // 将经纬度转换为平面直角坐标系近似值 - double x = lon; - double y = lat; - double xA = lonA; - double yA = latA; - double xB = lonB; - double yB = latB; - - // 计算向量AB和向量AP - double vectorABx = xB - xA; - double vectorABy = yB - yA; - double vectorAPx = x - xA; - double vectorAPy = y - yA; - - // 计算点P在AB线段上的投影参数t(判断垂足是否在线段内) - // t = (AP · AB) / |AB|² - double dotProduct = vectorAPx * vectorABx + vectorAPy * vectorABy; // 点积 - double abLengthSquared = vectorABx * vectorABx + vectorABy * vectorABy; // AB长度的平方 - - // 线段AB是一个点(A和B坐标重合),直接返回点到点的距离 - if (abLengthSquared < 1e-10) { - return calculateHaversineDistance(lon, lat, lonA, latA); - } - - // 确定垂足位置 - double t = Math.max(0, Math.min(1, dotProduct / abLengthSquared)); // t限制在[0,1]之间(线段范围内) - - // 计算垂足点C的坐标(平面坐标) - double xC = xA + t * vectorABx; - double yC = yA + t * vectorABy; - - // 计算震中点到垂足点C的球面距离(最终最短距离) - return calculateHaversineDistance(lon, lat, xC, yC); - } - - /** - * 解析LINESTRING格式字符串,提取所有端点坐标 - * @param wktLineString LINESTRING格式的WKT字符串 - * @return 端点坐标二维数组([经度, 纬度]) - */ - public static double[][] parseLineStringCoordinates(String wktLineString) { - // 先判空并去除首尾多余空格 - if (wktLineString == null || wktLineString.trim().isEmpty()) { - throw new IllegalArgumentException("WKT字符串不能为空或空白"); - } - String cleanWkt = wktLineString.trim(); - - // 截取括号内的坐标字符串 - int startIndex = cleanWkt.indexOf("(") + 1; // 找到第一个左括号,取其后一位 - int endIndex = cleanWkt.lastIndexOf(")"); // 找到最后一个右括号 - String coordStr = cleanWkt.substring(startIndex, endIndex).trim(); - - // 括号内无坐标数据 - if (coordStr.isEmpty()) { - throw new IllegalArgumentException("LINESTRING内无有效坐标数据"); - } - - // 按逗号分割多个坐标点 - String[] pointStrArray = coordStr.split(","); - double[][] coordinates = new double[pointStrArray.length][2]; - - // 解析每个坐标点(经度 纬度) - for (int i = 0; i < pointStrArray.length; i++) { - String pointStr = pointStrArray[i].trim(); - // 容错:单个坐标点为空 - if (pointStr.isEmpty()) { - throw new IllegalArgumentException("LINESTRING内存在空坐标点,索引:" + i); - } - - String[] lonLat = pointStr.split("\\s+"); - if (lonLat.length != 2) { - throw new IllegalArgumentException("LINESTRING内坐标格式无效:" + pointStr); - } - - try { - double lon = Double.parseDouble(lonLat[0]); - double lat = Double.parseDouble(lonLat[1]); - coordinates[i][0] = lon; // 经度 - coordinates[i][1] = lat; // 纬度 - } catch (NumberFormatException e) { - throw new IllegalArgumentException("LINESTRING内坐标无法转换为数字:" + pointStr, e); - } - } - - return coordinates; - } - - /** - * 解析POINT格式WKT字符串,提取经纬度坐标 - * @param wktPoint POINT格式的WKT字符串 - * @return 坐标数组 [经度, 纬度] - */ - public static double[] parsePointCoordinates(String wktPoint) { - // 判空和去除首尾空格 - if (wktPoint == null || wktPoint.trim().isEmpty()) { - throw new IllegalArgumentException("POINT类型WKT字符串不能为空或空白"); - } - String cleanWkt = wktPoint.trim(); - - // 校验POINT格式前缀和后缀 - boolean isValidPrefix = cleanWkt.startsWith("POINT(") || cleanWkt.startsWith("POINT ("); - boolean isValidSuffix = cleanWkt.endsWith(")"); - if (!isValidPrefix || !isValidSuffix) { - throw new IllegalArgumentException("无效的POINT格式WKT字符串:" + wktPoint); - } - - // 截取括号内的坐标字符串 - int startIndex = cleanWkt.indexOf("(") + 1; - int endIndex = cleanWkt.lastIndexOf(")"); - String coordStr = cleanWkt.substring(startIndex, endIndex).trim(); - - // 校验括号内是否有有效坐标 - if (coordStr.isEmpty()) { - throw new IllegalArgumentException("POINT内无有效坐标数据:" + wktPoint); - } - - // 分割经度和纬度(支持任意数量空格分隔) - String[] lonLat = coordStr.split("\\s+"); - if (lonLat.length != 2) { - throw new IllegalArgumentException("POINT坐标格式无效,需为 经度 纬度 格式:" + coordStr); - } - - // 转换为数字并返回 - try { - double lon = Double.parseDouble(lonLat[0]); - double lat = Double.parseDouble(lonLat[1]); - // 校验经纬度范围 - Assert.isTrue(lon >= -180 && lon <= 180, "经度超出合法范围[-180,180]:" + lon); - Assert.isTrue(lat >= -90 && lat <= 90, "纬度超出合法范围[-90,90]:" + lat); - return new double[]{lon, lat}; - } catch (NumberFormatException e) { - throw new IllegalArgumentException("POINT坐标无法转换为数字:" + coordStr, e); - } - } - - /** - * 计算震中点到行政区划点(POINT类型)的球面距离(单位:千米) - * @param epicenterLon 震中经度 - * @param epicenterLat 震中纬度 - * @param regionWktPoint 行政区划点的POINT格式WKT字符串 - * @return 震中到该行政区划点的距离(千米) - */ - public static double calculateDistanceFromEpicenterToRegionPoint(double epicenterLon, double epicenterLat, String regionWktPoint) { - try { - // 行政区划点经纬度 - double[] regionCoord = parsePointCoordinates(regionWktPoint); - double regionLon = regionCoord[0]; - double regionLat = regionCoord[1]; - - // 球面距离公式计算距离 - return calculateHaversineDistance(epicenterLon, epicenterLat, regionLon, regionLat); - } catch (Exception e) { - log.error("计算震中到行政区划点距离失败,WKT字符串:{},异常信息:{}", regionWktPoint, e.getMessage(), e); - throw new RuntimeException("计算行政区划点距离失败", e); - } - } - -} diff --git a/src/main/java/com/gis/xian/utils/qgis/GeoFilesHandler.java b/src/main/java/com/gis/xian/utils/qgis/GeoFilesHandler.java deleted file mode 100644 index 984d9e9..0000000 --- a/src/main/java/com/gis/xian/utils/qgis/GeoFilesHandler.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.gis.xian.utils.qgis; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.gis.xian.config.QgisProperties; -import com.gis.xian.dto.qgis.earthquake.EarthquakeInformationInfluenceDTO; -import com.gis.xian.dto.qgis.earthquake.EarthquakeInfluenceGeoJsonDTO; -import org.locationtech.jts.geom.CoordinateSequence; -import org.locationtech.jts.geom.GeometryFactory; -import org.locationtech.jts.geom.LinearRing; -import org.locationtech.jts.geom.Polygon; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.List; - -/** - * @author zzw - * @description: 处理空间数据文件形式 - * @date 2026/5/26 上午10:41 - */ -public class GeoFilesHandler { - - private static final GeometryFactory GEOMETRY_FACTORY = new GeometryFactory(); - // Deleted:private static final WKTReader WKT_READER = new WKTReader(GEOMETRY_FACTORY); - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - - public static void writeGeoJsonToFile(EarthquakeInfluenceGeoJsonDTO featureCollection, String fileName, QgisProperties qgisProperties) throws IOException { - // 序列化 - String geoJsonStr = OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(featureCollection); - // geojson文件路径 - String path = qgisProperties.getBasePath() + qgisProperties.getIntensityGeojsonPath() + fileName + ".geojson"; - // 创建文件目录 - File file = new File(path); - File parentDir = file.getParentFile(); - if (parentDir != null && !parentDir.exists()) { - boolean mkdirs = parentDir.mkdirs(); - if (!mkdirs) { - throw new IOException("创建GeoJson文件目录失败!" + parentDir.getAbsolutePath()); - } - } - - // 写入文件 - try (BufferedWriter writer = Files.newBufferedWriter(file.toPath(), StandardCharsets.UTF_8)) { - writer.write(geoJsonStr); - } - } - - // 将JTS转换为GeoJSON坐标 - private static List> convertCoordinateSequenceToGeoJson(CoordinateSequence cs) { - List> coordinates = new ArrayList<>(); - for (int i = 0; i < cs.size(); i++) { - double lon = cs.getX(i); // 经度 - double lat = cs.getY(i); // 纬度 - List point = new ArrayList<>(); - point.add(lon); - point.add(lat); - coordinates.add(point); - } - return coordinates; - } - - // 将JTS Polygon转换为GeoJSON Feature对象 - public static EarthquakeInfluenceGeoJsonDTO.GeoJsonFeature convertPolygonToGeoJsonFeature(Polygon polygon, EarthquakeInformationInfluenceDTO dzxx) { - EarthquakeInfluenceGeoJsonDTO.GeoJsonFeature feature = new EarthquakeInfluenceGeoJsonDTO.GeoJsonFeature(); - EarthquakeInfluenceGeoJsonDTO.GeoJsonFeature.GeoJsonGeometry geometry = new EarthquakeInfluenceGeoJsonDTO.GeoJsonFeature.GeoJsonGeometry(); - - // 设置几何类型 - geometry.setType("Polygon"); - - // 转换JTS坐标为GeoJSON坐标格式 - List>> coordinates = new ArrayList<>(); - LinearRing exteriorRing = polygon.getExteriorRing(); - List> exteriorCoordinates = convertCoordinateSequenceToGeoJson(exteriorRing.getCoordinateSequence()); - coordinates.add(exteriorCoordinates); - - // 处理内部环 - for (int i = 0; i < polygon.getNumInteriorRing(); i++) { - LinearRing interiorRing = polygon.getInteriorRingN(i); - coordinates.add(convertCoordinateSequenceToGeoJson(interiorRing.getCoordinateSequence())); - } - - geometry.setCoordinates(coordinates); - feature.setGeometry(geometry); - - // 烈度等级 - feature.getProperties().setEqAddr(dzxx.getEqName()); - feature.getProperties().setLatitude(dzxx.getLatitude()); - feature.getProperties().setLongitude(dzxx.getLongitude()); - feature.getProperties().setDescription(""); - feature.getProperties().setIntensity("烈度:" + dzxx.getSInty() + "度"); - return feature; - } - -} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index dff3a40..f229c96 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -19,35 +19,6 @@ spring: password: zhangsan database: 0 connect-timeout: 3000ms - # rabbitmq 配置 - rabbitmq: - host: localhost - port: 5672 - username: zzw - password: zzw0401 -# host: 47.92.216.173 -# port: 4018 - # username: xiaodemo - # password: 1234 -# username: gis -# password: gis502 - #虚拟host 可以不设置,使用server默认host - # virtual-host: /xiaodemos - #消息确认配置项 - publisher-returns: true #确认消息已发送到队列(Queue) - publisher-confirm-type: correlated - listener: # 手动确认消息配置 - simple: - acknowledge-mode: manual # 全局开启消费者手动确认 - # 优化配置 - concurrency: 1 # 最小消费者数 - max-concurrency: 5 # 最大消费者数 - prefetch: 1 # 每次从队列取1条消息,处理完再取(避免消息堆积) - retry: - enabled: true # 开启消费者重试(建议结合业务幂等性使用) - max-attempts: 3 # 最大重试次数 - initial-interval: 10000ms # 第一次重试间隔 - multiplier: 2 # 重试间隔倍数(第二次2s,第三次4s) # 日志配置 logging: level: diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 71c2af4..f1b296e 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -18,31 +18,6 @@ spring: password: XAYJ@gis2603 database: 0 connect-timeout: 3000ms - # rabbitmq 配置 - rabbitmq: - host: localhost - port: 5672 - # username: xiaodemo - # password: 1234 - username: zzw - password: zzw0401 - #虚拟host 可以不设置,使用server默认host - # virtual-host: /xiaodemos - #消息确认配置项 - publisher-returns: true #确认消息已发送到队列(Queue) - publisher-confirm-type: correlated - listener: # 手动确认消息配置 - simple: - acknowledge-mode: manual # 全局开启消费者手动确认 - # 优化配置 - concurrency: 1 # 最小消费者数 - max-concurrency: 5 # 最大消费者数 - prefetch: 1 # 每次从队列取1条消息,处理完再取(避免消息堆积) - retry: - enabled: true # 开启消费者重试(建议结合业务幂等性使用) - max-attempts: 3 # 最大重试次数 - initial-interval: 1000ms # 第一次重试间隔 - multiplier: 2 # 重试间隔倍数(第二次2s,第三次4s) # 日志配置 logging: