Administrator il y a 2 ans
Parent
commit
b943bda4be

+ 4 - 2
src/main/java/com/sysu/admin/api/crop/ApiLandController.java

@@ -1,10 +1,12 @@
 package com.sysu.admin.api.crop;
 
 import com.sysu.admin.controller.aland.LandService;
+import com.sysu.admin.site.CommonVo;
 import com.sysu.admin.support.base.BaseComponent;
 import com.xiesx.fastboot.base.result.BaseResult;
 import com.xiesx.fastboot.base.result.R;
 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;
 
@@ -21,8 +23,8 @@ public class ApiLandController extends BaseComponent {
     }
 
     @RequestMapping("/crop_area_stat")
-    public BaseResult getCropAreaStat(){
-        return R.succ(landService.getCropAreaStat());
+    public BaseResult getCropAreaStat(@RequestBody CommonVo commonVo){
+        return R.succ(landService.getCropAreaStat(commonVo.getDistrict(),commonVo.getTown()));
     }
 
 }

+ 12 - 0
src/main/java/com/sysu/admin/controller/aland/CropAreaStat.java

@@ -6,4 +6,16 @@ import lombok.Data;
 public class CropAreaStat {
     private String name;
     private Double area;
+
+    static  String[] names = {"corn","rice","other"};
+    static  String[] name2s = {"玉米","水稻","其他"};
+
+    public static String cast(String name){
+        for(int i=0;i<names.length;i++){
+            if(names[i].equals(name)){
+                return name2s[i];
+            }
+        }
+        return "";
+    }
 }

+ 52 - 107
src/main/java/com/sysu/admin/controller/aland/Land.java

@@ -18,25 +18,32 @@ import java.util.Date;
 @Accessors(chain = true)
 @EqualsAndHashCode(callSuper = false)
 @FieldNameConstants(innerTypeName = "FIELDS")
