Administrator 2 年之前
父节点
当前提交
5ba12e53cf
共有 21 个文件被更改,包括 481 次插入51 次删除
  1. 3 0
      src/main/java/com/sysu/admin/controller/city/City.java
  2. 20 5
      src/main/java/com/sysu/admin/controller/city/CityController.java
  3. 6 0
      src/main/java/com/sysu/admin/controller/city/District.java
  4. 3 0
      src/main/java/com/sysu/admin/controller/city/Province.java
  5. 19 3
      src/main/java/com/sysu/admin/controller/crop/CropLandService.java
  6. 29 0
      src/main/java/com/sysu/admin/controller/crop/range/AutoTableNameInterceptor.java
  7. 34 0
      src/main/java/com/sysu/admin/controller/crop/range/LandRangeIndex.java
  8. 34 0
      src/main/java/com/sysu/admin/controller/crop/range/LandRangeIndexController.java
  9. 26 0
      src/main/java/com/sysu/admin/controller/crop/range/LandRangeIndexRepository.java
  10. 58 0
      src/main/java/com/sysu/admin/controller/crop/range/LandRangeIndexService.java
  11. 27 0
      src/main/java/com/sysu/admin/controller/crop/range/PKRP.java
  12. 4 0
      src/main/resources/application-adm.yml
  13. 8 2
      src/main/resources/application-dev.yml
  14. 12 15
      src/main/webapp/WEB-INF/jsp/comm/admin2.jsp
  15. 48 1
      src/main/webapp/static/js/city-picker/city-picker.data.js
  16. 17 5
      src/main/webapp/static/package/city.js
  17. 28 17
      src/main/webapp/static/package/cityland.js
  18. 51 0
      src/main/webapp/static/package/geo_server_context.js
  19. 34 0
      src/test/java/com/sysu/admin/controller/crop/CropLandServiceTest.java
  20. 2 1
      src/test/java/com/sysu/admin/utils/shape/postgis/Main.java
  21. 18 2
      src/test/java/com/sysu/admin/utils/shape/postgis/PostGisUtilTest.java

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

