Administrator vor 2 Jahren
Ursprung
Commit
778950d2ee

+ 85 - 5
src/main/java/com/sysu/admin/api/crop/CropClassController.java

@@ -1,15 +1,24 @@
 package com.sysu.admin.api.crop;
 
+import com.sysu.admin.controller.crop.class_item.CropClassItem;
 import com.sysu.admin.controller.crop.class_item.CropClassItemRepository;
+import com.sysu.admin.controller.crop.class_item_period.CropClassItemPeriod;
 import com.sysu.admin.controller.crop.class_item_period.CropClassItemPeriodRepository;
+import com.sysu.admin.controller.crop.clazz.CropClass;
 import com.sysu.admin.controller.crop.clazz.CropClassRepository;
+import com.sysu.admin.controller.crop.period.CropPeriod;
 import com.sysu.admin.controller.crop.period.CropPeriodRepository;
 import com.xiesx.fastboot.base.result.BaseResult;
 import com.xiesx.fastboot.base.result.R;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 @RequestMapping("/api/crop_class")
 @RestController
 public class CropClassController {
@@ -25,10 +34,81 @@ public class CropClassController {
 
     @RequestMapping("/list")
     public BaseResult list(){
-        cropClassRepository.findAll();
-        cropClassItemRepository.findAll();
-        cropPeriodRepository.findAll();
-        cropClassItemPeriodRepository.findAll();
-        return R.succ();
+        List<CropClass> cropClassList = cropClassRepository.findAll(Sort.by(CropClass.FIELDS.id));
+        List<CropClassItem> cropClassItemList = cropClassItemRepository.findAll(Sort.by(CropClassItem.FIELDS.classId));
+        setItems(cropClassList, cropClassItemList);
+
+        List<CropClassItemPeriod> cropClassItemPeriods = cropClassItemPeriodRepository.findAllOrderByCropItemId();
+        CropPeriod[] cropPeriodArray = cropPeriodRepository.findAll(Sort.by(CropPeriod.FIELDS.id)).toArray(new CropPeriod[0]);
+        cropClassItemList.sort((o1, o2) -> {
+            return o1.getId().compareTo(o2.getId());
+        });
+        setPeriods(cropClassItemList, cropClassItemPeriods, cropPeriodArray);
+        return R.succ(cropClassList);
+    }
+
+    private CropPeriod getPeriod(CropPeriod cropPeriod, CropPeriod[] cropPeriodArray){
+        return cropPeriodArray[Arrays.binarySearch(cropPeriodArray, cropPeriod, (o1, o2) -> {
+            return o1.getId().compareTo(o2.getId());
+        })];
+    }
+
+    private void setPeriods(List<CropClassItem> cropClassItemList, List<CropClassItemPeriod> cropClassItemPeriods, CropPeriod[] cropPeriodArray){
+        int i = 0;
+        for(CropClassItem cropClassItem : cropClassItemList) {
+            List<CropPeriod> periods = new ArrayList<>();
+            while (i < cropClassItemPeriods.size()) {
+                CropClassItemPeriod cropClassItemPeriod = cropClassItemPeriods.get(i);
+                if (cropClassItemPeriod.getPk().cropItemId() > cropClassItem.getId()) {
+                    break;
+                }
+                if (cropClassItemPeriod.getPk().cropItemId().equals(cropClassItem.getId())) {
+                    periods.add(getPeriod(new CropPeriod().setId(cropClassItemPeriod.getPk().periodId()), cropPeriodArray));
+                }
+                i++;
+            }
+            cropClassItem.setPeriods(periods);
+        }
+    }
+
+    private void setItems(List<CropClass> cropClassList, List<CropClassItem> cropClassItemList){
+        int i = 0;
+        for(CropClass cropClass : cropClassList){
+            List<CropClassItem> items = new ArrayList<>();
+            while (i < cropClassItemList.size()){
+                CropClassItem cropClassItem = cropClassItemList.get(i);
+                if(cropClassItem.getClassId() > cropClass.getId()){
+                    break;
+                }
+                if(cropClassItem.getClassId().equals(cropClass.getId())){
+                    items.add(cropClassItem);
+                }
+                i++;
+            }
+            cropClass.setItems(items);
+        }
     }
 }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 35 - 0
src/main/java/com/sysu/admin/api/crop/CropController.java

@@ -0,0 +1,35 @@
+package com.sysu.admin.api.crop;
+
+import com.alibaba.fastjson.JSON;
+import com.sysu.admin.controller.geo.CityLand;
+import com.sysu.admin.controller.geo.CityLandService;
+import com.sysu.admin.utils.shape.GeoCastUtil;
+import com.xiesx.fastboot.base.result.BaseResult;
+import com.xiesx.fastboot.base.result.R;
+import org.opengis.referencing.FactoryException;
+import org.opengis.referencing.operation.TransformException;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+@RequestMapping("/api/crop")
+@RestController
+public class CropController {
+    @Autowired
+    CityLandService cityLandService;
+
+    @RequestMapping("/list")
+    public BaseResult list(@RequestBody String data) throws FactoryException, TransformException {
+        CropVo vo = JSON.parseObject(data, CropVo.class);
+        List<CityLand> cityLandList = cityLandService.findByBuffer(vo.getPoint(),vo.getMeter());
+        cityLandList.stream().forEach(cityLand -> {
+            cityLand.setWkt(GeoCastUtil.geomToWkt(cityLand.getGeom()));
+        });
+        return R.succ(cityLandList);
+    }
+
+
+
+}

+ 9 - 0
src/main/java/com/sysu/admin/api/crop/CropVo.java

@@ -0,0 +1,9 @@
+package com.sysu.admin.api.crop;
+
+import lombok.Data;
+
+@Data
+public class CropVo {
+    private Double[] point;
+    private Integer meter;
+}

+ 0 - 1
src/main/java/com/sysu/admin/controller/crop/class_item/CropClassItem.java

@@ -7,7 +7,6 @@ import lombok.experimental.Accessors;
 import lombok.experimental.FieldNameConstants;
 import org.hibernate.annotations.DynamicInsert;
 import org.hibernate.annotations.DynamicUpdate;
-
 import javax.persistence.*;
 import java.util.List;
 

+ 4 - 0
src/main/java/com/sysu/admin/controller/crop/class_item_period/CropClassItemPeriodRepository.java

@@ -8,15 +8,19 @@ import lombok.experimental.Accessors;
 import lombok.experimental.FieldNameConstants;
 import org.hibernate.annotations.DynamicInsert;
 import org.hibernate.annotations.DynamicUpdate;
+import org.springframework.data.jpa.repository.Query;
 
 import javax.persistence.EmbeddedId;
 import javax.persistence.Entity;
 import javax.persistence.Table;
+import java.util.List;
 
 /**
  * 作物类别条目 与 生长周期关联表
  */
 public interface CropClassItemPeriodRepository extends JpaPlusRepository<CropClassItemPeriod, PKRP> {
 
+    @Query(value = "select * from p_crop_class_item_period order by crop_item_id",nativeQuery = true)
+    List<CropClassItemPeriod> findAllOrderByCropItemId();
 
 }

+ 4 - 0
src/main/java/com/sysu/admin/controller/crop/clazz/CropClass.java

@@ -1,5 +1,6 @@
 package com.sysu.admin.controller.crop.clazz;
 
+import com.alibaba.fastjson.annotation.JSONField;
 import com.sysu.admin.controller.crop.class_item.CropClassItem;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -25,11 +26,14 @@ import java.util.List;
 public class CropClass {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @JSONField(ordinal = 0)
     private Integer id;
 
     @Column()
+    @JSONField(ordinal = 1)
     private String name;
 
+    @JSONField(ordinal = 2)
     @Transient
     private List<CropClassItem> items;
 

+ 7 - 1
src/main/java/com/sysu/admin/controller/geo/CityLandRepository.java

@@ -10,6 +10,12 @@ public interface CityLandRepository extends JpaPlusRepository<CityLand, Long> {
 
 
     @Query(value = "SELECT * FROM \"p_crop\" where St_within(st_geomfromtext(?1), geom) limit 1", nativeQuery = true)
-    CityLand findIdByPoint(String pointWKT);
+    CityLand findByPoint(String pointWKT);
+
+
+    @Query(value = "SELECT * from \"p_crop\" where St_Intersects(geom," +
+            " ST_Buffer(st_geomfromtext(?1),?2, 'quad_segs=8')" +
+            ");",nativeQuery = true)
+    List<CityLand> findByBuffer(String pointWKT, Double degree);
 
 }

+ 11 - 4
src/main/java/com/sysu/admin/controller/geo/CityLandService.java

@@ -1,19 +1,26 @@
 package com.sysu.admin.controller.geo;
 
 import com.sysu.admin.support.base.BaseService;
+import com.sysu.admin.utils.shape.GeoCastUtil;
 import com.xiesx.fastboot.core.jpa.JpaPlusRepository;
-import com.xiesx.fastboot.core.jpa.annotation.TargetDataSource;
-import com.xiesx.fastboot.core.jpa.cfg.DataSourceEnum;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.Point;
+import org.locationtech.jts.operation.buffer.BufferOp;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 @Service
 public class CityLandService extends BaseService<CityLand, Long> {
 
 
+    public List<CityLand> findByBuffer(Double[] point, Integer meter){
+        double degree = meter / (2 * Math.PI * 6371004) * 360;
+        return mCityLandRepository.findByBuffer("Point("+point[0]+" "+point[1]+")",degree);
+    }
 
     public CityLand findByPoint(double x, double y){
-        CityLand cityLand = mCityLandRepository.findIdByPoint("Point("+x+" "+y+")");
+        CityLand cityLand = mCityLandRepository.findByPoint("Point("+x+" "+y+")");
         return cityLand;
     }
 

+ 61 - 0
src/main/java/com/sysu/admin/utils/shape/GeoCastUtil.java

@@ -1,14 +1,23 @@
 package com.sysu.admin.utils.shape;
 
 import org.geotools.geojson.geom.GeometryJSON;
+import org.geotools.geometry.jts.JTS;
 import org.geotools.geometry.jts.WKTReader2;
 import org.geotools.geometry.jts.WKTWriter2;
+import org.geotools.referencing.CRS;
+import org.geotools.referencing.crs.DefaultGeographicCRS;
 import org.locationtech.jts.geom.*;
 import org.locationtech.jts.io.ParseException;
 import org.opengis.feature.type.GeometryDescriptor;
+import org.opengis.referencing.FactoryException;
+import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.opengis.referencing.operation.MathTransform;
+import org.opengis.referencing.operation.TransformException;
 
 import java.io.IOException;
 import java.io.StringReader;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
 
 public class GeoCastUtil {
 
@@ -82,4 +91,56 @@ public class GeoCastUtil {
         return null;
     }
 
+    public static Double[] lonlatToMactor(Double[] point){
+        CoordinateReferenceSystem crsTarget = null;
+        // 投影转换
+        MathTransform transform = null;
+        try {
+            crsTarget = CRS.decode("EPSG:3857");
+            transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, crsTarget);
+        } catch (FactoryException e) {
+            e.printStackTrace();
+        }
+        Coordinate sourcePoint = new Coordinate(point[0],point[1]);
+        Coordinate targetPoint = new Coordinate();
+        try {
+            JTS.transform(sourcePoint, targetPoint, transform);
+        } catch (TransformException e) {
+            e.printStackTrace();
+        }
+        return new Double[]{targetPoint.getX(), targetPoint.getY()};
+    }
+
+    public static Double[] mactorToLonlat(Double[] point){
+        CoordinateReferenceSystem srcTarget = null;
+        // 投影转换
+        MathTransform transform = null;
+        try {
+            srcTarget = CRS.decode("EPSG:3857");
+            transform = CRS.findMathTransform(srcTarget, DefaultGeographicCRS.WGS84);
+        } catch (FactoryException e) {
+            e.printStackTrace();
+        }
+        Coordinate sourcePoint = new Coordinate(point[0],point[1]);
+        Coordinate targetPoint = new Coordinate();
+        try {
+            JTS.transform(sourcePoint, targetPoint, transform);
+        } catch (TransformException e) {
+            e.printStackTrace();
+        }
+        return new Double[]{targetPoint.getX(),targetPoint.getY()};
+    }
+
+//    public static double toFlex(double d){
+//        BigDecimal bd = new BigDecimal(d);
+//        String s = bd.toPlainString();
+//        int index = s.indexOf(".");
+//        String last = s.substring(index + 1);
+//        if(last.length() > 4){
+//            last = last.substring(0,4);
+//        }
+//        return Double.parseDouble(s.substring(0,index + 1) + last);
+//    }
+
+
 }

+ 1 - 1
src/test/java/CropClassPeriodExcelListener.java

@@ -49,7 +49,7 @@ public class CropClassPeriodExcelListener extends AnalysisEventListener<CropClas
         for(String period : periods){
             if(StringUtils.isNotBlank(period)){
                 CropPeriod cropPeriod = getCropPeriod(period);
-                PKRP pkrp = new PKRP().cropItemId(cropClassItem.getClassId()).periodId(cropPeriod.getId());
+                PKRP pkrp = new PKRP().cropItemId(cropClassItem.getId()).periodId(cropPeriod.getId());
                 CropClassItemPeriod cropClassItemPeriod = new CropClassItemPeriod().setPk(pkrp);
                 cropClassItemPeriodRepository.saveAndFlush(cropClassItemPeriod);
             }