-@Table(name = "p_a_crop")
+@Table(name = "leizhou_land")
 @Entity
 @DynamicInsert
 @DynamicUpdate
 public class Land {
 
+    /*
+字段信息:value——潜在产值(元)
+area_ha——地块面积(公顷)
+MAJORITY——种植强度
+crop_type——作物类别
+id_card——身份证
+name——姓名
+aspect——坡向
+slope——坡度
+gdp_pop——人均gdp
+hupo——离水源距离
+shengdao——离道路距离
+quxian——离城市中心距离
+TOC——土壤有机质
+Area——面积(平方米)
+     */
+
     public Land(){
     }
 
-    public Land(Long id, Integer cropType, Integer growingPeriod, Integer confirm, Integer district, String name, String address, String desc) {
-        this.id = id;
-        this.cropType = cropType;
-        this.growingPeriod = growingPeriod;
-        this.confirm = confirm;
-        this.district = district;
-        this.name = name;
-        this.address = address;
-        this.desc = desc;
-    }
 
     /**
      * 主键
@@ -45,117 +52,55 @@ public class Land {
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
-    /**
-     * [{"filter":0,"title":"其他","fill":"#6E7F85","opacity":0.8},
-     * {"filter":1,"title":"湿地","fill":"#7B9CFB","opacity":0.8},
-     * {"filter":2,"title":"耕地","fill":"#979B49","opacity":0.8},
-     * {"filter":3,"title":"园地","fill":"#E99209","opacity":0.8},
-     * {"filter":4,"title":"林地","fill":"#182F13","opacity":0.8},
-     * {"filter":5,"title":"草地","fill":"#307913","opacity":0.8},
-     * {"filter":6,"title":"水域","fill":"#0D53AF","opacity":0.8}]
-     */
-    @Column(name = "gridcode")
-    private Long gridcode;
-
-    @JSONField(serialize = false)
-    @Column(columnDefinition = "geom")
-    private MultiPolygon geom;
 
-    @JSONField(serialize = false)
-    @Column(columnDefinition = "center_point")
-    private Point centerPoint;
-
-    @Transient
-    private String wkt;
-    @Transient
-    private String geojson;
-    /**
-     * 耕地类型
-     */
     @Column
-    private Integer cropType;
-    /**
-     * 生长期
-     */
+    private Double area;
     @Column
-    private Integer growingPeriod;
-
+    private Double simpgnflag;
 
-    /**
-     * 采集经度
-     */
     @Column
-    private Double pickLongitude;
+    private Double toc;
 
-    /**
-     * 采集纬度
-     */
     @Column
-    private Double pickLatitude;
-
-    /**
-     * 产量
-     */
+    private Double quxian;
     @Column
-    private Integer yield;
-
-    @Column(nullable = false)
-    private Date createDate;
-
-    @Column(nullable = false)
-    private Date updateDate;
-
-    @Column(nullable = false)
-    private Date receiveDate;
-
-    @Column(nullable = false)
-    private Long receiver;
-
-    @Column(nullable = false)
-    private Date pickDate;
-
-    /**
-     * 创建人
-     */
-    @Column( nullable = false)
-    private Long creator;
-
-    /**
-     */
-    @Column(nullable = false)
-    private Long executor;
-
-    /**
-     * 状态
-     */
+    private Double shengdao;
+    @Column
+    private Double hupo;
+    @Column
+    private Double gdp_pop;
     @Column
-    private Integer status;
+    private Double slope;
+    @Column
+    private Double aspect;
+    @Column
+    private String name;
+    @Column
+    private String id_card;
+    @Column
+    private String crop_type;
+    @Column
+    private Double area_ha;
 
     @Column
-    private Integer confirm;
+    private Double value;
+    @Column
+    private Integer fid_1;
+    @Column
+    private Integer inpoly_f_1;
+    @Column
+    private Integer majority;
 
-    /**
-     * 描述
-     */
-    @Column(name = "\"desc\"")
-    private String desc;
+    @JSONField(serialize = false)
+    @Column(columnDefinition = "geom")
+    private MultiPolygon geom;
 
     @Transient
-    private CropImage fay;
-    @Transient
-    private CropImage center;
+    private String wkt;
     @Transient
-    private CropImage near;
+    private String geojson;
+
+
 
-    @Column
-    private Integer province;
-    @Column
-    private Integer city;
-    @Column
-    private Integer district;
-    @Column
-    private String name;
-    @Column
-    private String address;
 
 }

+ 9 - 0
src/main/java/com/sysu/admin/controller/aland/LandRepository.java

@@ -1,7 +1,16 @@
 package com.sysu.admin.controller.aland;
 
 import com.xiesx.fastboot.core.jpa.JpaPlusRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
 
 public interface LandRepository extends JpaPlusRepository<Land, Long> {
 
+    @Query(value = "select crop_type,sum(area) from  leizhou_land  group by crop_type",nativeQuery = true)
+    List<Object[]> statAll();
+
+    @Query(value = "select crop_type,sum(area) from  leizhou_land where St_within(geom,st_geomfromtext(?1,4326)) group by crop_type",nativeQuery = true)
+    List<Object[]> stat(String wkt);
+
 }

+ 29 - 6
src/main/java/com/sysu/admin/controller/aland/LandService.java

@@ -1,8 +1,13 @@
 package com.sysu.admin.controller.aland;
 