@@ -29,6 +29,9 @@ public class City{
     @Column(columnDefinition = "geom")
     private MultiPolygon geom;
 
+    @Transient
+    private String wkt;
+
     @Column()
     private String name;
 

+ 20 - 5
src/main/java/com/sysu/admin/controller/city/CityController.java

@@ -1,5 +1,6 @@
 package com.sysu.admin.controller.city;
 
+import com.sysu.admin.controller.crop.range.LandRangeIndexService;
 import com.sysu.admin.controller.geo.qyz.QyzService;
 import com.sysu.admin.support.system.region.Region;
 import com.sysu.admin.support.system.region.RegionRepository;
@@ -14,7 +15,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 镇区域
@@ -29,6 +32,8 @@ public class CityController {
     CityRepository cityRepository;
     @Autowired
     DistrictRepository districtRepository;
+    @Autowired
+    LandRangeIndexService mLandRangeIndexService;
 
     /**
      * 种植结构
@@ -43,22 +48,32 @@ public class CityController {
     @RequestMapping(value = "/findJson")
     @ResponseBody
     public BaseResult findJson(int code, int level){
-        Geometry geometry = null;
+        Object res = null;
         switch (level){
             case 0:
                 Province province = provinceRepository.findByCode(code);
-                geometry = province == null ? null : province.getGeom();
+                res = province;
+                if(province != null){
+                    province.setWkt(GeoCastUtil.geomToWkt(province.getGeom()));
+                }
                 break;
             case 1:
                 City city = cityRepository.findByCode(code);
-                geometry = city == null ? null : city.getGeom();
+                res = city;
+                if(city != null){
+                    city.setWkt(GeoCastUtil.geomToWkt(city.getGeom()));
+                }
                 break;
             case 2:
                 District district = districtRepository.findByCode(code);
-                geometry = district == null ? null : district.getGeom();
+                res = district;
+                if(district != null){
+                    district.setWkt(GeoCastUtil.geomToWkt(district.getGeom()));
+                    district.setTableName(mLandRangeIndexService.getTableNameByCode(district.getCode()));
+                }
                 break;
         }
-        return R.succ("",GeoCastUtil.geomToWkt(geometry));
+        return R.succ(res);
     }
 
 

+ 6 - 0
src/main/java/com/sysu/admin/controller/city/District.java

@@ -28,6 +28,12 @@ public class District{
     @Column(columnDefinition = "geom")
     private MultiPolygon geom;
 
+    @Transient
+    private String wkt;
+
+    @Transient
+    private String tableName;
+
     @Column()
     private String name;
 

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

@@ -31,6 +31,9 @@ public class Province{
     @Column(columnDefinition = "geom")
     private MultiPolygon geom;
 
+    @Transient
+    private String wkt;
+
     @Column()
     private String name;
 

+ 19 - 3
src/main/java/com/sysu/admin/controller/crop/CropLandService.java

@@ -9,6 +9,8 @@ import com.sysu.admin.controller.city.*;
 import com.sysu.admin.controller.crop.images.CropImage;
 import com.sysu.admin.controller.crop.images.CropImageService;
 import com.sysu.admin.controller.crop.images.ImageType;
+import com.sysu.admin.controller.crop.range.AutoTableNameInterceptor;
+import com.sysu.admin.controller.crop.range.LandRangeIndexService;
 import com.sysu.admin.controller.geo.land.LandTaskStatus;
 import com.sysu.admin.support.base.BaseService;
 import com.sysu.admin.support.system.config.ConfigContext;
@@ -32,9 +34,7 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 @Service
 public class CropLandService extends BaseService<CropLand, Long> {
@@ -49,8 +49,24 @@ public class CropLandService extends BaseService<CropLand, Long> {
     CityRepository cityRepository;
     @Autowired
     DistrictRepository districtRepository;
+    @Autowired
+    LandRangeIndexService landRangeIndexService;
+
+    @Override
+    public CropLand findOne(Long aLong) {
+        AutoTableNameInterceptor.myTable.set(landRangeIndexService.getTableName(aLong));
+        CropLand bean = super.findOne(aLong);
+        return bean;
+    }
+
+    @Override
+    public <S extends CropLand> S save(S entity) {
+        AutoTableNameInterceptor.myTable.set(landRangeIndexService.getTableName(entity.getId()));
+        return super.save(entity);
+    }
 
     public List<CropPoint> findByBuffer(Double[] point, Integer meter){
+        AutoTableNameInterceptor.myTable.set(landRangeIndexService.getTableName(point));
         double degree = meter / (2 * Math.PI * 6371004) * 360;
         return mCropPointRepository.findByBufferAndStatus("Point("+point[0]+" "+point[1]+")",degree, new Integer[]{
                 LandTaskStatus.published.ordinal(),LandTaskStatus.receive.ordinal()

+ 29 - 0
src/main/java/com/sysu/admin/controller/crop/range/AutoTableNameInterceptor.java

@@ -0,0 +1,29 @@
+package com.sysu.admin.controller.crop.range;
+
+import lombok.extern.slf4j.Slf4j;
+import org.hibernate.EmptyInterceptor;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+public class AutoTableNameInterceptor extends EmptyInterceptor {
+
+    public static ThreadLocal<String> myTable = new ThreadLocal<>();
+
+    @Override
+    public String onPrepareStatement(String sql) {
+        if(sql.indexOf("p_crop") > -1) {
+            String tableName = myTable.get();
+            if (tableName == null) return sql;
+            if (tableName == null || tableName.trim().equals("")) return sql;
+            if (sql.indexOf("delete") > -1 || sql.indexOf("insert") > -1) {
+                return sql;
+            }
+            if (sql.indexOf("select") > -1 || sql.indexOf("update") > -1) {
+                sql = sql.replaceAll("p_crop", tableName);
+            }
+        }
+        return sql;
+    }
+}

+ 34 - 0
src/main/java/com/sysu/admin/controller/crop/range/LandRangeIndex.java

@@ -0,0 +1,34 @@
+package com.sysu.admin.controller.crop.range;
+
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import org.locationtech.jts.geom.MultiPolygon;
+
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+@Table(name = "p_land_range_index")
+@Entity
+@Data
+public class LandRangeIndex {
+    /**
+     * 联合主键
+     */
+    @EmbeddedId
+    private PKRP pk;
+
+    @Column
+    private String tableName;
+
+    @Column
+    private String name;
+    @Column
+    private Integer code;
+
+    @JSONField(serialize = false)
+    @Column(columnDefinition = "geom")
+    private MultiPolygon geom;
+}

+ 34 - 0
src/main/java/com/sysu/admin/controller/crop/range/LandRangeIndexController.java

@@ -0,0 +1,34 @@
+package com.sysu.admin.controller.crop.range;
+
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.sysu.admin.controller.crop.CropLand;
+import com.sysu.admin.utils.shape.GeoCastUtil;
+import com.xiesx.fastboot.base.result.BaseResult;
+import com.xiesx.fastboot.base.result.R;
+import lombok.Data;
+import org.locationtech.jts.geom.MultiPolygon;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+@RequestMapping("/range_index")
+@Controller
+public class LandRangeIndexController {
+
+    @Autowired
+    LandRangeIndexService mLandRangeIndexService;
+
+    @RequestMapping("/getTableNames")
+    @ResponseBody
+    public BaseResult getTableNames(Double x1, Double y1,Double x2, Double y2){
+        String[] tableNames = mLandRangeIndexService.getTableNames(x1,y1,x2,y2);
+        return R.succ(tableNames);
+    }
+}

+ 26 - 0
src/main/java/com/sysu/admin/controller/crop/range/LandRangeIndexRepository.java

@@ -0,0 +1,26 @@
+package com.sysu.admin.controller.crop.range;
+
+import com.sysu.admin.controller.crop.CropPoint;
+import com.xiesx.fastboot.core.jpa.JpaPlusRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import java.util.List;
+
+public interface LandRangeIndexRepository extends JpaPlusRepository<LandRangeIndex, PKRP> {
+
+
+    @Query(value = "SELECT table_name from \"p_land_range_index\" where  St_within(geom," +
+            " st_geomfromtext(?1,4326) " +
+            ");",nativeQuery = true)
+    String findTableNameByPoint(String pointWKT);
+
+    @Query(value = "SELECT table_name from \"p_land_range_index\" where  ST_Intersects(geom," +
+            " st_geomfromtext(?1,4326)" +
+            ");",nativeQuery = true)
+    String[] findTableNameByWkt(String wkt);
+
+}

+ 58 - 0
src/main/java/com/sysu/admin/controller/crop/range/LandRangeIndexService.java

@@ -0,0 +1,58 @@
+package com.sysu.admin.controller.crop.range;
+
+import com.querydsl.core.types.Predicate;
+import com.sysu.admin.support.base.BaseService;
+import com.xiesx.fastboot.core.jpa.JpaPlusRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+@Service
+public class LandRangeIndexService extends BaseService<LandRangeIndex, PKRP> {
+
+    @Autowired
+    private LandRangeIndexRepository mLandRangeIndexRepository;
+
+
+    public String[] getTableNames(Double x1, Double y1,Double x2, Double y2){
+        String wkt = "POLYGON (("+x1+" "+y1+", "+x1+" "+y2+", "+x2+" "+y2+", "+x2+" "+y1+", "+x1+" "+y1+"))";
+        return mLandRangeIndexRepository.findTableNameByWkt(wkt);
+    }
+
+    public String getTableName(Long id){
+        if(id == null){
+            return null;
+        }
+        QLandRangeIndex qLandRangeIndex = QLandRangeIndex.landRangeIndex;
+        Predicate predicate = qLandRangeIndex.pk.start.loe(id).and(qLandRangeIndex.pk.end.goe(id));
+        LandRangeIndex landRangeIndex = mLandRangeIndexRepository.findOne(predicate).get();
+        if(landRangeIndex != null){
+            return landRangeIndex.getTableName();
+        }
+        return null;
+    }
+
+    public String getTableNameByCode(Integer code){
+        QLandRangeIndex qLandRangeIndex = QLandRangeIndex.landRangeIndex;
+        LandRangeIndex landRangeIndex = mLandRangeIndexRepository.findOne(qLandRangeIndex.code.eq(code)).get();
+        if(landRangeIndex != null){
+            return landRangeIndex.getTableName();
+        }
+        return null;
+    }
+
+    public String getTableName(Double[] point){
+        return mLandRangeIndexRepository.findTableNameByPoint("Point("+point[0]+" "+point[1]+")");
+    }
+
+
+
+    @Override
+    public JpaPlusRepository<LandRangeIndex, PKRP> r() {
+        return mLandRangeIndexRepository;
+    }
+}

+ 27 - 0
src/main/java/com/sysu/admin/controller/crop/range/PKRP.java

@@ -0,0 +1,27 @@
+package com.sysu.admin.controller.crop.range;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import java.io.Serializable;
+
+/**
+ * 联合主键
+ */
+@Data
+@Accessors(fluent = true)
+@Embeddable
+public class PKRP implements Serializable{
+
+
+
+    @Column
+    private Long start;
+
+
+    @Column
+    private Long end;
+
+}

+ 4 - 0
src/main/resources/application-adm.yml

@@ -56,6 +56,10 @@ spring:
   jpa:
     database-platform: org.hibernate.spatial.dialect.postgis.PostgisDialect
     show-sql: false
+    properties:
+      hibernate:
+        session_factory:
+          session_scoped_interceptor: "com.sysu.admin.controller.crop.range.AutoTableNameInterceptor"
 config:
   image-dir-path: /www/wwwroot/emap.sysuimars.com/images/
   image-base: https://emap.sysuimars.com/images/

+ 8 - 2
src/main/resources/application-dev.yml

@@ -10,6 +10,10 @@ spring:
   jpa:
     show-sql: true
     database-platform: org.hibernate.spatial.dialect.postgis.PostgisDialect
+    properties:
+      hibernate:
+        session_factory:
+          session_scoped_interceptor: "com.sysu.admin.controller.crop.range.AutoTableNameInterceptor"
   datasource:
     driver-class-name: org.postgis.DriverWrapper
     url: jdbc:postgresql_postGIS://101.35.200.5:39543/sysu-emap
@@ -18,6 +22,8 @@ spring:
     password: postgres
     pool-name: HikariPool-1
 
+
+
 config:
   image-dir-path: E:/zcjy/workspace3/sysu_emap/src/main/webapp/images/
   image-base: http://127.0.0.1/images/
@@ -30,7 +36,7 @@ postgis:
 geoserver:
   user: admin
   password: geoserver
-  url: http://localhost
-  port: 8080
+  url: http://change.zylfsm.com
+  port:
   path: geoserver
 

+ 12 - 15
src/main/webapp/WEB-INF/jsp/comm/admin2.jsp

@@ -82,19 +82,6 @@
                 "${geoserver}")
 
 
