| @@ -40,6 +40,7 @@ | |||||
| <de.odysseus.juel.version>2.1.3</de.odysseus.juel.version> | <de.odysseus.juel.version>2.1.3</de.odysseus.juel.version> | ||||
| <httpclient.version>4.5.13</httpclient.version> | <httpclient.version>4.5.13</httpclient.version> | ||||
| <net.coobird.version>0.4.8</net.coobird.version> | <net.coobird.version>0.4.8</net.coobird.version> | ||||
| <fastjson.version>1.2.83</fastjson.version> | |||||
| </properties> | </properties> | ||||
| <!-- 依赖声明 --> | <!-- 依赖声明 --> | ||||
| @@ -73,6 +74,13 @@ | |||||
| <scope>import</scope> | <scope>import</scope> | ||||
| </dependency> | </dependency> | ||||
| <!-- 阿里JSON解析器 --> | |||||
| <dependency> | |||||
| <groupId>com.alibaba</groupId> | |||||
| <artifactId>fastjson</artifactId> | |||||
| <version>${fastjson.version}</version> | |||||
| </dependency> | |||||
| <!-- 覆盖logback的依赖配置--> | <!-- 覆盖logback的依赖配置--> | ||||
| <dependency> | <dependency> | ||||
| <groupId>ch.qos.logback</groupId> | <groupId>ch.qos.logback</groupId> | ||||
| @@ -0,0 +1,95 @@ | |||||
| package com.ruoyi.web.controller.gis; | |||||
| import com.ruoyi.common.annotation.Log; | |||||
| import com.ruoyi.common.core.controller.BaseController; | |||||
| import com.ruoyi.common.core.domain.AjaxResult; | |||||
| import com.ruoyi.common.enums.BusinessType; | |||||
| import com.ruoyi.system.domain.SysGis; | |||||
| import com.ruoyi.system.service.ISysGisService; | |||||
| import lombok.extern.slf4j.Slf4j; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import org.springframework.stereotype.Controller; | |||||
| import org.springframework.web.bind.annotation.PostMapping; | |||||
| import org.springframework.web.bind.annotation.RequestMapping; | |||||
| import org.springframework.web.bind.annotation.ResponseBody; | |||||
| /** | |||||
| * GIS | |||||
| * @author zhangzl | |||||
| */ | |||||
| @Slf4j | |||||
| @Controller | |||||
| @RequestMapping("/gis/map") | |||||
| public class GisMapController extends BaseController { | |||||
| @Autowired | |||||
| private ISysGisService gisService; | |||||
| /** | |||||
| * 坐标点 更新 通用 | |||||
| */ | |||||
| @Log(title = "GIS", businessType = BusinessType.UPDATE) | |||||
| @PostMapping("/point/do") | |||||
| @ResponseBody | |||||
| public AjaxResult pointSave(SysGis gis) { | |||||
| return toAjax(gisService.updateGeomByPoint(gis)); | |||||
| } | |||||
| /** | |||||
| * 坐标点 更新 通用 - 自己指定主键ID | |||||
| */ | |||||
| @Log(title = "GIS", businessType = BusinessType.UPDATE) | |||||
| @PostMapping("/point/private/do") | |||||
| @ResponseBody | |||||
| public AjaxResult pointSavePri(SysGis gis) { | |||||
| return toAjax(gisService.updateGeomByPointPri(gis)); | |||||
| } | |||||
| /** | |||||
| * 多边形面 更新 通用 | |||||
| */ | |||||
| @Log(title = "GIS", businessType = BusinessType.UPDATE) | |||||
| @PostMapping("/polygon/do") | |||||
| @ResponseBody | |||||
| public AjaxResult areaSave(SysGis gis) { | |||||
| return toAjax(gisService.updateGeomByPolygon(gis)); | |||||
| } | |||||
| /** | |||||
| * 多边形面 更新 通用 - 自己指定主键ID | |||||
| */ | |||||
| @Log(title = "GIS", businessType = BusinessType.UPDATE) | |||||
| @PostMapping("/polygon/private/do") | |||||
| @ResponseBody | |||||
| public AjaxResult areaSavePri(SysGis gis) { | |||||
| return toAjax(gisService.updateGeomByPolygonPri(gis)); | |||||
| } | |||||
| /** | |||||
| * 清空 geo 通用 | |||||
| */ | |||||
| @Log(title = "GIS", businessType = BusinessType.UPDATE) | |||||
| @PostMapping("/clean/do") | |||||
| @ResponseBody | |||||
| public AjaxResult cleanSave(SysGis gis) { | |||||
| return toAjax(gisService.cleanGeomById(gis)); | |||||
| } | |||||
| /** | |||||
| * 清空 geo 通用 - 自己指定主键ID | |||||
| */ | |||||
| @Log(title = "GIS", businessType = BusinessType.UPDATE) | |||||
| @PostMapping("/clean/private/do") | |||||
| @ResponseBody | |||||
| public AjaxResult cleanSavePri(SysGis gis) { | |||||
| return toAjax(gisService.cleanGeomByIdPri(gis)); | |||||
| } | |||||
| } | |||||
| @@ -23,6 +23,12 @@ | |||||
| <artifactId>ruoyi-common</artifactId> | <artifactId>ruoyi-common</artifactId> | ||||
| </dependency> | </dependency> | ||||
| <!-- 阿里JSON解析器 --> | |||||
| <dependency> | |||||
| <groupId>com.alibaba</groupId> | |||||
| <artifactId>fastjson</artifactId> | |||||
| </dependency> | |||||
| </dependencies> | </dependencies> | ||||
| </project> | |||||
| </project> | |||||
| @@ -0,0 +1,32 @@ | |||||
| package com.ruoyi.system.domain; | |||||
| import lombok.Data; | |||||
| /** | |||||
| * gis | |||||
| * @author zhangzl | |||||
| * | |||||
| */ | |||||
| @Data | |||||
| public class SysGis { | |||||
| private static final long serialVersionUID = 1L; | |||||
| private Long id; | |||||
| private String priId; | |||||
| private String tableName; | |||||
| private String itemName; | |||||
| /** 经度 */ | |||||
| private String longitude; | |||||
| /** 纬度 */ | |||||
| private String latitude; | |||||
| private String theGeom; | |||||
| } | |||||
| @@ -0,0 +1,20 @@ | |||||
| package com.ruoyi.system.domain.gis; | |||||
| import lombok.Data; | |||||
| import java.util.List; | |||||
| /** | |||||
| * gis | |||||
| * @author zhangzl | |||||
| * | |||||
| */ | |||||
| @Data | |||||
| public class GeoPoint { | |||||
| private static final long serialVersionUID = 1L; | |||||
| private List<Point> pointList; | |||||
| } | |||||
| @@ -0,0 +1,28 @@ | |||||
| package com.ruoyi.system.domain.gis; | |||||
| import lombok.Data; | |||||
| import java.util.List; | |||||
| /** | |||||
| * gis | |||||
| * @author zhangzl | |||||
| * | |||||
| */ | |||||
| @Data | |||||
| public class Geometry { | |||||
| private Long id; | |||||
| private String tableName; | |||||
| private String itemName; | |||||
| private String type; | |||||
| private List<Point> points; | |||||
| } | |||||
| @@ -0,0 +1,20 @@ | |||||
| package com.ruoyi.system.domain.gis; | |||||
| import lombok.Data; | |||||
| import java.util.List; | |||||
| /** | |||||
| * gis | |||||
| * @author zhangzl | |||||
| * | |||||
| */ | |||||
| @Data | |||||
| public class GeometryArea { | |||||
| private String type; | |||||
| private List<List<List<String[]>>> coordinates; | |||||
| } | |||||
| @@ -0,0 +1,17 @@ | |||||
| package com.ruoyi.system.domain.gis; | |||||
| import lombok.Data; | |||||
| /** | |||||
| * gis | |||||
| * @author zhangzl | |||||
| * | |||||
| */ | |||||
| @Data | |||||
| public class GeometryPoint { | |||||
| private String type; | |||||
| private String[] coordinates; | |||||
| } | |||||
| @@ -0,0 +1,30 @@ | |||||
| package com.ruoyi.system.domain.gis; | |||||
| import lombok.Data; | |||||
| /** | |||||
| * gis | |||||
| * @author zhangzl | |||||
| * | |||||
| */ | |||||
| @Data | |||||
| public class Point { | |||||
| private static final long serialVersionUID = 1L; | |||||
| /** 经度 */ | |||||
| private String longitude; | |||||
| /** 纬度 */ | |||||
| private String latitude; | |||||
| @Override | |||||
| public boolean equals(Object obj) { | |||||
| if (this == obj) return true; | |||||
| if (obj == null || getClass() != obj.getClass()) return false; | |||||
| Point point = (Point) obj; | |||||
| return longitude == point.longitude && latitude == point.latitude; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,22 @@ | |||||
| package com.ruoyi.system.domain.gis; | |||||
| import lombok.Data; | |||||
| import java.util.List; | |||||
| /** | |||||
| * @description: 面 | |||||
| * @author: zhangzl | |||||
| * | |||||
| */ | |||||
| @Data | |||||
| public class Polygon { | |||||
| private Long id; | |||||
| private String deptName; | |||||
| private String point; | |||||
| private List<Point> points; | |||||
| } | |||||
| @@ -0,0 +1,28 @@ | |||||
| package com.ruoyi.system.mapper; | |||||
| import com.ruoyi.system.domain.SysGis; | |||||
| /** | |||||
| * gis 数据层 | |||||
| * | |||||
| * @author zhagnzl | |||||
| */ | |||||
| public interface SysGisMapper { | |||||
| public int updateGeomByPoint(SysGis gis); | |||||
| public int updateGeomByPointPri(SysGis gis); | |||||
| public int updateGeomByPolygon(SysGis gis); | |||||
| public int updateGeomByPolygonPri(SysGis gis); | |||||
| public int cleanGeomById(SysGis gis); | |||||
| public int cleanGeomByIdPri(SysGis gis); | |||||
| } | |||||
| @@ -0,0 +1,27 @@ | |||||
| package com.ruoyi.system.service; | |||||
| import com.ruoyi.system.domain.SysGis; | |||||
| /** | |||||
| * gis 业务层 | |||||
| * @author zhagnzl | |||||
| */ | |||||
| public interface ISysGisService { | |||||
| public int updateGeomByPoint(SysGis gis); | |||||
| public int updateGeomByPointPri(SysGis gis); | |||||
| public int updateGeomByPolygon(SysGis gis); | |||||
| public int updateGeomByPolygonPri(SysGis gis); | |||||
| public int cleanGeomById(SysGis gis); | |||||
| public int cleanGeomByIdPri(SysGis gis); | |||||
| } | |||||
| @@ -0,0 +1,106 @@ | |||||
| package com.ruoyi.system.service.impl; | |||||
| import com.alibaba.fastjson.JSON; | |||||
| import com.ruoyi.system.domain.SysGis; | |||||
| import com.ruoyi.system.domain.gis.Point; | |||||
| import com.ruoyi.system.mapper.SysGisMapper; | |||||
| import com.ruoyi.system.service.ISysGisService; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import org.springframework.stereotype.Service; | |||||
| import java.util.List; | |||||
| /** | |||||
| * gis 业务层处理 | |||||
| * | |||||
| * @author zhagnzl | |||||
| */ | |||||
| @Service | |||||
| public class SysGsiServiceImpl implements ISysGisService { | |||||
| @Autowired | |||||
| private SysGisMapper gisMapper; | |||||
| @Override | |||||
| public int updateGeomByPoint(SysGis gis) { | |||||
| return gisMapper.updateGeomByPoint(gis); | |||||
| } | |||||
| @Override | |||||
| public int updateGeomByPointPri(SysGis gis) { | |||||
| return gisMapper.updateGeomByPointPri(gis); | |||||
| } | |||||
| @Override | |||||
| public int updateGeomByPolygon(SysGis gis) { | |||||
| StringBuilder sb = new StringBuilder(); | |||||
| sb.append("MULTIPOLYGON((("); | |||||
| //ObjectMapper mapper = new ObjectMapper(); | |||||
| try { | |||||
| String theGeom = gis.getTheGeom(); | |||||
| //GeoPoint gp = mapper.readValue(theGeom, GeoPoint.class); | |||||
| List<Point> pointList = JSON.parseArray(theGeom, Point.class); | |||||
| //pointList.remove(pointList.size()-1); | |||||
| // 检查第一个点和最后一个点是否相同 | |||||
| if (!pointList.get(0).equals(pointList.get(pointList.size() - 1))) { | |||||
| // 如果不相同,添加第一个点作为最后一个点来闭合多边形 | |||||
| pointList.add(pointList.get(0)); | |||||
| } | |||||
| pointList.forEach(p -> { | |||||
| sb.append(p.getLongitude()); | |||||
| sb.append(" "); | |||||
| sb.append(p.getLatitude()); | |||||
| sb.append(","); | |||||
| }); | |||||
| sb.setLength(sb.length() - 1); | |||||
| sb.append(")))"); | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| gis.setTheGeom(sb.toString()); | |||||
| return gisMapper.updateGeomByPolygon(gis); | |||||
| } | |||||
| @Override | |||||
| public int updateGeomByPolygonPri(SysGis gis) { | |||||
| StringBuilder sb = new StringBuilder(); | |||||
| sb.append("MULTIPOLYGON((("); | |||||
| //ObjectMapper mapper = new ObjectMapper(); | |||||
| try { | |||||
| String theGeom = gis.getTheGeom(); | |||||
| //GeoPoint gp = mapper.readValue(theGeom, GeoPoint.class); | |||||
| List<Point> pointList = JSON.parseArray(theGeom, Point.class); | |||||
| //pointList.remove(pointList.size()-1); | |||||
| // 检查第一个点和最后一个点是否相同 | |||||
| if (!pointList.get(0).equals(pointList.get(pointList.size() - 1))) { | |||||
| // 如果不相同,添加第一个点作为最后一个点来闭合多边形 | |||||
| pointList.add(pointList.get(0)); | |||||
| } | |||||
| pointList.forEach(p -> { | |||||
| sb.append(p.getLongitude()); | |||||
| sb.append(" "); | |||||
| sb.append(p.getLatitude()); | |||||
| sb.append(","); | |||||
| }); | |||||
| sb.setLength(sb.length() - 1); | |||||
| sb.append(")))"); | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| gis.setTheGeom(sb.toString()); | |||||
| return gisMapper.updateGeomByPolygonPri(gis); | |||||
| } | |||||
| @Override | |||||
| public int cleanGeomById(SysGis gis) { | |||||
| return gisMapper.cleanGeomById(gis); | |||||
| } | |||||
| @Override | |||||
| public int cleanGeomByIdPri(SysGis gis) { | |||||
| return gisMapper.cleanGeomByIdPri(gis); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,51 @@ | |||||
| <?xml version="1.0" encoding="UTF-8" ?> | |||||
| <!DOCTYPE mapper | |||||
| PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" | |||||
| "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||||
| <mapper namespace="com.ruoyi.system.mapper.SysGisMapper"> | |||||
| <!-- | |||||
| 将dept的坐标转换成资产点位 | |||||
| SET @R = 6378137; | |||||
| update `t_asset_permanent` a , sys_dept b set a.the_geom = ST_GeomFromText(concat('POINT(', (@R * b.lng * PI() / 180), ' ', (@R * LOG(TAN(PI() / 4 + b.lat * PI() / 360))), ')')), a.remark='1' where a.dept_id=b.dept_id and a.the_geom is null; | |||||
| 查询点: | |||||
| ST_AsGeoJSON(the_geom) as the_geom =》 {"type": "Point", "coordinates": [13533963.642572738, 4428568.311858992]} | |||||
| ST_AsText(the_geom) as the_geom_text =》 POINT(13533963.642572738 4428568.311858992) | |||||
| 查询面: | |||||
| ST_AsGeoJSON(the_geom) as the_geom =》 | |||||
| {"type": "MultiPolygon", "coordinates": [[[[13534075.944512954, 4428695.531662217], [13534149.908163859, 4428780.162406675], [13534188.380222911, 4428720.513041605], [13534128.181832636, 4428660.628354907], [13534075.944512954, 4428695.531662217]]]]} | |||||
| ST_AsText(the_geom) as the_geom_text =》 | |||||
| MULTIPOLYGON(((13533885.805339003 4428784.072163737,13533945.57236977 4428797.758983824,13534000.47646284 4428625.987592842,13533949.141121512 4428600.888650298,13533885.805339003 4428784.072163737))) | |||||
| --> | |||||
| <update id="updateGeomByPoint" parameterType="SysGis"> | |||||
| update ${tableName} set the_geom = ST_GeomFromText(CONCAT('POINT(', #{deptLongitude}, ' ', #{deptLatitude}, ')'), 4326) where id = #{id} | |||||
| </update> | |||||
| <update id="updateGeomByPointPri" parameterType="SysGis"> | |||||
| update ${tableName} set the_geom = ST_GeomFromText(CONCAT('POINT(', #{deptLongitude}, ' ', #{deptLatitude}, ')'), 4326) where ${priId} = #{id} | |||||
| </update> | |||||
| <update id="updateGeomByPolygon" parameterType="SysGis"> | |||||
| update ${tableName} set the_geom = ST_GEOMFROMTEXT(#{theGeom}) where id = #{id} | |||||
| </update> | |||||
| <update id="updateGeomByPolygonPri" parameterType="SysGis"> | |||||
| update ${tableName} set the_geom = ST_GEOMFROMTEXT(#{theGeom}) where ${priId} = #{id} | |||||
| </update> | |||||
| <update id="cleanGeomById" parameterType="SysGis"> | |||||
| update ${tableName} set the_geom = null where id = #{id} | |||||
| </update> | |||||
| <update id="cleanGeomByIdPri" parameterType="SysGis"> | |||||
| update ${tableName} set the_geom = null where ${priId} = #{id} | |||||
| </update> | |||||
| </mapper> | |||||