geotools读取shp并根据属性设置样式渲染后导出png图片

shp文件

在这里插入图片描述
这里根据属性设置样式,将ENG_NAME=Guanshanhu的要素设置为红色,其他的要素默认为灰色

渲染结果

在这里插入图片描述

实现代码

import org.geotools.data.FileDataStore;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.map.FeatureLayer;
import org.geotools.map.Layer;
import org.geotools.renderer.GTRenderer;
import org.geotools.renderer.lite.StreamingRenderer;
import org.geotools.styling.*;
import org.geotools.styling.Stroke;
import org.opengis.filter.FilterFactory;
import org.opengis.filter.expression.Expression;

import org.geotools.data.FileDataStoreFinder;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.map.MapContent;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ShpRenderer {

    public static void main(String[] args) {
        String shpPath = "C:\\Users\\ww\\Desktop\\clipPolygon.shp"; // 替换为你的SHP文件路径
        String outputPath = "C:\\Users\\ww\\Desktop\\image.png"; // 输出图片路径

        try {
            exportShpToImage(shpPath, outputPath, 800, 600);
            System.out.println("导出成功: " + outputPath);
        } catch (Exception e) {
            System.err.println("导出失败: " + e.getMessage());
            e.printStackTrace();
        }
    }

    public static void exportShpToImage(String shpPath, String outputPath, int width, int height) throws IOException, IOException {
        // 1. 加载SHP文件
        FileDataStore store = FileDataStoreFinder.getDataStore(new File(shpPath));
        SimpleFeatureSource featureSource = store.getFeatureSource();

        // 2. 创建地图内容
        MapContent map = new MapContent();
        map.setTitle("SHP Export");


        // 3. 创建样式
        Style style = createPolygonStyle();

        // 4. 创建图层并添加到地图
        Layer layer = new FeatureLayer(featureSource, style);
        map.addLayer(layer);


        // 5. 创建渲染器
        GTRenderer renderer = new StreamingRenderer();
        renderer.setMapContent(map);

        // 6. 创建图像
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D graphics = image.createGraphics();

        // 设置背景为白色
        graphics.setColor(new Color(0, 0, 0, 0));
        graphics.fillRect(0, 0, width, height);

        // 7. 设置渲染区域
        Rectangle imageBounds = new Rectangle(0, 0, width, height);
        ReferencedEnvelope mapBounds = featureSource.getBounds();

        // 8. 渲染地图到图像
        renderer.paint(graphics, imageBounds, mapBounds);

        // 9. 保存图像
        ImageIO.write(image, "png", new File(outputPath));

        // 10. 清理资源
        graphics.dispose();
        map.dispose();
        store.dispose();
    }


    public static Style createPolygonStyle() {
        StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory();
        FilterFactory filterFactory = CommonFactoryFinder.getFilterFactory();

        // 创建要素类型样式
        FeatureTypeStyle fts = styleFactory.createFeatureTypeStyle();

        // 创建颜色表达式
        Expression colorExpr = filterFactory.literal(Color.RED);
        // 创建填充
        Fill fill = styleFactory.createFill(
                colorExpr,
                filterFactory.literal(0.8) // 透明度
        );
        // 创建描边
        Stroke stroke = styleFactory.createStroke(
                filterFactory.literal(Color.BLACK),
                filterFactory.literal(0.5)
        );
        // 创建多边形符号
        PolygonSymbolizer polygonSymbolizer = styleFactory.createPolygonSymbolizer(stroke, fill, null);

        // 创建规则,过滤要素
        Rule rule = styleFactory.createRule();
        rule.setFilter(filterFactory.equals(filterFactory.property("ENG_NAME"), filterFactory.literal("Guanshanhu")));
        rule.symbolizers().add(polygonSymbolizer);
        fts.rules().add(rule);

        // 设置默认样式
        Rule defaultRule = styleFactory.createRule();
        defaultRule.setElseFilter(true);

        // 默认填充
        Fill defaultFill = styleFactory.createFill(
                filterFactory.literal(Color.LIGHT_GRAY),
                filterFactory.literal(0.5)
        );
        Stroke defaultStroke = styleFactory.createStroke(
                filterFactory.literal(Color.DARK_GRAY),
                filterFactory.literal(0.5)
        );
        PolygonSymbolizer defaultSymbolizer = styleFactory.createPolygonSymbolizer(defaultStroke, defaultFill, null);
        defaultRule.symbolizers().add(defaultSymbolizer);
        fts.rules().add(defaultRule);

        // 创建样式
        Style style = styleFactory.createStyle();
        style.featureTypeStyles().add(fts);

        return style;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值