浏览代码

GIS

master
张泽亮 16 小时前
父节点
当前提交
e7ec36c3d0
共有 14 个文件被更改,包括 491 次插入1 次删除
  1. +8
    -0
      pom.xml
  2. +95
    -0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/gis/GisMapController.java
  3. +7
    -1
      ruoyi-system/pom.xml
  4. +32
    -0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/SysGis.java
  5. +20
    -0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/gis/GeoPoint.java
  6. +28
    -0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/gis/Geometry.java
  7. +20
    -0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/gis/GeometryArea.java
  8. +17
    -0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/gis/GeometryPoint.java
  9. +30
    -0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/gis/Point.java
  10. +22
    -0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/gis/Polygon.java
  11. +28
    -0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysGisMapper.java
  12. +27
    -0
      ruoyi-system/src/main/java/com/ruoyi/system/service/ISysGisService.java
  13. +106
    -0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysGsiServiceImpl.java
  14. +51
    -0
      ruoyi-system/src/main/resources/mapper/system/SysGisMapper.xml

+ 8
- 0
pom.xml 查看文件

@@ -40,6 +40,7 @@
<de.odysseus.juel.version>2.1.3</de.odysseus.juel.version>
<httpclient.version>4.5.13</httpclient.version>
<net.coobird.version>0.4.8</net.coobird.version>
<fastjson.version>1.2.83</fastjson.version>
</properties>

<!-- 依赖声明 -->
@@ -73,6 +74,13 @@
<scope>import</scope>
</dependency>

<!-- 阿里JSON解析器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>

<!-- 覆盖logback的依赖配置-->
<dependency>
<groupId>ch.qos.logback</groupId>


+ 95
- 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/gis/GisMapController.java 查看文件

@@ -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));
}



}

+ 7
- 1
ruoyi-system/pom.xml 查看文件

@@ -23,6 +23,12 @@
<artifactId>ruoyi-common</artifactId>
</dependency>

<!-- 阿里JSON解析器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>

</dependencies>

</project>
</project>

+ 32
- 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysGis.java 查看文件

@@ -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;

}

+ 20
- 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/gis/GeoPoint.java 查看文件

@@ -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;


}

+ 28
- 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/gis/Geometry.java 查看文件

@@ -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;


}

+ 20
- 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/gis/GeometryArea.java 查看文件

@@ -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;


}

+ 17
- 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/gis/GeometryPoint.java 查看文件

@@ -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;

}

+ 30
- 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/gis/Point.java 查看文件

@@ -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;
}


}

+ 22
- 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/gis/Polygon.java 查看文件

@@ -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;
}

+ 28
- 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysGisMapper.java 查看文件

@@ -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);


}


+ 27
- 0
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysGisService.java 查看文件

@@ -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);


}

+ 106
- 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysGsiServiceImpl.java 查看文件

@@ -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);
}
}

+ 51
- 0
ruoyi-system/src/main/resources/mapper/system/SysGisMapper.xml 查看文件

@@ -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>

正在加载...
取消
保存