-                //初始化鼠标位置控件
-                var mousePositionControl = new ol.control.MousePosition({
-                    //样式类名称
-                    projection: projection,
-                    className:"coord-box",
-                    //投影坐标格式,显示小数点后边多少位
-                    coordinateFormat: ol.coordinate.createStringXY(4),
-                    //目标容器
-                    target:document.getElementById("coord-box")
-                });
-                //将鼠标位置坐标控件加入到map中
-                map.addControl(mousePositionControl);
-
                 //默认打开的底图
                 wmtsData["img_wmts"]["layerObj"] = crtLayerWMTS(wmtsData["img_wmts"],1,projection);
                 wmtsData["vector_wmts"]["layerObj"] = crtLayerWMTS(wmtsData["vector_wmts"],1,projection);
@@ -168,8 +155,18 @@
                 // 城市赋值
                 currentPicker = new city("#city-picker", {
                     getValListener: function(item){
-                        if(geoServerContext.actions["3"]){
-                            geoServerContext.actions["3"].fit(item.code)
+                        let cityAction = geoServerContext.actions["3"]
+                        if(cityAction){
+                            cityAction.fit(item.code, function(data){
+                                let landAction = geoServerContext.actions["1"]
+                                if(landAction){
+                                    if(data.tableName){
+                                        landAction.changeMode(1, data.tableName)
+                                    }else{
+                                        landAction.changeMode(0)
+                                    }
+                                }
+                            })
                         }
                     }});
                 geoServerContext.createAction("3", CityAction).start();

+ 48 - 1
src/main/webapp/static/js/city-picker/city-picker.data.js

@@ -11,9 +11,13 @@
     var ChineseDistricts = {
             86: {
                 '': [
-                    {code: '440000', address: '广东省'}
+                    {code: '440000', address: '广东省'},
+                    {code: '500000', address: '重庆市'},
                     ]
             },
+            500000: {
+                500100: '重庆市',
+            },
             440000: {
                 440100: '广州市',
                 440200: '韶关市',
@@ -212,6 +216,49 @@
                 445322: '郁南县',
                 445323: '云安区',
                 445381: '罗定市'
+            },500100: {
+                500101: '万州区',
+                500102: '涪陵区',
+                500103: '渝中区',
+                500104: '大渡口区',
+                500105: '江北区',
+                500106: '沙坪坝区',
+                500107: '九龙坡区',
+                500108: '南岸区',
+                500109: '北碚区',
+                500110: '万盛区',
+                500111: '双桥区',
+                500112: '渝北区',
+                500113: '巴南区',
+                500114: '黔江区',
+                500115: '长寿区',
+                500199: '北部新区',
+                500200: '两江新区',
+                500222: '綦江区',
+                500223: '潼南区',
+                500224: '铜梁县',
+                500225: '大足区',
+                500226: '荣昌区',
+                500227: '璧山区',
+                500228: '梁平县',
+                500229: '城口县',
+                500230: '丰都县',
+                500231: '垫江县',
+                500232: '武隆县',
+                500233: '忠县',
+                500234: '开县',
+                500235: '云阳县',
+                500236: '奉节县',
+                500237: '巫山县',
+                500238: '巫溪县',
+                500240: '石柱土家族自治县',
+                500241: '秀山土家族苗族自治县',
+                500242: '酉阳土家族苗族自治县',
+                500243: '彭水苗族土家族自治县',
+                500116: '江津区',
+                500117: '合川区',
+                500118: '永川区',
+                500119: '南川区'
             }
         }
         ;

+ 17 - 5
src/main/webapp/static/package/city.js

@@ -37,21 +37,27 @@ CityAction.prototype = {
         console.log("remove click")
         this.startStatus = false;
     },
-    find(code, success){
+    getLevel(code){
         let level;
         let endZeroCount = this.endZeroCount(code)
         switch (endZeroCount){
+            case 1:
             case 2:
             case 3:
                 level = 1
                 break;
             case 4:
+            case 5:
                 level = 0
                 break;
             default:
                 level = 2
         }
-        if(level == 0)
+        return level
+    },
+    find(code, success){
+        let level = this.getLevel(code);
+        if(level == 0 || level == 1)
             return
         $.ajax({
             type : 'POST',
@@ -61,11 +67,17 @@ CityAction.prototype = {
             success : success
         });
     },
-    fit(code){
+    fit(code, callback){
         let that = this
         this.find(code, function(res){
-            if(res.code == 0)
-                that.context.currentView.fit(new ol.format.WKT().readGeometry(res.data).getExtent(),{duration: 1000})
+            if(res.code == 0){
+                if(res.data){
+                    that.context.currentView.fit(new ol.format.WKT().readGeometry(res.data.wkt).getExtent(),{duration: 1000})
+                    if(callback){
+                        callback(res.data)
+                    }
+                }
+            }
         })
     },
     endZeroCount(code){

+ 28 - 17
src/main/webapp/static/package/cityland.js

@@ -47,7 +47,7 @@ CityLandAction.prototype = {
         }
         // this.context.clicks[this.id] = this
         this.drawMultiPolygon.show()
-        this.context.currentMap.addLayer(this.obj.layerData.layer)
+
         this.tempVectorLayer.setVisible(true)
 
         this.context.getSldStyleSign(this.obj.wmsData.params.STYLE)
@@ -61,7 +61,9 @@ CityLandAction.prototype = {
             return
         }
         this.tempVectorLayer.setVisible(false)
-        this.context.currentMap.removeLayer(this.obj.layerData.layer)
+        for(let layer of this.obj.layerData.layer){
+            this.context.currentMap.removeLayer(layer)
+        }
         console.log("drawMultiPolygon close")
         this.drawMultiPolygon.close()
         console.log("tempVectorLayer cleared")
@@ -268,7 +270,6 @@ function CityLand(opt){
         }),
         params:{
             'VERSION': '1.0.0',
-            'LAYER': "wuhan:p_crop",
             'STYLE': "wuhan:city_land",
             'TILEMATRIX': gridNames,
             'TILEMATRIXSET': gridsetName,
@@ -277,16 +278,18 @@ function CityLand(opt){
         }
     }
     this.layerData = {
-        layer : null,
-        source : null,
-        select : null,
+        layer : [],
+        source : [],
         always : false
     }
 }
 
 CityLand.prototype = {
+    layerNames:['wuhan:p_land_banan','wuhan:p_land_beibei','wuhan:p_land_bishan','wuhan:p_land_changshou','wuhan:p_land_chengkou','wuhan:p_land_dadukou','wuhan:p_land_dazu','wuhan:p_land_dianjiang','wuhan:p_land_fengdu','wuhan:p_land_fengjie','wuhan:p_land_fuling','wuhan:p_land_hechuan','wuhan:p_land_jiangbei','wuhan:p_land_jiangjin','wuhan:p_land_jiulongpo','wuhan:p_land_kaizhou','wuhan:p_land_liangping','wuhan:p_land_nanan','wuhan:p_land_nanchuan','wuhan:p_land_pengshui','wuhan:p_land_qianjiang','wuhan:p_land_qijiang','wuhan:p_land_qiuyang','wuhan:p_land_rongchang','wuhan:p_land_shapingba','wuhan:p_land_shizhu','wuhan:p_land_tongliang','wuhan:p_land_tongnan','wuhan:p_land_wanzhou','wuhan:p_land_wulong','wuhan:p_land_wushan','wuhan:p_land_wuxi','wuhan:p_land_xiushan','wuhan:p_land_yongchuan','wuhan:p_land_yubei','wuhan:p_land_yunyang','wuhan:p_land_yuzhong','wuhan:p_land_zhong','wuhan:p_crop'],
     getTileLayer(){
-        this.getWMTS()
+        for(let layer of this.layerNames){
+            this.getWMTS(layer)
+        }
     },getWMS(){
         this.layerData.source = new ol.source.ImageWMS({
             ratio: 1,
@@ -294,7 +297,6 @@ CityLand.prototype = {
             params: {'FORMAT': this.wmsData.params['FORMAT'],
                 'VERSION': '1.1.1',
                 "STYLES": '',
-                "LAYERS": 'wuhan:p_crop',
                 "exceptions": 'application/vnd.ogc.se_inimage',
             }
         })
@@ -304,20 +306,20 @@ CityLand.prototype = {
             minZoom: 7,
             maxZoom: 30
         });
-    },getWMTS(){
+    },getWMTS(typeName){
         var resolutions = [0.703125, 0.3515625, 0.17578125, 0.087890625, 0.0439453125, 0.02197265625, 0.010986328125, 0.0054931640625, 0.00274658203125, 0.001373291015625, 6.866455078125E-4, 3.4332275390625E-4, 1.71661376953125E-4, 8.58306884765625E-5, 4.291534423828125E-5, 2.1457672119140625E-5, 1.0728836059570312E-5, 5.364418029785156E-6, 2.682209014892578E-6, 1.341104507446289E-6, 6.705522537231445E-7, 3.3527612686157227E-7];
         var baseUrl = this.wmsData.url;
-        var baseParams = ['VERSION','LAYER','STYLE','TILEMATRIX','TILEMATRIXSET','SERVICE','FORMAT'];
-        var url = baseUrl+'?'
+        var baseParams = ['VERSION','STYLE','TILEMATRIX','TILEMATRIXSET','SERVICE','FORMAT'];
+        var url = baseUrl+'?LAYER='+ typeName +'&'
         for (var param in this.wmsData.params) {
             if (baseParams.indexOf(param.toUpperCase()) < 0) {
                 url = url + param + '=' + this.wmsData.params[param] + '&';
             }
         }
         url = url.slice(0, -1);
-        this.layerData.source = new ol.source.WMTS({
+        let source = new ol.source.WMTS({
             url: url,
-            layer: this.wmsData.params['LAYER'],
+            layer: typeName,
             matrixSet: this.wmsData.params['TILEMATRIXSET'],
             format: this.wmsData.params['FORMAT'],
             projection: this.wmsData.projection,
@@ -330,14 +332,23 @@ CityLand.prototype = {
             }),
             style: this.wmsData.params['STYLE'],
             wrapX: true
-        });
+        })
+        this.layerData.source.push(source);
 
-        this.layerData.layer = new ol.layer.Tile({
-            source: this.layerData.source,
+        this.layerData.layer.push(new ol.layer.Tile({
+            source: source,
             zIndex: 2,
             minZoom: 7,
             maxZoom: 30
-        });
+        }));
+    },
+    loadWMTS(tableNames){
+        for(let layer of this.obj.layerData.layer){
+            for(let tableName of tableNames){
+                asd12312" "
+            }
+            this.context.currentMap.addLayer(layer)
+        }
     }
 }
 

+ 51 - 0
src/main/webapp/static/package/geo_server_context.js

@@ -17,6 +17,43 @@ function GeoServerContext(opt,geoserver_path){
             }
         }
     })
