Преглед изворни кода

update content-service/geo

reghao пре 7 месеци
родитељ
комит
4cb037e5ba

+ 34 - 0
content/content-api/src/main/java/cn/reghao/tnb/content/api/dto/CamPhoto.java

@@ -0,0 +1,34 @@
+package cn.reghao.tnb.content.api.dto;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2025-08-15 15:17:33
+ */
+@NoArgsConstructor
+@Setter
+@Getter
+public class CamPhoto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String photoUrl;
+    private Integer channelCode;
+    private String objectId;
+    private String manufacturer;
+    private String model;
+    private String software;
+    private String shotAt;
+    private Double longitude;
+    private Double latitude;
+
+    public CamPhoto(String photoUrl) {
+        this.photoUrl = photoUrl;
+        this.channelCode = 0;
+        this.objectId = "";
+    }
+}

+ 5 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/db/mapper/GeoChinaMapper.java

@@ -2,7 +2,9 @@ package cn.reghao.tnb.content.app.geo.db.mapper;
 
 import cn.reghao.jutil.jdk.db.BaseMapper;
 import cn.reghao.tnb.content.app.geo.model.po.GeoChina;
+import cn.reghao.tnb.content.app.geo.model.vo.GeoArea;
 import cn.reghao.tnb.content.app.geo.model.vo.GeoMarker;
+import cn.reghao.tnb.content.app.geo.model.vo.MapPoint;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
@@ -13,5 +15,8 @@ import java.util.List;
  */
 @Mapper
 public interface GeoChinaMapper extends BaseMapper<GeoChina> {
+    void saveMultiPolygon(GeoChina geoChina);
     List<GeoMarker> findByDeep(int deep);
+    GeoChina findByPoint(MapPoint mapPoint);
+    List<GeoArea> findAllArea();
 }

+ 0 - 18
content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/db/mapper/GeoPolygonMapper.java

@@ -1,18 +0,0 @@
-package cn.reghao.tnb.content.app.geo.db.mapper;
-
-import cn.reghao.jutil.jdk.db.BaseMapper;
-import cn.reghao.tnb.content.app.geo.model.po.GeoPolygon;
-import cn.reghao.tnb.content.app.geo.model.vo.MapPoint;
-import org.apache.ibatis.annotations.Mapper;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2023-09-12 15:20:49
- */
-@Mapper
-public interface GeoPolygonMapper extends BaseMapper<GeoPolygon> {
-    List<Integer> findByPoint(MapPoint mapPoint);
-    GeoPolygon findById(int id);
-}

+ 13 - 1
content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/model/po/GeoChina.java

@@ -20,7 +20,19 @@ public class GeoChina {
     private Integer pid;
     private Integer deep;
     private String name;
-    private String extName;
+    private String extPath;
     private BigDecimal longitude;
     private BigDecimal latitude;
+    private String polygon;
+    private transient String multiPolygon;
+
+    public GeoChina(int id, int pid, int deep, String name, String extPath, double lng, double lat) {
+        this.id = id;
+        this.pid = pid;
+        this.deep = deep;
+        this.name = name;
+        this.extPath = extPath;
+        this.longitude = BigDecimal.valueOf(lng);
+        this.latitude = BigDecimal.valueOf(lat);
+    }
 }

+ 0 - 19
content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/model/po/GeoPolygon.java

@@ -1,19 +0,0 @@
-package cn.reghao.tnb.content.app.geo.model.po;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-/**
- * @author reghao
- * @date 2023-09-12 15:19:41
- */
-@NoArgsConstructor
-@AllArgsConstructor
-@Setter
-@Getter
-public class GeoPolygon {
-    private Integer id;
-    private String polygon;
-}

+ 14 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/model/vo/GeoArea.java

@@ -0,0 +1,14 @@
+package cn.reghao.tnb.content.app.geo.model.vo;
+
+import lombok.Getter;
+
+/**
+ * @author reghao
+ * @date 2025-08-15 15:43:09
+ */
+@Getter
+public class GeoArea {
+    private int id;
+    private int pid;
+    private String name;
+}

+ 0 - 17
content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/model/vo/GeoData.java

