将GeoJson转换,并存储

This commit is contained in:
lcj
2025-04-24 18:03:59 +08:00
parent 5abef3716e
commit 8abe7be454
34 changed files with 863 additions and 57 deletions

View File

@ -58,6 +58,8 @@
<maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
<maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
<flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
<!-- JTS库版本 -->
<jts.version>1.20.0</jts.version>
</properties>
<profiles>
@ -357,6 +359,13 @@
<version>${revision}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.locationtech.jts/jts-core -->
<dependency>
<groupId>org.locationtech.jts</groupId>
<artifactId>jts-core</artifactId>
<version>${jts.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

View File

@ -34,7 +34,7 @@
<module>ruoyi-common-tenant</module>
<module>ruoyi-common-websocket</module>
<module>ruoyi-common-sse</module>
<module>ruoyi-common-mapbox</module>
<module>ruoyi-common-jts</module>
</modules>
<artifactId>ruoyi-common</artifactId>

View File

@ -179,6 +179,13 @@
<version>${revision}</version>
</dependency>
<!-- 地图模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-jts</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</dependencyManagement>

View File

@ -4,8 +4,8 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.dromara.common.json.handler.BigNumberSerializer;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.json.handler.BigNumberSerializer;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-common-jts</artifactId>
<description>
ruoyi-common-jts 地图工具模块
</description>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.locationtech.jts/jts-core -->
<dependency>
<groupId>org.locationtech.jts</groupId>
<artifactId>jts-core</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -1,54 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-common-mapbox</artifactId>
<description>
ruoyi-common-mapbox 地图工具模块
</description>
<dependencies>
<dependency>
<groupId>com.mapbox.mapboxsdk</groupId>
<artifactId>mapbox-sdk-geojson</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>com.mapbox.mapboxsdk</groupId>
<artifactId>mapbox-sdk-services</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>com.mapbox.mapboxsdk</groupId>
<artifactId>mapbox-sdk-turf</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>com.mapbox.mapboxsdk</groupId>
<artifactId>mapbox-sdk-core</artifactId>
<version>7.4.0</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>mapbox-repo</id>
<url>https://api.mapbox.com/downloads/v2/releases/maven</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>

View File

@ -100,6 +100,11 @@
<artifactId>ruoyi-common-sse</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-jts</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,15 @@
package org.dromara.constant;
/**
* @author lcj
* @date 2025/4/24 17:44
*/
public interface GeoJsonConstant {
String POINT = "Point";
String LINE = "LineString";
String POLYGON = "Polygon";
}

View File

@ -15,6 +15,7 @@ import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.facility.domain.req.matrix.MatrixCreateByGeoJsonReq;
import org.dromara.facility.domain.req.matrix.MatrixCreateReq;
import org.dromara.facility.domain.req.matrix.MatrixQueryReq;
import org.dromara.facility.domain.req.matrix.MatrixUpdateReq;
@ -71,6 +72,17 @@ public class FacMatrixController extends BaseController {
return R.ok(facMatrixService.queryById(id));
}
/**
* 通过GeoJson新增设施-方阵
*/
@SaCheckPermission("facility:matrix:add")
@Log(title = "设施-方阵", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/geoJson")
public R<Void> insertByGeoJson(@RequestBody MatrixCreateByGeoJsonReq req) {
return toAjax(facMatrixService.insertByGeoJson(req));
}
/**
* 新增设施-方阵
*/

View File

@ -15,6 +15,7 @@ import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.facility.domain.req.photovoltaicpanel.PhotovoltaicPanelCreateByGeoJsonReq;
import org.dromara.facility.domain.req.photovoltaicpanel.PhotovoltaicPanelCreateReq;
import org.dromara.facility.domain.req.photovoltaicpanel.PhotovoltaicPanelQueryReq;
import org.dromara.facility.domain.req.photovoltaicpanel.PhotovoltaicPanelUpdateReq;
@ -82,6 +83,17 @@ public class FacPhotovoltaicPanelController extends BaseController {
return R.ok(facPhotovoltaicPanelService.insertByBo(req));
}
/**
* 通过GeoJson新增设施-光伏板
*/
@SaCheckPermission("facility:photovoltaicPanel:add")
@Log(title = "设施-光伏板", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/geoJson")
public R<Void> insertByGeoJson(@RequestBody PhotovoltaicPanelCreateByGeoJsonReq geoJson) {
return toAjax(facPhotovoltaicPanelService.insertByGeoJson(geoJson));
}
/**
* 修改设施-光伏板
*/

View File

@ -5,10 +5,13 @@ import org.dromara.common.core.domain.R;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.web.core.BaseController;
import org.dromara.facility.domain.req.photovoltaicpanelparts.PhotovoltaicPanelPartsCreateByGeoJsonReq;
import org.dromara.facility.domain.req.photovoltaicpanelparts.PhotovoltaicPanelPartsCreateReq;
import org.dromara.facility.service.IFacPhotovoltaicPanelPartsService;
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;
@ -21,11 +24,21 @@ import org.springframework.web.bind.annotation.RestController;
@Validated
@RestController
@RequestMapping("/facility/photovoltaicPanelPoint/parts")
public class FacPhotovoltaicPanelPartsController {
public class FacPhotovoltaicPanelPartsController extends BaseController {
@Resource
private IFacPhotovoltaicPanelPartsService photovoltaicPanelPartsService;
/**
* 通过GeoJson新增设施-光伏板桩点、立柱、支架
*/
@Log(title = "设施-光伏板(桩点、立柱、支架)", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/geoJson")
public R<Void> insertPartsByGeoJson(@RequestBody PhotovoltaicPanelPartsCreateByGeoJsonReq req) {
return toAjax(photovoltaicPanelPartsService.insertPartsByGeoJson(req));
}
/**
* 新增设施-光伏板桩点、立柱、支架
*/

View File

@ -0,0 +1,22 @@
package org.dromara.facility.domain.req.geojson;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author lcj
* @date 2025/4/24 17:38
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Feature {
private String type;
private Geometry geometry;
private Properties properties;
}

View File

@ -0,0 +1,22 @@
package org.dromara.facility.domain.req.geojson;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author lcj
* @date 2025/4/24 10:40
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FeatureByLine {
private String type;
private GeometryByLine geometry;
private Properties properties;
}

View File

@ -0,0 +1,22 @@
package org.dromara.facility.domain.req.geojson;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author lcj
* @date 2025/4/24 10:32
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FeatureByPlane {
private String type;
private GeometryByPlane geometry;
private Properties properties;
}

View File

@ -0,0 +1,22 @@
package org.dromara.facility.domain.req.geojson;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author lcj
* @date 2025/4/24 10:40
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FeatureByPoint {
private String type;
private GeometryByPoint geometry;
private Properties properties;
}

View File

@ -0,0 +1,24 @@
package org.dromara.facility.domain.req.geojson;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author lcj
* @date 2025/4/24 17:37
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GeoJson {
private String name;
private String type;
private List<Feature> features;
}

View File

@ -0,0 +1,25 @@
package org.dromara.facility.domain.req.geojson;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* @author lcj
* @date 2025/4/24 10:38
*/
@Data
public class GeoJsonByLine implements Serializable {
@Serial
private static final long serialVersionUID = -1019429627483913266L;
private String name;
private String type;
private List<FeatureByLine> features;
}

View File

@ -0,0 +1,25 @@
package org.dromara.facility.domain.req.geojson;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* @author lcj
* @date 2025/4/24 10:32
*/
@Data
public class GeoJsonByPlane implements Serializable {
@Serial
private static final long serialVersionUID = 7407176569611285023L;
private String name;
private String type;
private List<FeatureByPlane> features;
}

View File

@ -0,0 +1,25 @@
package org.dromara.facility.domain.req.geojson;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* @author lcj
* @date 2025/4/24 10:38
*/
@Data
public class GeoJsonByPoint implements Serializable {
@Serial
private static final long serialVersionUID = 3829419654737988678L;
private String name;
private String type;
private List<FeatureByPoint> features;
}

View File

@ -0,0 +1,24 @@
package org.dromara.facility.domain.req.geojson;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author lcj
* @date 2025/4/24 17:38
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Geometry {
private String type;
private List<Object> coordinates;
private Long id;
}

View File

@ -0,0 +1,24 @@
package org.dromara.facility.domain.req.geojson;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author lcj
* @date 2025/4/24 10:41
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GeometryByLine {
private String type;
private List<List<Double>> coordinates;
private Long id;
}

View File

@ -0,0 +1,24 @@
package org.dromara.facility.domain.req.geojson;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author lcj
* @date 2025/4/24 10:33
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GeometryByPlane {
private String type;
private List<List<List<Double>>> coordinates;
private Long id;
}

View File

@ -0,0 +1,24 @@
package org.dromara.facility.domain.req.geojson;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author lcj
* @date 2025/4/24 10:41
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GeometryByPoint {
private String type;
private List<Double> coordinates;
private Long id;
}

View File

@ -0,0 +1,20 @@
package org.dromara.facility.domain.req.geojson;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author lcj
* @date 2025/4/24 10:53
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Properties {
private String type;
private String text;
}

View File

@ -0,0 +1,35 @@
package org.dromara.facility.domain.req.matrix;
import lombok.Data;
import org.dromara.facility.domain.req.geojson.GeoJson;
import org.dromara.facility.domain.req.geojson.GeoJsonByPoint;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lcj
* @date 2025/4/24 11:03
*/
@Data
public class MatrixCreateByGeoJsonReq implements Serializable {
@Serial
private static final long serialVersionUID = -3636617370172414549L;
/**
* 项目id
*/
private Long projectId;
/**
* 地理位置
*/
private GeoJson locationGeoJson;
/**
* 名称
*/
private GeoJsonByPoint nameGeoJson;
}

View File

@ -0,0 +1,35 @@
package org.dromara.facility.domain.req.photovoltaicpanel;
import lombok.Data;
import org.dromara.facility.domain.req.geojson.GeoJsonByPlane;
import org.dromara.facility.domain.req.geojson.GeoJsonByPoint;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lcj
* @date 2025/4/24 9:53
*/
@Data
public class PhotovoltaicPanelCreateByGeoJsonReq implements Serializable {
@Serial
private static final long serialVersionUID = -14887945592031533L;
/**
* 项目id
*/
private Long projectId;
/**
* 地理位置
*/
private GeoJsonByPlane locationGeoJson;
/**
* 名称
*/
private GeoJsonByPoint nameGeoJson;
}

View File

@ -0,0 +1,29 @@
package org.dromara.facility.domain.req.photovoltaicpanelparts;
import lombok.Data;
import org.dromara.facility.domain.req.geojson.GeoJsonByPoint;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lcj
* @date 2025/4/24 11:01
*/
@Data
public class PhotovoltaicPanelPartsCreateByGeoJsonReq implements Serializable {
@Serial
private static final long serialVersionUID = 5682597792623228174L;
/**
* 项目id
*/
private Long projectId;
/**
* 桩点、立柱、支架 GeoJson
*/
private GeoJsonByPoint pointGeoJson;
}

View File

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.facility.domain.FacMatrix;
import org.dromara.facility.domain.req.matrix.MatrixCreateByGeoJsonReq;
import org.dromara.facility.domain.req.matrix.MatrixCreateReq;
import org.dromara.facility.domain.req.matrix.MatrixQueryReq;
import org.dromara.facility.domain.req.matrix.MatrixUpdateReq;
@ -55,6 +56,14 @@ public interface IFacMatrixService extends IService<FacMatrix> {
*/
Long insertByBo(MatrixCreateReq req);
/**
* 新增设施-方阵
*
* @param geoJson GeoJson格式
* @return 新增方阵id
*/
Boolean insertByGeoJson(MatrixCreateByGeoJsonReq geoJson);
/**
* 修改设施-方阵
*

View File

@ -1,5 +1,6 @@
package org.dromara.facility.service;
import org.dromara.facility.domain.req.photovoltaicpanelparts.PhotovoltaicPanelPartsCreateByGeoJsonReq;
import org.dromara.facility.domain.req.photovoltaicpanelparts.PhotovoltaicPanelPartsCreateReq;
/**
@ -10,6 +11,14 @@ import org.dromara.facility.domain.req.photovoltaicpanelparts.PhotovoltaicPanelP
*/
public interface IFacPhotovoltaicPanelPartsService {
/**
* 批量新增设施-光伏板(桩点、立柱、支架)
*
* @param geoJson GeoJson格式
* @return 是否新增成功
*/
Boolean insertPartsByGeoJson(PhotovoltaicPanelPartsCreateByGeoJsonReq geoJson);
/**
* 批量新增设施-光伏板(桩点、立柱、支架)
*

View File

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.facility.domain.FacPhotovoltaicPanel;
import org.dromara.facility.domain.req.photovoltaicpanel.PhotovoltaicPanelCreateByGeoJsonReq;
import org.dromara.facility.domain.req.photovoltaicpanel.PhotovoltaicPanelCreateReq;
import org.dromara.facility.domain.req.photovoltaicpanel.PhotovoltaicPanelQueryReq;
import org.dromara.facility.domain.req.photovoltaicpanel.PhotovoltaicPanelUpdateReq;
@ -55,6 +56,14 @@ public interface IFacPhotovoltaicPanelService extends IService<FacPhotovoltaicPa
*/
Long insertByBo(PhotovoltaicPanelCreateReq req);
/**
* 新增光伏板
*
* @param geoJson GeoJson格式
* @return 是否新增成功
*/
Boolean insertByGeoJson(PhotovoltaicPanelCreateByGeoJsonReq geoJson);
/**
* 修改设施-光伏板
*

View File

@ -12,7 +12,12 @@ import org.dromara.common.core.utils.ObjectUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.constant.GeoJsonConstant;
import org.dromara.facility.domain.FacMatrix;
import org.dromara.facility.domain.req.geojson.Feature;
import org.dromara.facility.domain.req.geojson.FeatureByPoint;
import org.dromara.facility.domain.req.geojson.Geometry;
import org.dromara.facility.domain.req.matrix.MatrixCreateByGeoJsonReq;
import org.dromara.facility.domain.req.matrix.MatrixCreateReq;
import org.dromara.facility.domain.req.matrix.MatrixQueryReq;
import org.dromara.facility.domain.req.matrix.MatrixUpdateReq;
@ -20,6 +25,7 @@ import org.dromara.facility.domain.vo.FacMatrixVo;
import org.dromara.facility.mapper.FacMatrixMapper;
import org.dromara.facility.service.IFacMatrixService;
import org.dromara.project.service.IBusProjectService;
import org.dromara.utils.GeoJsonUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -27,6 +33,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
/**
* 设施-方阵Service业务层处理
@ -115,6 +122,81 @@ public class FacMatrixServiceImpl extends ServiceImpl<FacMatrixMapper, FacMatrix
return matrix.getId();
}
/**
* 新增设施-方阵
*
* @param geoJson GeoJson格式
* @return 新增方阵id
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByGeoJson(MatrixCreateByGeoJsonReq geoJson) {
Long projectId = geoJson.getProjectId();
if (projectService.getById(projectId) == null) {
throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND);
}
List<FacMatrix> matrixList = new ArrayList<>();
List<Feature> locationFeatures = geoJson.getLocationGeoJson().getFeatures();
List<FeatureByPoint> nameFeatures = geoJson.getNameGeoJson().getFeatures();
for (Feature feature : locationFeatures) {
FacMatrix matrix = new FacMatrix();
matrix.setProjectId(projectId);
Geometry geometry = feature.getGeometry();
List<Object> coordinates = geometry.getCoordinates();
if (geometry.getType().equals(GeoJsonConstant.POINT)) {
throw new ServiceException("点位无法创建方阵", HttpStatus.BAD_REQUEST);
}
// 获取方阵名称
String name = null;
List<List<Double>> coordinatesList = new ArrayList<>();
if (geometry.getType().equals(GeoJsonConstant.LINE)) {
for (Object obj : coordinates) {
if (obj instanceof List<?> innerList) {
List<Double> point = new ArrayList<>();
for (Object num : innerList) {
if (num instanceof Number) {
point.add(((Number) num).doubleValue());
}
}
coordinatesList.add(point);
}
}
} else if (geometry.getType().equals(GeoJsonConstant.POLYGON)) {
coordinatesList = coordinates.stream()
.filter(obj -> obj instanceof List<?>)
.flatMap(obj -> ((List<?>) obj).stream())
.filter(pointObj -> pointObj instanceof List<?>)
.map(pointObj -> ((List<?>) pointObj).stream()
.filter(num -> num instanceof Number)
.map(num -> ((Number) num).doubleValue())
.collect(Collectors.toList()))
.collect(Collectors.toList());
}
for (FeatureByPoint nameFeature : nameFeatures) {
List<Double> nameCoordinates = nameFeature.getGeometry().getCoordinates();
Boolean result = GeoJsonUtils.pointIsWithInPlane(coordinatesList, nameCoordinates);
if (result) {
name = nameFeature.getProperties().getText();
break;
}
}
if (name == null) {
continue;
}
String positionStr = JSONUtil.toJsonStr(coordinates);
matrix.setPositions(positionStr);
matrix.setMatrixName(name);
matrixList.add(matrix);
}
if (CollUtil.isNotEmpty(matrixList)) {
boolean result = this.saveBatch(matrixList);
if (!result) {
throw new ServiceException("批量新增方阵失败,数据库异常", HttpStatus.ERROR);
}
}
return true;
}
/**
* 修改设施-方阵
*

View File

@ -6,16 +6,21 @@ import jakarta.annotation.Resource;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.facility.domain.FacPhotovoltaicPanel;
import org.dromara.facility.domain.FacPhotovoltaicPanelColumn;
import org.dromara.facility.domain.FacPhotovoltaicPanelPoint;
import org.dromara.facility.domain.FacPhotovoltaicPanelSupport;
import org.dromara.facility.domain.req.geojson.FeatureByPoint;
import org.dromara.facility.domain.req.photovoltaicpanelparts.PhotovoltaicPanelPartsCreateByGeoJsonReq;
import org.dromara.facility.domain.req.photovoltaicpanelparts.PhotovoltaicPanelPartsCreateReq;
import org.dromara.facility.service.*;
import org.dromara.project.service.IBusProjectService;
import org.dromara.utils.GeoJsonUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
@ -31,6 +36,9 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
@Resource
private IFacMatrixService matrixService;
@Resource
private IFacPhotovoltaicPanelService photovoltaicPanelService;
@Resource
private IFacPhotovoltaicPanelPointService photovoltaicPanelPointService;
@ -40,6 +48,89 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
@Resource
private IFacPhotovoltaicPanelSupportService photovoltaicPanelSupportService;
/**
* 批量新增设施-光伏板(桩点、立柱、支架)
*
* @param geoJson GeoJson格式
* @return 是否新增成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertPartsByGeoJson(PhotovoltaicPanelPartsCreateByGeoJsonReq geoJson) {
Long projectId = geoJson.getProjectId();
if (projectService.getById(projectId) == null) {
throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND);
}
List<FacPhotovoltaicPanel> photovoltaicPanelList = photovoltaicPanelService.lambdaQuery()
.eq(FacPhotovoltaicPanel::getProjectId, projectId).list();
if (CollUtil.isEmpty(photovoltaicPanelList)) {
throw new ServiceException("项目下未创建光伏板", HttpStatus.NOT_FOUND);
}
List<FeatureByPoint> features = geoJson.getPointGeoJson().getFeatures();
List<List<Double>> pointList = new ArrayList<>
(features.stream().map(featureByPoint -> featureByPoint.getGeometry().getCoordinates()).toList());
List<FacPhotovoltaicPanelPoint> photovoltaicPanelPointList = new ArrayList<>();
List<FacPhotovoltaicPanelColumn> photovoltaicPanelColumnList = new ArrayList<>();
List<FacPhotovoltaicPanelSupport> photovoltaicPanelSupportList = new ArrayList<>();
for (FacPhotovoltaicPanel photovoltaicPanel : photovoltaicPanelList) {
String positions = photovoltaicPanel.getPositions();
List<List<Double>> positionList = new ArrayList<>();
List<String> arr = JSONUtil.toList(positions, String.class);
for (String s : arr) {
positionList.add(JSONUtil.toList(s, Double.class));
}
List<List<Double>> pointInPlaneList = GeoJsonUtils.getPointInPlaneList(positionList, pointList);
pointList.removeAll(pointInPlaneList);
if (CollUtil.isNotEmpty(pointInPlaneList)) {
int i = 1;
for (List<Double> list : pointInPlaneList) {
String str = String.format("%02d", i);
String name = photovoltaicPanel.getName() + "." + str;
Long matrixId = photovoltaicPanel.getMatrixId();
String jsonStr = JSONUtil.toJsonStr(list);
FacPhotovoltaicPanelPoint photovoltaicPanelPoint = new FacPhotovoltaicPanelPoint();
photovoltaicPanelPoint.setProjectId(projectId);
photovoltaicPanelPoint.setMatrixId(matrixId);
photovoltaicPanelPoint.setName(name);
photovoltaicPanelPoint.setPositions(jsonStr);
photovoltaicPanelPointList.add(photovoltaicPanelPoint);
FacPhotovoltaicPanelColumn photovoltaicPanelColumn = new FacPhotovoltaicPanelColumn();
photovoltaicPanelColumn.setProjectId(projectId);
photovoltaicPanelColumn.setMatrixId(matrixId);
photovoltaicPanelColumn.setName(name);
photovoltaicPanelColumn.setPositions(jsonStr);
photovoltaicPanelColumnList.add(photovoltaicPanelColumn);
FacPhotovoltaicPanelSupport photovoltaicPanelSupport = new FacPhotovoltaicPanelSupport();
photovoltaicPanelSupport.setProjectId(projectId);
photovoltaicPanelSupport.setMatrixId(matrixId);
photovoltaicPanelSupport.setName(name);
photovoltaicPanelSupport.setPositions(jsonStr);
photovoltaicPanelSupportList.add(photovoltaicPanelSupport);
i++;
}
}
}
if (CollUtil.isNotEmpty(photovoltaicPanelPointList)) {
boolean result = photovoltaicPanelPointService.saveBatch(photovoltaicPanelPointList);
if (!result) {
throw new ServiceException("批量新增光伏板桩点失败,数据库异常", HttpStatus.ERROR);
}
}
if (CollUtil.isNotEmpty(photovoltaicPanelColumnList)) {
boolean result = photovoltaicPanelColumnService.saveBatch(photovoltaicPanelColumnList);
if (!result) {
throw new ServiceException("批量新增光伏板立柱失败,数据库异常", HttpStatus.ERROR);
}
}
if (CollUtil.isNotEmpty(photovoltaicPanelSupportList)) {
boolean result = photovoltaicPanelSupportService.saveBatch(photovoltaicPanelSupportList);
if (!result) {
throw new ServiceException("批量新增光伏板支架失败,数据库异常", HttpStatus.ERROR);
}
}
return true;
}
/**
* 批量新增设施-光伏板(桩点、立柱、支架)
*

View File

@ -12,7 +12,12 @@ import org.dromara.common.core.utils.ObjectUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.facility.domain.FacMatrix;
import org.dromara.facility.domain.FacPhotovoltaicPanel;
import org.dromara.facility.domain.req.geojson.FeatureByPlane;
import org.dromara.facility.domain.req.geojson.FeatureByPoint;
import org.dromara.facility.domain.req.geojson.GeometryByPlane;
import org.dromara.facility.domain.req.photovoltaicpanel.PhotovoltaicPanelCreateByGeoJsonReq;
import org.dromara.facility.domain.req.photovoltaicpanel.PhotovoltaicPanelCreateReq;
import org.dromara.facility.domain.req.photovoltaicpanel.PhotovoltaicPanelQueryReq;
import org.dromara.facility.domain.req.photovoltaicpanel.PhotovoltaicPanelUpdateReq;
@ -21,6 +26,7 @@ import org.dromara.facility.mapper.FacPhotovoltaicPanelMapper;
import org.dromara.facility.service.IFacMatrixService;
import org.dromara.facility.service.IFacPhotovoltaicPanelService;
import org.dromara.project.service.IBusProjectService;
import org.dromara.utils.GeoJsonUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -120,6 +126,76 @@ public class FacPhotovoltaicPanelServiceImpl extends ServiceImpl<FacPhotovoltaic
return photovoltaicPanel.getId();
}
/**
* 新增光伏板
*
* @param geoJson GeoJson格式
* @return 是否新增成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByGeoJson(PhotovoltaicPanelCreateByGeoJsonReq geoJson) {
Long projectId = geoJson.getProjectId();
if (projectService.getById(projectId) == null) {
throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND);
}
List<FacMatrix> matrixList = matrixService.lambdaQuery()
.eq(FacMatrix::getProjectId, projectId).list();
if (CollUtil.isEmpty(matrixList)) {
throw new ServiceException("项目下无方阵数据,请先创建方阵消息后再添加光伏板信息", HttpStatus.NOT_FOUND);
}
List<FacPhotovoltaicPanel> photovoltaicPanelList = new ArrayList<>();
List<FeatureByPlane> locationFeatures = geoJson.getLocationGeoJson().getFeatures();
List<FeatureByPoint> nameFeatures = geoJson.getNameGeoJson().getFeatures();
for (FeatureByPlane locationFeature : locationFeatures) {
FacPhotovoltaicPanel photovoltaicPanel = new FacPhotovoltaicPanel();
GeometryByPlane geometry = locationFeature.getGeometry();
List<List<Double>> coordinates = geometry.getCoordinates().get(0);
// 判断光伏板在哪个方阵里
Long matrixId = null;
for (FacMatrix matrix : matrixList) {
String positions = matrix.getPositions();
List<List<Double>> positionList = new ArrayList<>();
List<String> arr = JSONUtil.toList(positions, String.class);
for (String s : arr) {
positionList.add(JSONUtil.toList(s, Double.class));
}
Boolean result = GeoJsonUtils.planeIsWithInPlane(positionList, coordinates);
if (result) {
matrixId = matrix.getId();
break;
}
}
if (matrixId == null) {
continue;
}
photovoltaicPanel.setMatrixId(matrixId);
// 获取光伏板名称
String name = null;
for (FeatureByPoint nameFeature : nameFeatures) {
List<Double> nameCoordinates = nameFeature.getGeometry().getCoordinates();
Boolean result = GeoJsonUtils.pointIsWithInPlane(coordinates, nameCoordinates);
if (result) {
name = nameFeature.getProperties().getText();
break;
}
}
if (name == null) {
continue;
}
photovoltaicPanel.setName(name);
photovoltaicPanel.setProjectId(projectId);
photovoltaicPanel.setPositions(JSONUtil.toJsonStr(coordinates));
photovoltaicPanelList.add(photovoltaicPanel);
}
// 操作数据库,批量保存
boolean save = this.saveBatch(photovoltaicPanelList);
if (!save) {
throw new ServiceException("新增光伏板失败,数据库异常", HttpStatus.ERROR);
}
return true;
}
/**
* 修改设施-光伏板
*

View File

@ -0,0 +1,83 @@
package org.dromara.utils;
import org.locationtech.jts.geom.*;
import java.util.List;
/**
* @author lcj
* @date 2025/4/24 11:48
*/
public class GeoJsonUtils {
/**
* 点是否在平面内
*
* @param planeLists 平面坐标
* @param pointList 点坐标
* @return 点是否在平面内
*/
public static Boolean pointIsWithInPlane(List<List<Double>> planeLists, List<Double> pointList) {
GeometryFactory geometryFactory = new GeometryFactory();
// 构建平面
Coordinate[] coordinates = getPlaneCoordinate(planeLists);
Polygon polygon = geometryFactory.createPolygon(coordinates);
// 构建待判断点
Point point = geometryFactory.createPoint(new Coordinate(pointList.get(0), pointList.get(1)));
// 判断是否在多边形内
return polygon.contains(point);
}
/**
* 获取平面内点列表集合
*
* @param planeLists 平面坐标列表
* @param pointLists 点坐标列表集合
* @return 平面内点坐标列表集合
*/
public static List<List<Double>> getPointInPlaneList(List<List<Double>> planeLists, List<List<Double>> pointLists) {
GeometryFactory geometryFactory = new GeometryFactory();
// 构建平面
Coordinate[] coordinates = getPlaneCoordinate(planeLists);
LinearRing shell = geometryFactory.createLinearRing(coordinates);
Polygon polygon = geometryFactory.createPolygon(shell);
// 获取平面内点结合
return pointLists.stream().filter(pointList -> {
// 构建待判断点
Point point = geometryFactory.createPoint(new Coordinate(pointList.get(0), pointList.get(1)));
// 判断是否在多边形内
return polygon.contains(point);
}).toList();
}
/**
* 平面是否在平面内
*
* @param referencePlane 参考平面
* @param comparePlane 比较平面
* @return 平面是否在平面内
*/
public static Boolean planeIsWithInPlane(List<List<Double>> referencePlane, List<List<Double>> comparePlane) {
GeometryFactory geometryFactory = new GeometryFactory();
// 构建参考平面
Coordinate[] referenceCoordinates = getPlaneCoordinate(referencePlane);
Polygon referencePolygon = geometryFactory.createPolygon(referenceCoordinates);
// 构建比较平面
Coordinate[] compareCoordinates = getPlaneCoordinate(comparePlane);
Polygon comparePolygon = geometryFactory.createPolygon(compareCoordinates);
// 判断是否在多边形内
return referencePolygon.contains(comparePolygon);
}
/**
* 获取平面坐标数组
*
* @param planeLists 平面坐标列表
* @return 平面坐标数组
*/
public static Coordinate[] getPlaneCoordinate(List<List<Double>> planeLists) {
return planeLists.stream().map(planeList ->
new Coordinate(planeList.get(0), planeList.get(1)))
.toList().toArray(new Coordinate[0]);
}
}