+
+    this.currentMap.on("moveend", function(){
+        let bbox = that.currentView.calculateExtent(that.currentMap.getSize());
+        $.ajax({
+            type : 'POST',
+            url : "/range_index/getTableNames",
+            data : {x1:bbox[0],y1:bbox[1],x2:bbox[2],y2:bbox[3]},
+            dataType : 'json',
+            success : function(res){
+                for(let action of that.actions){
+                    if(action && action.loadWMTS){
+                        let tableNames = res.data;
+                        if(tableNames.length == 0){
+                            tableNames.push("wuhan:p_crop");
+                        }
+                        action.action.loadWMTS(tableNames)
+                    }
+                }
+            }
+        });
+    })
+
+
+
+    //初始化鼠标位置控件
+    var mousePositionControl = new ol.control.MousePosition({
+        //样式类名称
+        projection: this.projection,
+        className:"coord-box",
+        //投影坐标格式,显示小数点后边多少位
+        coordinateFormat: ol.coordinate.createStringXY(4),
+        //目标容器
+        target:document.getElementById("coord-box")
+    });
+    //将鼠标位置坐标控件加入到map中
+    this.currentMap.addControl(mousePositionControl);
+
 }
 
 GeoServerContext.prototype = {
@@ -88,6 +125,20 @@ GeoServerContext.prototype = {
                 console.log($("#cutline-items").html())
             }
         });
