Browse Source

获取图层对应的样式

liwh 1 year ago
parent
commit
956c988855

+ 2 - 1
tile-service/src/main/java/cn/com/taiji/tile/service/ITileService.java

@@ -6,11 +6,12 @@ import cn.com.taiji.common.model.LayerStyleView;
 import cn.com.taiji.cql.model.GeoRequestParam;
 
 import java.util.List;
+import java.util.Map;
 
 public interface ITileService {
 
 
-    byte[] tileData(GeoRequestParam requestParam, LayerGroupDsView layerGroupDsView,List<LayerStyleView> layerStyleViewList);
+    byte[] tileData(GeoRequestParam requestParam, List<LayerGroupDsView> layerGroupDsViewList, Map<String,List<LayerStyleView>> dataMaps);
 
     /**
      * 查询要素信息

+ 80 - 65
tile-service/src/main/java/cn/com/taiji/tile/service/impl/TileServiceImpl.java

@@ -29,114 +29,129 @@ public class TileServiceImpl implements ITileService {
 
 
     @Override
-    public byte[] tileData(GeoRequestParam requestParam, LayerGroupDsView layerGroupDsView,List<LayerStyleView> layerStyleViewList) {
+    public byte[] tileData(GeoRequestParam requestParam, List<LayerGroupDsView> layerGroupDsViewList,Map<String,List<LayerStyleView>> dataMaps) {
 
-        //2根据cql规则获取图层对应的空间地理数据
+        for(LayerGroupDsView layerGroupDsView:layerGroupDsViewList){
 
-        long currentTimeMillis = System.currentTimeMillis();
 
-        StringBuffer filterCqlStr = new StringBuffer();
+            //获取图层代码对应的样式
+            List<LayerStyleView> layerStyleViewList = new ArrayList<LayerStyleView>();
 
-        String filterCql = requestParam.getCqlFilter();
+            if(dataMaps.containsKey(layerGroupDsView.getLayerCode())){
 
-        if(filterCql !=null && !"".equals(filterCql)){
+                layerStyleViewList = dataMaps.get(layerGroupDsView.getLayerCode());
 
-            filterCqlStr.append(filterCql);
-        }
+            }
 
-        String bbox = requestParam.getBbox();
 
-        if(bbox !=null && !"".equals(bbox)){
+            //2根据cql规则获取图层对应的空间地理数据
 
-            StringBuffer sbBbox = new StringBuffer();
-            sbBbox.append("(bbox (");
-            sbBbox.append(layerGroupDsView.getBoxColumn()+",");
-            sbBbox.append(requestParam.getBbox()+"))");
+            long currentTimeMillis = System.currentTimeMillis();
 
-            if(filterCqlStr.length() >0){
+            StringBuffer filterCqlStr = new StringBuffer();
 
-                filterCqlStr.append(" and "+sbBbox.toString());
-            }else{
+            String filterCql = requestParam.getCqlFilter();
 
-                filterCqlStr.append(sbBbox.toString());
+            if(filterCql !=null && !"".equals(filterCql)){
 
+                filterCqlStr.append(filterCql);
             }
 
-        }
-
-        String layerDataType = layerGroupDsView.getLayerDataType();
-        String layerDataRun = layerGroupDsView.getLayerDataRun();
+            String bbox = requestParam.getBbox();
 
-        if(layerDataType !=null && !"".equals(layerDataType) && "cql".equals(layerDataType)){
+            if(bbox !=null && !"".equals(bbox)){
 
-            if(layerDataRun !=null && !"".equals(layerDataRun)){
+                StringBuffer sbBbox = new StringBuffer();
+                sbBbox.append("(bbox (");
+                sbBbox.append(layerGroupDsView.getBoxColumn()+",");
+                sbBbox.append(requestParam.getBbox()+"))");
 
                 if(filterCqlStr.length() >0){
 
-                    filterCqlStr.append(" and "+layerDataRun);
+                    filterCqlStr.append(" and "+sbBbox.toString());
                 }else{
 
-                    filterCqlStr.append(layerDataRun);
+                    filterCqlStr.append(sbBbox.toString());
 
                 }
 
             }
 
-        }
+            String layerDataType = layerGroupDsView.getLayerDataType();
+            String layerDataRun = layerGroupDsView.getLayerDataRun();
 
-        System.out.println("查询条件:" + filterCqlStr.toString());
+            if(layerDataType !=null && !"".equals(layerDataType) && "cql".equals(layerDataType)){
 
-        String host = layerGroupDsView.getHost().split(",")[0].split(":")[0];
-        String port = layerGroupDsView.getHost().split(",")[0].split(":")[1];
+                if(layerDataRun !=null && !"".equals(layerDataRun)){
 
-        Map<String, Object> cqlDsParams = new HashMap<String, Object>();
-        cqlDsParams.put(JDBCDataStoreFactory.DATABASE.key, layerGroupDsView.getDataBase());
-        cqlDsParams.put(JDBCDataStoreFactory.DBTYPE.key, layerGroupDsView.getDbType());
-        cqlDsParams.put(JDBCDataStoreFactory.HOST.key, host);
-        cqlDsParams.put(JDBCDataStoreFactory.PORT.key, port);
-        cqlDsParams.put(JDBCDataStoreFactory.USER.key, layerGroupDsView.getUserName());
-        cqlDsParams.put(JDBCDataStoreFactory.PASSWD.key, layerGroupDsView.getUserPassword());
-        cqlDsParams.put("tableName", layerGroupDsView.getTableName());
+                    if(filterCqlStr.length() >0){
 
+                        filterCqlStr.append(" and "+layerDataRun);
+                    }else{
 
-        Map<String, Object> mapParams = new HashMap<String, Object>();
+                        filterCqlStr.append(layerDataRun);
 
-        if(filterCqlStr.length() >0){
+                    }
 
-            mapParams.put("cql", filterCqlStr.toString());
-        }
+                }
+
+            }
 
+            System.out.println("查询条件:" + filterCqlStr.toString());
 
-        PageResult pageResult = ecqlService.cqlQuery(cqlDsParams, mapParams);
+            String host = layerGroupDsView.getHost().split(",")[0].split(":")[0];
+            String port = layerGroupDsView.getHost().split(",")[0].split(":")[1];
 
-        if (pageResult.getRecordCount() > 0) {
+            Map<String, Object> cqlDsParams = new HashMap<String, Object>();
+            cqlDsParams.put(JDBCDataStoreFactory.DATABASE.key, layerGroupDsView.getDataBase());
+            cqlDsParams.put(JDBCDataStoreFactory.DBTYPE.key, layerGroupDsView.getDbType());
+            cqlDsParams.put(JDBCDataStoreFactory.HOST.key, host);
+            cqlDsParams.put(JDBCDataStoreFactory.PORT.key, port);
+            cqlDsParams.put(JDBCDataStoreFactory.USER.key, layerGroupDsView.getUserName());
+            cqlDsParams.put(JDBCDataStoreFactory.PASSWD.key, layerGroupDsView.getUserPassword());
+            cqlDsParams.put("tableName", layerGroupDsView.getTableName());
 
-            List<Map<String, Object>> cqlDataList = (List<Map<String, Object>>) pageResult.getDatas();
 
-            //3根据空间地理数据生成图层二进制数据
-//            System.out.println("返回的数据:" + cqlDataList.toString());
+            Map<String, Object> mapParams = new HashMap<String, Object>();
+
+            if(filterCqlStr.length() >0){
 
-            System.out.println("数据查询耗时:"+(System.currentTimeMillis()-currentTimeMillis));
-            long start = System.currentTimeMillis();
-            //根据图层名称在mysql表中查询样式
-            ShapeStyle shapeStyle = new ShapeStyle();
-            InputStream in = ClassLoader.getSystemResourceAsStream("images/gis-layout-tools_example-axcbypyj.png");
-            try {
-                BufferedImage image = ImageIO.read(in);
-                shapeStyle.setHeight(12);
-                shapeStyle.setWidth(12);
-                shapeStyle.setPointMarkerImage(image);
-            } catch (IOException e) {
-                throw new RuntimeException(e);
+                mapParams.put("cql", filterCqlStr.toString());
             }
-            byte[] tileByte = ShapeUtils.getTileByte(requestParam.getBbox(), convert(cqlDataList), shapeStyle);
-            long end = System.currentTimeMillis();
-            System.out.println("根据数据生成瓦片耗时"+(end-start));
-            return tileByte;
 
-        } else {
 
-            log.info("根据cql规则:" + filterCqlStr.toString() + "和图层代码:" + requestParam.getLayers() + " 没有找到图层对应的数据源的空间地理数据");
+            PageResult pageResult = ecqlService.cqlQuery(cqlDsParams, mapParams);
+
+            if (pageResult.getRecordCount() > 0) {
+
+                List<Map<String, Object>> cqlDataList = (List<Map<String, Object>>) pageResult.getDatas();
+
+                //3根据空间地理数据生成图层二进制数据
+//            System.out.println("返回的数据:" + cqlDataList.toString());
+
+                System.out.println("数据查询耗时:"+(System.currentTimeMillis()-currentTimeMillis));
+                long start = System.currentTimeMillis();
+                //根据图层名称在mysql表中查询样式
+                ShapeStyle shapeStyle = new ShapeStyle();
+                InputStream in = ClassLoader.getSystemResourceAsStream("images/gis-layout-tools_example-axcbypyj.png");
+                try {
+                    BufferedImage image = ImageIO.read(in);
+                    shapeStyle.setHeight(12);
+                    shapeStyle.setWidth(12);
+                    shapeStyle.setPointMarkerImage(image);
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
+                byte[] tileByte = ShapeUtils.getTileByte(requestParam.getBbox(), convert(cqlDataList), shapeStyle);
+                long end = System.currentTimeMillis();
+                System.out.println("根据数据生成瓦片耗时"+(end-start));
+                return tileByte;
+
+            } else {
+
+                log.info("根据cql规则:" + filterCqlStr.toString() + "和图层代码:" + requestParam.getLayers() + " 没有找到图层对应的数据源的空间地理数据");
+            }
+
         }
 
         return new byte[0];

+ 27 - 0
tile-service/src/main/java/cn/com/taiji/tile/util/StringUtils.java

@@ -0,0 +1,27 @@
+package cn.com.taiji.tile.util;
+
+import org.apache.commons.collections4.CollectionUtils;
+
+import java.util.List;
+
+public class StringUtils {
+
+    /**
+     * 将List<String>集合 转化为String
+     * 如{"aaa","bbb"} To 'aaa','bbb'
+     */
+    public static String convertListToString(List<String> strlist){
+        StringBuffer sb = new StringBuffer();
+        if(CollectionUtils.isNotEmpty(strlist)){
+            for (int i=0;i<strlist.size();i++) {
+                if(i==0){
+                    sb.append("'").append(strlist.get(i)).append("'");
+                }else{
+                    sb.append(",").append("'").append(strlist.get(i)).append("'");
+                }
+            }
+        }
+        return sb.toString();
+
+    }
+}

