Skip to content
章节导航

geotools

1. 添加引用

修改pom.xml文件,添加geotools引用

xml
<!--引用版本-->
<properties>
    <geotools.version>27.0</geotools.version>
</properties>
<!--添加引用-->
<dependencies>
    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-shapefile</artifactId>
        <version>${geotools.version}</version>
    </dependency>
    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-swing</artifactId>
        <version>${geotools.version}</version>
    </dependency>
    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-epsg-hsql</artifactId>
        <version>${geotools.version}</version>
    </dependency>
</dependencies>
<!--添加仓库-->
<repositories>
<repository>
    <id>osgeo</id>
    <name>OSGeo Release Repository</name>
    <url>https://repo.osgeo.org/repository/release/</url>
    <snapshots><enabled>false</enabled></snapshots>
    <releases><enabled>true</enabled></releases>
</repository>
<repository>
    <id>osgeo-snapshot</id>
    <name>OSGeo Snapshot Repository</name>
    <url>https://repo.osgeo.org/repository/snapshot/</url>
    <snapshots><enabled>true</enabled></snapshots>
    <releases><enabled>false</enabled></releases>
</repository>
<repository>
    <id>GeoSolutions</id>
    <url>http://maven.geo-solutions.it/</url>
</repository>
</repositories>

2. wms实现

java
package tech.webgis.controller;


import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.geotools.data.FileDataStore;
import org.geotools.data.FileDataStoreFinder;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.filter.text.cql2.CQL;
import org.geotools.filter.text.cql2.CQLException;
import org.geotools.filter.text.ecql.ECQL;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.map.FeatureLayer;
import org.geotools.map.Layer;
import org.geotools.map.MapContent;
import org.geotools.referencing.CRS;
import org.geotools.renderer.lite.StreamingRenderer;
import org.geotools.styling.*;
import org.geotools.styling.Stroke;
import org.opengis.filter.FilterFactory;
import org.opengis.filter.FilterFactory2;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

@Api(tags = "wms服务")
@RestController
@RequestMapping("services")
public class WmsController {
    @Autowired
    private HttpServletRequest request;
    @Autowired
    private HttpServletResponse response;

    private static StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory();
    private static FilterFactory filterFactory = CommonFactoryFinder.getFilterFactory();
    private static FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();
    private MapContent map = null;
    private SimpleFeatureSource featureSource = null;
    private Layer layer = null;
    public WmsController() {
        super();
        try {
            map = new MapContent();
            // 1. 添加图层
            this.addLayer();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    @ApiOperation("wms")
    @GetMapping("wms")
    public void wms() {
        response.setContentType("image/png");
        response.setHeader("Cache-Control", "max-age=2500, must-revalidate");

        String WIDTH = request.getParameter("WIDTH"),
                HEIGHT = request.getParameter("HEIGHT"),
                BBOX = request.getParameter("BBOX");

        String[] BBOXS = BBOX.split(",");
        double[] _bbox = new double[]{
                Double.parseDouble(BBOXS[0]),
                Double.parseDouble(BBOXS[1]),
                Double.parseDouble(BBOXS[2]),
                Double.parseDouble(BBOXS[3])
        };

        int width = Integer.parseInt(WIDTH), height = Integer.parseInt(HEIGHT);

        Map paras = new HashMap();
        paras.put("bbox", _bbox);
        paras.put("width", width);
        paras.put("height", height);

        try {
            // 2. 输出图片
            this.getMapContent(paras);
        } catch (Exception e) {

        }
    }

    private void addLayer() throws Exception{
        if(layer != null) map.removeLayer(layer);
        Style style = this.createPolygonStyle();
        File file = new File("D:\\test\\county.shp");
        FileDataStore store = FileDataStoreFinder.getDataStore(file);
        featureSource = store.getFeatureSource();
        layer = new FeatureLayer(featureSource, style);
        map.addLayer(layer);
    }

    private void getMapContent(Map params){
        try{
            double[] bbox = (double[]) params.get("bbox");
            double x1 = bbox[0], y1 = bbox[1],
                    x2 = bbox[2], y2 = bbox[3];
            int width = (Integer) params.get("width"),
                    height=(Integer) params.get("height");

            // 设置输出范围
            CoordinateReferenceSystem crs = CRS.decode("EPSG:3857");
            ReferencedEnvelope mapArea = new ReferencedEnvelope(x1, x2, y1, y2, crs);

            // 初始化渲染器
            StreamingRenderer sr = new StreamingRenderer();
            sr.setMapContent(map);

            // 初始化输出图像
            BufferedImage bi = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_ARGB);
            Graphics g = bi.getGraphics();
            ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                    RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            Rectangle rect = new Rectangle(0, 0, width, height);
            // 绘制地图
            sr.paint((Graphics2D) g, rect, mapArea);
            //将BufferedImage变量写入文件中。
            ImageIO.write(bi,"png",response.getOutputStream());
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }

    private Style createPolygonStyle() throws CQLException {
        Rule rule1 = createRule(new Color(0,255, 255));
        rule1.setFilter(ff.equal(
                ff.property("code"),
                ff.literal("632803"),
                true));

        Rule rule2 = createRule(new Color(0,0, 255));
        rule2.setFilter(ff.equal(
                ff.property("code"),
                ff.literal("652824"),
                true));

        Rule rule3 = createRule(new Color(0,255, 0));
        rule3.setFilter(ff.equal(
                ff.property("code"),
                ff.literal("652825"),
                true));
//        rule3.setFilter(CQL.toFilter("DZM = '150000'"));

        Rule commonRule = createRule(new Color(255,0, 0));
        commonRule.setFilter(ECQL.toFilter("code NOT IN ('150000', '540000', '230000')"));

        FeatureTypeStyle fts = styleFactory.createFeatureTypeStyle();
        fts.rules().add(rule1);
        fts.rules().add(rule2);
        fts.rules().add(rule3);
        fts.rules().add(commonRule);
        Style style = styleFactory.createStyle();
        style.featureTypeStyles().add(fts);

        return style;
    }

    private Rule createRule(Color color) {
        Stroke stroke =
                styleFactory.createStroke(
                        filterFactory.literal(color),
                        filterFactory.literal(1),
                        filterFactory.literal(1)
                );
        Fill fill =
                styleFactory.createFill(
                        filterFactory.literal(color),
                        filterFactory.literal(0.2)
                );
        PolygonSymbolizer sym = styleFactory.createPolygonSymbolizer(stroke, fill, null);
        Rule rule = styleFactory.createRule();
        rule.symbolizers().add(sym);
        return rule;
    }
}