+import com.sysu.admin.controller.city.CityRepository;
+import com.sysu.admin.controller.city.DistrictRepository;
+import com.sysu.admin.controller.city.Town;
+import com.sysu.admin.controller.city.TownRepository;
 import com.sysu.admin.support.base.BaseService;
 import com.sysu.admin.support.system.config.SConfig;
 import com.xiesx.fastboot.core.jpa.JpaPlusRepository;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -13,6 +18,12 @@ import java.util.List;
 public class LandService extends BaseService<Land,Long> {
     @Autowired
     LandRepository landRepository;
+    @Autowired
+    TownRepository townRepository;
+    @Autowired
+    DistrictRepository districtRepository;
+    @Autowired
+    CityRepository cityRepository;
 
 
     public List<LandAreaStat> getLandAreaStat(){
@@ -39,13 +50,25 @@ public class LandService extends BaseService<Land,Long> {
         return cropAreaStat;
     }
 
-    public List<CropAreaStat> getCropAreaStat() {
+    public List<CropAreaStat> getCropAreaStat(String district, Integer townId) {
         List<CropAreaStat> list = new ArrayList<>();
-        list.add(toCropAreaStat("rice_area_stat"));
-        list.add(toCropAreaStat("maize_area_stat"));
-        list.add(toCropAreaStat("potato_area_stat"));
-        list.add(toCropAreaStat("sweet_potato_area_stat"));
-        list.add(toCropAreaStat("sorghum_area_stat"));
+        List<Object[]> res = null;
+        if(townId != null) {
+            String wkt = townRepository.findWktById(townId);
+            res = landRepository.stat(wkt);
+        }else if(StringUtils.isNotBlank(district)) {
+            String wkt = districtRepository.findWktByCode(district);
+            res = landRepository.stat(wkt);
+        }else{
+            res =landRepository.statAll();
+        }
+        res.stream().forEach(o -> {
+            Double area = (Double)o[1];
+            CropAreaStat cropAreaStat = new CropAreaStat();
+            cropAreaStat.setName(CropAreaStat.cast(o[0].toString()));
+            cropAreaStat.setArea((area + area / 2) / 1000);
+            list.add(cropAreaStat);
+        });
         return list;
     }
 

+ 4 - 0
src/main/java/com/sysu/admin/controller/city/CityRepository.java

@@ -10,4 +10,8 @@ public interface CityRepository extends JpaPlusRepository<City, Integer> {
 
     @Query(value = "Select new City(p.name,p.code) from City p where p.code like ?1 ")
     List<City> findListByCode(String likeCode);
+
+    @Query(value = "select st_astext(geom) from p_city where code = ?1" ,nativeQuery = true)
+    String findWktByCode(String code);
+
 }

+ 3 - 0
src/main/java/com/sysu/admin/controller/city/DistrictRepository.java

@@ -16,4 +16,7 @@ public interface DistrictRepository extends JpaPlusRepository<District, Integer>
     @Query(value = "Select new District(p.name,p.code) from District p where p.code like ?1 ")
     List<District> findList(String likeCode);
 
+    @Query(value = "select st_astext(geom) from p_district where code = ?1" ,nativeQuery = true)
+    String findWktByCode(String code);
+
 }

+ 3 - 0
src/main/java/com/sysu/admin/controller/city/TownRepository.java

@@ -11,4 +11,7 @@ public interface TownRepository extends JpaPlusRepository<Town, Integer> {
     @Query(value = "Select new Town(p.name,p.id) from Town p where p.districtCode = ?1 ")
     List<Town> findList(String districtCode);
 
+    @Query(value = "select st_astext(geom) from p_town where id = ?1" ,nativeQuery = true)
+    String findWktById(Integer id);
+
 }

+ 3 - 0
src/main/java/com/sysu/admin/site/CommonVo.java

@@ -13,4 +13,7 @@ public class CommonVo {
     private Double y2;
     private String tableNames;
     private String status;
+    private String city;
+    private String district;
+    private Integer town;
 }

+ 64 - 6
src/main/java/com/sysu/admin/utils/shape/ShapeReader.java

@@ -6,11 +6,13 @@ import org.geotools.data.store.ContentFeatureSource;
 import org.geotools.feature.FeatureIterator;
 import org.locationtech.jts.geom.Geometry;
 import org.opengis.feature.simple.SimpleFeature;
+import org.opengis.feature.simple.SimpleFeatureType;
+import org.opengis.feature.type.AttributeType;
 
 import java.io.File;
 import java.nio.charset.Charset;
 import java.util.*;
- 
+
 /**
  * @program: commons
  * @description: 读取Shp文件
@@ -18,7 +20,7 @@ import java.util.*;
  * @create: 2018-09-19 15:26
  **/
 public class ShapeReader {
- 
+
 //    public ArrayList<Map> readShapeFile(String filePath) {
 //        ArrayList<Map> modelList = new ArrayList<>();
 //        File folder = new File(filePath);
@@ -54,19 +56,22 @@ public class ShapeReader {
 //        }
 //        return modelList;
 //    }
- 
+
     public static List<String> getShapeFile(File file) throws Exception {
- 
+
         List<String> list = new ArrayList<>();
 
         ShapefileDataStore shpDataStore = null;
         shpDataStore = new ShapefileDataStore(file.toURL());
         //设置编码
         Charset charset = Charset.forName("GBK");
+
         shpDataStore.setCharset(charset);
         String typeName = shpDataStore.getTypeNames()[0];
         ContentFeatureSource featureSource = null;
         featureSource =  shpDataStore.getFeatureSource (typeName);
+
+
         ContentFeatureCollection result = featureSource.getFeatures();
         FeatureIterator<SimpleFeature> itertor = result.features();
         while (itertor.hasNext()) {
@@ -76,6 +81,59 @@ public class ShapeReader {
         return list;
     }
 
+    public static List<Map<String, Object>> getShapeFileLeizhou(File file) throws Exception {
+        List<Map<String, Object>> list = new ArrayList<>();
+        ShapefileDataStore shpDataStore = null;
+        shpDataStore = new ShapefileDataStore(file.toURL());
+        //设置编码
+        Charset charset = Charset.forName("UTF-8");
+        shpDataStore.setCharset(charset);
+        String typeName = shpDataStore.getTypeNames()[0];
+        ContentFeatureSource featureSource = null;
+        featureSource =  shpDataStore.getFeatureSource (typeName);
+        ContentFeatureCollection result = featureSource.getFeatures();
+        List<AttributeType> attributeTypes = result.getSchema().getTypes();
+        FeatureIterator<SimpleFeature> itertor = result.features();
+        for(AttributeType attributeType : attributeTypes){
+            System.out.print(attributeType.getName());
+            System.out.print(",");
+        }
+        while (itertor.hasNext()) {
+            SimpleFeature feature = itertor.next();
+
+            Map<String, Object> map = new HashMap<>();
+            addValue(map, feature, "InPoly_F_1");
+            System.out.println();
+            System.out.println(map.get("inpoly_f_1"));
+            addValue(map, feature, "Area");
+            addValue(map, feature, "SimPgnFlag");
+            addValue(map, feature, "TOC");
+            addValue(map, feature, "quxian");
+            addValue(map, feature, "shengdao");
+            addValue(map, feature, "hupo");
+            addValue(map, feature, "gdp_pop");
+            addValue(map, feature, "slope");
+            addValue(map, feature, "aspect");
+            addValue(map, feature, "name");
+            addValue(map, feature, "id_card");
+            addValue(map, feature, "crop_type");
+            addValue(map, feature, "area_ha");
+            addValue(map, feature, "value");
+            addValue(map, feature, "MAJORITY");
+            map.put("geom",GeoCastUtil.geomToWkt((Geometry)feature.getDefaultGeometry()));
+            list.add(map);
+        }
+        return list;
+    }
+
+    public static void addValue(Map<String,Object> map, SimpleFeature feature, String key){
+        Object val = feature.getAttribute(key);
+        if(val == null){
+            val = feature.getProperty(key);
+        }
+        map.put(key.toLowerCase(), val);
+    }
+
+
 
- 
-}
+}

+ 1 - 1
src/main/resources/application.yml

@@ -7,7 +7,7 @@ jsp-servlet:
 spring:
   profiles:
     # 激活:本地 dev、后台 adm。服务api
-    active: adm
+    active: dev
   mvc:
     view:
       prefix: /WEB-INF/jsp/

+ 72 - 5
src/test/java/com/sysu/admin/utils/shape/postgis/PostGisUtilTest.java

@@ -16,12 +16,13 @@ import org.springframework.test.context.junit4.SpringRunner;
 import javax.persistence.EntityManager;
 import java.io.*;
 import java.util.List;
+import java.util.Map;
 
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes = MarkApplication.class)
-public class PostGisUtilTest extends BaseTest {
+//@RunWith(SpringRunner.class)
+//@SpringBootTest(classes = MarkApplication.class)
+public class PostGisUtilTest {
 
-    static String sourceDir = "D:\\BaiduNetdiskDownload\\merge\\merge";
+    static String sourceDir = "D:\\BaiduNetdiskDownload\\merge\\leizhou";
     static String outputDir = "D:";
     static String tablesString = "banan,beibei,bishan,changshou,chengkou,dadukou,dazu,dianjiang,fengdu,fengjie,fuling,hechuan,jiangbei,jiangjin,jiulongpo,kaizhou,liangping,nanan,nanchuan,pengshui,qianjiang,qijiang,qiuyang,rongchang,shapingba,shizhu,tongliang,tongnan,wanzhou,wulong,wushan,wuxi,xiushan,yongchuan,yubei,yunyang,yuzhong,zhong";
 
@@ -117,6 +118,72 @@ public class PostGisUtilTest extends BaseTest {
         }
     }
 
+
+    @Test
+    public void testInsertShpLeizhou() {
+        File shpDir = new File(sourceDir);
+        File[] shpList = shpDir.listFiles((dir, name) -> {
+            if(name.endsWith("shp")){
+                return true;
+            }
+            return false;
+        });
+
+        try {
+            FileWriter fileWriter = new FileWriter(new File(outputDir,"insert.sql"));
+            for(File shp : shpList) {
+                List<Map<String,Object>> list = ShapeReader.getShapeFileLeizhou(shp);
+                System.out.println("数据准备:");
+                System.out.println(list.size());
+                getInsertSqlsLeizhou(fileWriter, "leizhou_parcel_out0209", list);
+            }
+
+            fileWriter.flush();
+            fileWriter.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @SneakyThrows
+    public void getInsertSqlsLeizhou(FileWriter fileWriter,String typeName, List<Map<String, Object>> list){
+        int i=0;
+        int c = 100;
+        while(i < list.size()) {
+            if(i % c == 0) {
+                fileWriter.append("insert into " + typeName + "(inpoly_f_1,area,simpgnflag,toc,quxian,shengdao,hupo,gdp_pop,slope,aspect,name,id_card,crop_type,area_ha,value,majority,geom) values");
+            }
+            Map<String, Object> map = list.get(i);
+            fileWriter.append(" ('"+map.get("inpoly_f_1")+"',");
+            fileWriter.append("'"+map.get("area")+"',");
+            fileWriter.append("'"+map.get("simpgnflag")+"',");
+            fileWriter.append("'"+map.get("toc")+"',");
+            fileWriter.append("'"+map.get("quxian")+"',");
+            fileWriter.append("'"+map.get("shengdao")+"',");
+            fileWriter.append("'"+map.get("hupo")+"',");
+            fileWriter.append("'"+map.get("gdp_pop")+"',");
+            fileWriter.append("'"+map.get("slope")+"',");
+            fileWriter.append("'"+map.get("aspect")+"',");
+            fileWriter.append("'"+map.get("name")+"',");
+            fileWriter.append("'"+map.get("id_card")+"',");
+            fileWriter.append("'"+map.get("crop_type")+"',");
+            fileWriter.append("'"+map.get("area_ha")+"',");
+            fileWriter.append("'"+map.get("value")+"',");
+            fileWriter.append("'"+map.get("majority")+"',");
+            fileWriter.append("st_geomfromtext('");
+            fileWriter.append(map.get("geom").toString());
+            fileWriter.append("',4326))");
+
+            if(i % c < (c-1) && i < list.size() - 1){
+                fileWriter.append(",");
+            }else{
+                fileWriter.append(";");
+                fileWriter.append("\n");
+            }
+            i++;
+        }
+    }
+
     public void updateCity(){
         for(String tableName : getTableNames()){
             System.out.println("update "+ tableName + " t1 set province =500000,city = 500100, district = t2.code from p_land_range_index t2 where t2.table_name = '"+tableName+"';");
@@ -177,4 +244,4 @@ public class PostGisUtilTest extends BaseTest {
 
 
 
-}
+}