+ 8 - 7
tile-web/src/main/java/cn/com/taiji/web/controller/TileWebController.java

@@ -64,22 +64,23 @@ public class TileWebController {
 
                 if(layerGroupDsViewList !=null){
 
+                    List<String> layerCodeList = new ArrayList<String>();
+
                     for(LayerGroupDsView layerGroupDsView:layerGroupDsViewList){
 
+                        layerCodeList.add(layerGroupDsView.getLayerCode());
+
 
-                        List<LayerStyleView> layerStyleViewList = new ArrayList<LayerStyleView>();
+                    }
 
-                        if(layerGroupDsView.getLayerCode() !=null && !"".equals(layerGroupDsView.getLayerCode())){
+                    Map<String,List<LayerStyleView>> dataMaps = geoDataSourceService.layerCodeShapeStyle(layerCodeList);
 
-                            layerStyleViewList = geoDataSourceService.layerCodeShapeStyle(layerGroupDsView.getLayerCode());
-                        }
 
+                    byte[] ret = tileService.tileData(geoRequestParam,layerGroupDsViewList,dataMaps);
 
-                        byte[] ret = tileService.tileData(geoRequestParam,layerGroupDsView,layerStyleViewList);
+                    responseWrite(response, "image/png", ret);
 
-                        responseWrite(response, "image/png", ret);
 
-                    }
 
 
                 }else{

+ 1 - 1
tile-web/src/main/java/cn/com/taiji/web/service/IGeoDataSourceService.java

@@ -21,7 +21,7 @@ public interface IGeoDataSourceService {
      * 获取图层代码对应的样式信息
      * @return
      */
-    List<LayerStyleView> layerCodeShapeStyle(String layerCode) throws Exception;
+    Map<String,List<LayerStyleView>> layerCodeShapeStyle(List<String> layerCodeList) throws Exception;
 
     DataSource defaultDataSource() throws Exception;
 

+ 31 - 5
tile-web/src/main/java/cn/com/taiji/web/service/impl/GeoDataSourceServiceImpl.java

@@ -5,6 +5,7 @@ import cn.com.taiji.common.domain.Result;
 import cn.com.taiji.common.model.LayerGroupDsView;
 import cn.com.taiji.common.model.LayerStyleView;
 import cn.com.taiji.cql.service.IECqlService;
+import cn.com.taiji.tile.util.StringUtils;
 import cn.com.taiji.web.config.GeoConfig;
 import cn.com.taiji.web.service.IGeoDataSourceService;
 import cn.hutool.core.date.DatePattern;
@@ -12,8 +13,11 @@ import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
+import org.geotools.api.filter.FilterFactory;
+import org.geotools.api.filter.expression.Function;
 import org.geotools.data.jdbc.datasource.DBCPDataSourceFactory;
 import org.geotools.data.jdbc.datasource.DataSourceFinder;
+import org.geotools.factory.CommonFactoryFinder;
 import org.geotools.jdbc.JDBCDataStoreFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -75,9 +79,9 @@ public class GeoDataSourceServiceImpl implements IGeoDataSourceService {
     }
 
     @Override
-    public List<LayerStyleView> layerCodeShapeStyle(String layerCode) throws Exception {
+    public Map<String,List<LayerStyleView>> layerCodeShapeStyle(List<String> layerCodeList) throws Exception {
 
-        List<LayerStyleView> layerStyleViewList = new ArrayList<LayerStyleView>();
+        Map<String,List<LayerStyleView>> dataMaps = new HashMap<String,List<LayerStyleView>>();
 
         Map<String, Object> dsParams = new HashMap<String, Object>();
         dsParams.put(JDBCDataStoreFactory.DATABASE.key, geoConfig.getDsBase());
@@ -90,7 +94,7 @@ public class GeoDataSourceServiceImpl implements IGeoDataSourceService {
         dsParams.put("tableName", "layer_style_view");
 
 
-        String layerCodeCql = "layer_code='"+layerCode+"'";
+        String layerCodeCql = "layer_code IN (" + StringUtils.convertListToString(layerCodeList) + ")";
 
         Map<String, Object> mapParams = new HashMap<String, Object>();
         mapParams.put("cql", layerCodeCql);
@@ -107,11 +111,33 @@ public class GeoDataSourceServiceImpl implements IGeoDataSourceService {
 
             List<Map<String, Object>> dataSourceList = (List<Map<String, Object>>) pageResult.getDatas();
 
-            layerStyleViewList = JSONObject.parseArray(JSONObject.toJSONString(dataSourceList), LayerStyleView.class);
+            List<LayerStyleView> layerStyleViewList = JSONObject.parseArray(JSONObject.toJSONString(dataSourceList), LayerStyleView.class);
+
+            for(LayerStyleView lsv:layerStyleViewList){
+
+                String layerCode = lsv.getLayerCode();
+
+                if(dataMaps.containsKey(layerCode)){
+
+                    List<LayerStyleView> tempList = dataMaps.get(layerCode);
+                    tempList.add(lsv);
+
+                }else{
+
+                    List<LayerStyleView> newList = new ArrayList<LayerStyleView>();
+                    newList.add(lsv);
+
+                    dataMaps.put(layerCode,newList);
+
+                }
+
+            }
+
+
 
         }
 
-        return layerStyleViewList;
+        return dataMaps;
     }
 
     public DataSource defaultDataSource() throws Exception{