+    },
+    getLoadTypeNames(bbox, callback){
+        $.ajax({
+            type : 'POST',
+            url : "/crop/getBuffer",
+            data : { x : coordinate[0], y : coordinate[1], m:m},
+            dataType : 'json',
+            success : function(res){
+                callback(res)
+            },error: function(req){
+                if(error)
+                    error(req)
+            }
+        });
     }
 }
 

+ 34 - 0
src/test/java/com/sysu/admin/controller/crop/CropLandServiceTest.java

@@ -0,0 +1,34 @@
+package com.sysu.admin.controller.crop;
+
+import com.alibaba.fastjson.JSON;
+import com.sysu.admin.MarkApplication;
+import com.sysu.admin.api.base.BaseTest;
+import junit.framework.TestCase;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.Date;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = MarkApplication.class)
+public class CropLandServiceTest extends BaseTest {
+
+    @Autowired
+    CropLandService cropLandService;
+
+    @Test
+    public void testFindOne() {
+        ExecutorService executorService = Executors.newFixedThreadPool(2);
+        CropLand cropLand = cropLandService.findOne(3141964L);
+        executorService.execute(() -> {
+            cropLand.setCreateDate(new Date());
+            cropLandService.save(cropLand);
+            System.out.println(JSON.toJSONString(cropLand));
+        });
+    }
+}

