用GeoTools实现shp+sld导出图片

December 17, 2023
测试
测试
测试
测试
9 分钟阅读

概述:

本文讲解通过Geotools实现用shp和sld导出图片。

实现:

生成后的图片

实现代码:

package com.lzugis.geotools;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.factory.CommonFactoryFinder;
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.DefaultGeographicCRS;
import org.geotools.renderer.lite.StreamingRenderer;
import org.geotools.styling.SLDParser;
import org.geotools.styling.Style;
import org.geotools.styling.StyleFactory;
import org.opengis.referencing.crs.CoordinateReferenceSystem;

public class Shape2Image {
	private static MapContent map = new MapContent();   
	/**
	 * 添加shp文件
	 * @param shpPath
	 */
	public void addShapeLayer(String shpPath, String sldPath){
		try{
			File file = new File(shpPath);
    		ShapefileDataStore shpDataStore = null;
        	shpDataStore = new ShapefileDataStore(file.toURL());
            //设置编码
            Charset charset = Charset.forName("GBK");
            shpDataStore.setCharset(charset);
            String typeName = shpDataStore.getTypeNames()[0];
            SimpleFeatureSource featureSource = null;
            featureSource =  shpDataStore.getFeatureSource (typeName);
            
            //SLD的方式
            File sldFile = new File(sldPath);
            StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory();
            SLDParser stylereader = new SLDParser(styleFactory, sldFile.toURI().toURL());  
            Style[] stylearray = stylereader.readXML(); 
            Style style = stylearray[0];
            
            //默认的方式
//		    Style style = SLD.createSimpleStyle(featureSource.getSchema());
//		    SLD.setPolyColour(style, Color.RED );
		    
		    Layer layer = new FeatureLayer(featureSource, style);
		    map.addLayer(layer);
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
	/**
	 * 根据四至、长、宽获取地图内容,并生成图片
	 * @param paras
	 * @param imgPath
	 */
	public void getMapContent(Map paras, String imgPath){
		try{
			double[] bbox = (double[]) paras.get("bbox");
			double x1 = bbox[0], y1 = bbox[1], 
				   x2 = bbox[2], y2 = bbox[3];
		    int width = (int) paras.get("width"), 
		    	height=(int) paras.get("height");
		    
		    // 设置输出范围
		    CoordinateReferenceSystem crs = DefaultGeographicCRS.WGS84;
		    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",new File(imgPath)); 
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
	/**
	 * 工具类测试方法
	 * @param args
	 */
	public static void main(String[] args){
		long start = System.currentTimeMillis();
		
		Shape2Image shp2img = new Shape2Image();
		String shpPath = "D:\\data\\beijing\\China4326.shp";
		String sldPath = "D:\\data\\beijing\\China4326.sld";
		
		String shpPath1 = "D:\\data\\gdal\\university.shp";
		String sldPath1 = "D:\\data\\gdal\\university.sld";
		
		String imgPath = "D:\\data\\beijing\\China4326.png";
		Map paras = new HashMap();
		double[] bbox = new double[]{73.30078125,10.634765625,140.80078125,55.107421875};
		paras.put("bbox", bbox);
		paras.put("width", 768);
		paras.put("height", 506);
		
		shp2img.addShapeLayer(shpPath, sldPath);
		shp2img.addShapeLayer(shpPath1, sldPath1);
		
		shp2img.getMapContent(paras, imgPath);
		System.out.println("图片生成完成,共耗时"+(System.currentTimeMillis() - start)+"ms");
	}
}

说明:

1、本文未解决中文标注的问题。

2、出图是需要结合地图分辨率的。

继续阅读

更多来自我们博客的帖子

如何安装 BuddyPress
由 测试 December 17, 2023
经过差不多一年的开发,BuddyPress 这个基于 WordPress Mu 的 SNS 插件正式版终于发布了。BuddyPress...
阅读更多
Filter如何工作
由 测试 December 17, 2023
在 web.xml...
阅读更多
如何理解CGAffineTransform
由 测试 December 17, 2023
CGAffineTransform A structure for holding an affine transformation matrix. ...
阅读更多