@@ -1,17 +0,0 @@
-package cn.reghao.tnb.content.app.geo.model.vo;
-
-import cn.reghao.tnb.content.app.geo.model.po.GeoChina;
-import cn.reghao.tnb.content.app.geo.model.po.GeoPolygon;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * @author reghao
- * @date 2025-03-17 18:00:20
- */
-@AllArgsConstructor
-@Getter
-public class GeoData {
-    private GeoChina geoChina;
-    private GeoPolygon geoPolygon;
-}

+ 28 - 77
content/content-service/src/main/java/cn/reghao/tnb/content/app/geo/service/MapService.java

@@ -3,18 +3,11 @@ package cn.reghao.tnb.content.app.geo.service;
 import cn.reghao.jutil.jdk.converter.DateTimeConverter;
 import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.content.app.geo.db.mapper.*;
-import cn.reghao.tnb.content.app.geo.model.po.BusStation;
 import cn.reghao.tnb.content.app.geo.model.po.GeoChina;
 import cn.reghao.tnb.content.app.geo.model.po.GeoPoint;
-import cn.reghao.tnb.content.app.geo.model.po.GeoPolygon;
-import cn.reghao.tnb.content.app.geo.model.vo.CascadeOption;
-import cn.reghao.tnb.content.app.geo.model.vo.GeoMarker;
-import cn.reghao.tnb.content.app.geo.model.vo.MapMarker;
-import cn.reghao.tnb.content.app.geo.model.vo.MapPoint;
+import cn.reghao.tnb.content.app.geo.model.vo.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -30,28 +23,16 @@ import java.util.stream.Collectors;
 @Service
 public class MapService {
     private final GeoChinaMapper geoChinaMapper;
-    private final GeoPolygonMapper geoPolygonMapper;
     private final GeoPointMapper geoPointMapper;
-    private final BusStationMapper busStationMapper;
     private final List<CascadeOption> cascadeOptionList = new ArrayList<>();
 
-    public MapService(GeoChinaMapper geoChinaMapper, GeoPolygonMapper geoPolygonMapper,
-                      GeoPointMapper geoPointMapper, BusStationMapper busStationMapper) {
+    public MapService(GeoChinaMapper geoChinaMapper, GeoPointMapper geoPointMapper) {
         this.geoChinaMapper = geoChinaMapper;
-        this.geoPolygonMapper = geoPolygonMapper;
         this.geoPointMapper = geoPointMapper;
-        this.busStationMapper = busStationMapper;
     }
 
-    @Transactional(rollbackFor = Exception.class)
-    public void add(GeoChina geoChina, GeoPolygon geoPolygon) {
-        try {
-            geoChinaMapper.save(geoChina);
-            //geoPolygonMapper.save(geoPolygon);
-        } catch (Exception e) {
-            log.info("insert {} -> {} error", geoChina.getId(), geoChina.getExtName());
-            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-        }
+    public void add(GeoChina geoChina) {
+        geoChinaMapper.save(geoChina);
     }
 
     public void addGeoPoint(MapPoint mapPoint) {
@@ -59,19 +40,6 @@ public class MapService {
         geoPointMapper.save(geoPoint);
     }
 
-    public List<MapMarker> getCityMarks() {
-        int deep = 2;
-        List<GeoMarker> list = geoChinaMapper.findByDeep(deep);
-        return list.stream().map(geoMarker -> {
-            String id = String.valueOf(geoMarker.getId());
-            String name = geoMarker.getName();
-            double lng = geoMarker.getLng();
-            double lat = geoMarker.getLat();
-            MapPoint mapPoint = new MapPoint(lng, lat);
-            return new MapMarker(id, name, mapPoint);
-        }).collect(Collectors.toList());
-    }
-
     public List<MapMarker> getTrailMarks() {
         long userId = UserContext.getUserId();
         List<GeoPoint> list = geoPointMapper.findByUserId(userId);
@@ -85,23 +53,6 @@ public class MapService {
         }).collect(Collectors.toList());
     }
 
-    public List<MapMarker> getStationMarks() {
-        List<BusStation> list = busStationMapper.findAll();
-        return list.stream().map(busStation -> {
-            String id = busStation.getId()+"";
-            String stationName = busStation.getStationName();
-            String latStr = String.valueOf(busStation.getLat());
-            String latStr1 = String.format("%s.%s", latStr.substring(0, 2), latStr.substring(2));
-            double lat = Double.parseDouble(latStr1);
-
-            String lngStr = String.valueOf(busStation.getLng());
-            String lngStr1 = String.format("%s.%s", lngStr.substring(0, 3), lngStr.substring(3));
-            double lng = Double.parseDouble(lngStr1);
-            MapPoint mapPoint = new MapPoint(lng, lat);
-            return new MapMarker(id, stationName, mapPoint);
-        }).collect(Collectors.toList());
-    }
-
     public List getTrailPath() {
         long userId = UserContext.getUser();
         List<GeoPoint> list = geoPointMapper.findByUserId(userId);
@@ -116,27 +67,43 @@ public class MapService {
         return List.of(map);
     }
 
+    /**
+     * 省市县三级联动数据
+     *
+     * @param
+     * @return
+     * @date 2025-08-12 16:41:41
+     */
+    public List<CascadeOption> getChinaCascade() {
+        if (!cascadeOptionList.isEmpty()) {
+            return cascadeOptionList;
+        }
+
+        loadChinaCascade();
+        return cascadeOptionList;
+    }
+
     private void loadChinaCascade() {
         cascadeOptionList.clear();
-        List<GeoChina> geoChinaList = geoChinaMapper.findAll();
-        Map<Integer, List<GeoChina>> groupMap = geoChinaList.stream().collect(Collectors.groupingBy(GeoChina::getPid));
+        List<GeoArea> geoChinaList = geoChinaMapper.findAllArea();
+        Map<Integer, List<GeoArea>> groupMap = geoChinaList.stream().collect(Collectors.groupingBy(GeoArea::getPid));
         int pid = 0;
-        List<GeoChina> level1 = groupMap.get(pid);
-        for (GeoChina  geoChina1 : level1) {
+        List<GeoArea> level1 = groupMap.get(pid);
+        for (GeoArea  geoChina1 : level1) {
             CascadeOption cascadeOption1 = new CascadeOption();
             cascadeOption1.setLabel(geoChina1.getName());
             cascadeOption1.setValue(geoChina1.getName());
 
             pid = geoChina1.getId();
-            List<GeoChina> level2 = groupMap.get(pid);
-            for (GeoChina geoChina2 : level2) {
+            List<GeoArea> level2 = groupMap.get(pid);
+            for (GeoArea geoChina2 : level2) {
                 CascadeOption cascadeOption2 = new CascadeOption();
                 cascadeOption2.setLabel(geoChina2.getName());
                 cascadeOption2.setValue(geoChina2.getName());
 
                 pid = geoChina2.getId();
-                List<GeoChina> level3 = groupMap.get(pid);
-                for (GeoChina geoChina3 : level3) {
+                List<GeoArea> level3 = groupMap.get(pid);
+                for (GeoArea geoChina3 : level3) {
                     CascadeOption cascadeOption3 = new CascadeOption();
                     cascadeOption3.setLabel(geoChina3.getName());
                     cascadeOption3.setValue(geoChina3.getName());
@@ -149,20 +116,4 @@ public class MapService {
             cascadeOptionList.add(cascadeOption1);
         }
     }
-
-    /**
-     * 省市县三级联动数据
-     *
-     * @param
-     * @return
-     * @date 2025-08-12 16:41:41
-     */
-    public List<CascadeOption> getChinaCascade() {
-        if (!cascadeOptionList.isEmpty()) {
-            return cascadeOptionList;
-        }
-
-        loadChinaCascade();
-        return cascadeOptionList;
-    }
 }

+ 21 - 5
content/content-service/src/main/resources/mapper/geo/GeoChinaMapper.xml

@@ -4,23 +4,30 @@
 <mapper namespace="cn.reghao.tnb.content.app.geo.db.mapper.GeoChinaMapper">
     <insert id="save" useGeneratedKeys="true" keyProperty="id">
         insert into geo_china
-        (`id`,`pid`,`deep`,`name`,`ext_name`,`geo`)
+        (`id`,`pid`,`deep`,`name`,`ext_path`,`geo`,`polygon`)
         values
-        (#{id},#{pid},#{deep},#{name},#{extName},point(#{longitude},#{latitude}))
+        (#{id},#{pid},#{deep},#{name},#{extPath},point(#{longitude},#{latitude}),GeomFromText('POLYGON((${polygon}))'))
     </insert>
+    <insert id="saveMultiPolygon" useGeneratedKeys="true" keyProperty="id">
+        insert into geo_china
+        (`id`,`pid`,`deep`,`name`,`ext_path`,`geo`,`polygon`)
+        values
+        (#{id},#{pid},#{deep},#{name},#{extPath},point(#{longitude},#{latitude}),GeomFromText('MULTIPOLYGON(${multiPolygon})'))
+    </insert>
+
     <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
         insert ignore into geo_china
-        (`id`,`pid`,`deep`,`name`,`ext_name`,`geo`)
+        (`id`,`pid`,`deep`,`name`,`ext_path`,`geo`,`polygon`)
         values
         <foreach collection="list" item="item" index="index" separator=",">
-        (#{item.id},#{item.pid},#{item.deep},#{item.name},#{item.extName},point(#{item.longitude},#{item.latitude}))
+        (#{item.id},#{item.pid},#{item.deep},#{item.name},#{item.extPath},point(#{item.longitude},#{item.latitude}))
         </foreach>
     </insert>
 
     <select id="findAll" resultType="cn.reghao.tnb.content.app.geo.model.po.GeoChina">
         select *
         from geo_china
-        limit 10000
+        limit 10
     </select>
     <select id="findById" resultType="cn.reghao.tnb.content.app.geo.model.po.GeoChina">
         select *
@@ -33,4 +40,13 @@
         where deep=#{deep}
         limit 1000
     </select>
+    <select id="findByPoint" resultType="cn.reghao.tnb.content.app.geo.model.po.GeoChina">
+        select *
+        from geo_china
+        where deep=2 and st_within(point(#{lng},#{lat}), polygon);
+    </select>
+    <select id="findAllArea" resultType="cn.reghao.tnb.content.app.geo.model.vo.GeoArea">
+        select id,pid,`name`
+        from geo_china
+    </select>
 </mapper>

+ 0 - 25
content/content-service/src/main/resources/mapper/geo/GeoPolygonMapper.xml

@@ -1,25 +0,0 @@
-<?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="cn.reghao.tnb.content.app.geo.db.mapper.GeoPolygonMapper">
-    <insert id="save" useGeneratedKeys="true" keyProperty="id">
-        insert into geo_polygon
-        (`id`,`polygon`)
-        values
-        (#{id},GeomFromText('POLYGON((${polygon}))'))
-    </insert>
-    <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
-        insert ignore into geo_polygon
-        (`id`,`polygon`)
-        values
-        <foreach collection="list" item="item" index="index" separator=",">
-        (#{item.id},GeomFromText('POLYGON((${item.polygon}))'))
-        </foreach>
-    </insert>
-
-    <select id="findByPoint" resultType="java.lang.Integer">
-        select id
-        from geo_polygon
-        where st_within(point(#{lng},#{lat}), polygon);
-    </select>
-</mapper>

+ 60 - 32
content/content-service/src/test/java/cn/reghao/tnb/content/app/geo/service/GeoTest.java

@@ -8,20 +8,15 @@ import cn.reghao.oss.sdk.model.dto.ObjectInfo;
 import cn.reghao.tnb.content.app.ContentApplication;
 import cn.reghao.tnb.content.app.geo.db.mapper.*;
 import cn.reghao.tnb.content.app.geo.model.po.*;
-import cn.reghao.tnb.content.app.geo.model.vo.GeoData;
 import cn.reghao.tnb.content.app.geo.model.vo.MapMarker;
 import cn.reghao.tnb.content.app.geo.model.vo.MapPoint;
-import cn.reghao.tnb.content.app.geo.service.MapService;
 import com.google.gson.JsonObject;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.ActiveProfiles;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
-import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -64,19 +59,25 @@ public class GeoTest {
         list.add(new GeoPoint(mapPointE, "最东"));
         list.add(new GeoPoint(mapPointW, "最西"));
         geoPointMapper.saveAll(list);*/
+
+        double lng = 104.061745;
+        double lat = 30.658669;
+        MapPoint mapPoint = new MapPoint(lng, lat);
+        GeoChina geoChina = geoChinaMapper.findByPoint(mapPoint);
+        if (geoChina != null) {
+            System.out.printf("%s -> %s\n", geoChina.getId(), geoChina.getExtPath());
+        }
     }
 
     @Autowired
     GeoChinaMapper geoChinaMapper;
-    @Autowired
-    GeoPolygonMapper geoPolygonMapper;
     @Test
-    public void geoPolygonTest() {
+    public void parseGeoData() {
         TextFile textFile = new TextFile();
-
         String filePath = "/home/reghao/Downloads/geo/ok_geo.csv";
         List<String> list = textFile.read(filePath);
-        Map<Integer, GeoData> map  = new HashMap<>();
+
+        System.out.println(list.get(0));
         for (int i = 1; i < list.size(); i++) {
             String line = list.get(i);
             String[] arr = line.split(",\"");
@@ -86,34 +87,61 @@ public class GeoTest {
                 continue;
             }
 
-            Integer id = Integer.parseInt(arr1[0]);
-            Integer pid = Integer.parseInt(arr1[1]);
-            Integer deep = Integer.parseInt(arr1[2]);
-            String name = arr[1].replace("\"", "");;
-            String extPath = arr[2].replace("\"", "");;
+            int id = Integer.parseInt(arr1[0]);
+            int pid = Integer.parseInt(arr1[1]);
+            int deep = Integer.parseInt(arr1[2]);
+
+            String name = arr[1].replace("\"", "");
+            String extPath = arr[2].replace("\"", "");
+
             String geo = arr[3];
             String[] geoArr = geo.replace("\"", "").split(" ");
-            BigDecimal lat = BigDecimal.valueOf(Double.parseDouble(geoArr[0]));
-            BigDecimal lng = BigDecimal.valueOf(Double.parseDouble(geoArr[1]));
+            double lat = Double.parseDouble(geoArr[0]);
+            double lng = Double.parseDouble(geoArr[1]);
             String polygon = arr[4].replace("\"", "");
-            String first = polygon.split(",")[0];
-            polygon += "," + first;
+            String[] polygonArr = polygon.split(";");
+            List<String> polygonStrList = new ArrayList<>();
+            if (polygonArr.length == 1) {
+                String polygonStr = getPolygonStr(polygonArr[0]);
+                polygonStrList.add(polygonStr);
+            } else {
+                for (String polygonLine : polygonArr) {
+                    String polygonStr = getPolygonStr(polygonLine);
+                    polygonStrList.add(polygonStr);
+                }
+            }
 
-            GeoPolygon geoPolygon = new GeoPolygon(id, polygon);
-            GeoChina geoChina = new GeoChina(id, pid, deep, name, extPath, lat, lng);
-            GeoData geoData = new GeoData(geoChina, geoPolygon);
-            map.put(id, geoData);
+            GeoChina geoChina = new GeoChina(id, pid, deep, name, extPath, lng, lat);
+            GeoChina geoChina0 = geoChinaMapper.findById(id);
+            if (geoChina0 == null) {
+                try {
+                    if (polygonStrList.size() == 1) {
+                        geoChina.setPolygon(polygonStrList.get(0));
+
+                        geoChinaMapper.save(geoChina);
+                    } else {
+                        StringBuilder sb = new StringBuilder();
+                        for (String str : polygonStrList) {
+                            sb.append("((").append(str).append(")),");
+                        }
+                        String multiPolygon = sb.toString();
+                        int idx = multiPolygon.lastIndexOf(",");
+                        multiPolygon = multiPolygon.substring(0, idx);
+                        geoChina.setMultiPolygon(multiPolygon);
+
+                        geoChinaMapper.saveMultiPolygon(geoChina);
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    System.out.println();
+                }
+            }
         }
+    }
 
-        map.forEach((id, geoData) -> {
-            GeoPolygon geoPolygon = geoData.getGeoPolygon();
-            GeoChina geoChina = geoData.getGeoChina();
-            GeoChina geoChina1 = geoChinaMapper.findById(id);
-            if (geoChina1 == null) {
-                geoChina1 = geoChina;
-            }
-            mapService.add(geoChina1, geoPolygon);
-        });
+    private String getPolygonStr(String polygonStr) {
+        String first = polygonStr.split(",")[0];
+        return polygonStr + ("," + first);
     }
 
     private String getEarthPolygon(String polygon) {