+ 2 - 1
src/test/java/com/sysu/admin/utils/shape/postgis/Main.java

@@ -9,6 +9,7 @@ public class Main {
 //            e.printStackTrace();
 //        }
 
-        PostGisUtilTest.update();
+        PostGisUtilTest.layers();
+
     }
 }

+ 18 - 2
src/test/java/com/sysu/admin/utils/shape/postgis/PostGisUtilTest.java

@@ -106,12 +106,28 @@ public class PostGisUtilTest extends BaseTest {
         }
     }
 
-    public static void update(){
+    public static void updateCity(){
         for(String tableName : getTableNames()){
-            System.out.println("update "+ tableName + " set gridcode = 2;");
+            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+"';");
         }
     }
 
+    public static void insertLandRangeIndex(){
+        for(String tableName : getTableNames()){
+            System.out.println("insert into p_land_range_index(\"start\",\"end\",\"table_name\") ");
+            System.out.println("select (select id from "+tableName+" order by id limit 1),(select id from "+tableName+" order by id desc limit 1),'"+tableName+"';");
+        }
+    }
+
+    public static void layers(){
+        System.out.print("[");
+        for(String tableName : getTableNames()){
+            System.out.print("'wuhan:"+tableName+"',");
+        }
+        System.out.print("]");
+    }
+
+