zoukankan      html  css  js  c++  java
  • 用GeoTools实现shp+sld导出图片

    概述:

    本文讲解通过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、出图是需要结合地图分辨率的。

    ---------------------------------------------------------------------------------------------------------------

    技术博客

    CSDN:http://blog.csdn.NET/gisshixisheng

    博客园:http://www.cnblogs.com/lzugis/

    在线教程

    http://edu.csdn.Net/course/detail/799

    Github

    https://github.com/lzugis/

    联系方式

    q       q:1004740957

    e-mail:niujp08@qq.com

    公众号:lzugis15

    Q Q 群:452117357(webgis)

                 337469080(Android)

  • 相关阅读:
    追随自己的价值观:用研经理 Anne Diaz 职业探索之路
    语义化版本(SemVer)的范围
    git如何放弃所有本地修改
    将本地已有的一个项目上传到新建的git仓库的方法
    using supervisord to run lsyncd script
    sersync下载安装及配置(有演示示例)
    sersync+rsync原理及部署
    Rsync+sersync 实现数据实时同步
    在分屏浏览中并排使用两个 Mac App
    MacOS 安装 Astah Professional 7.2
  • 原文地址:https://www.cnblogs.com/lzugis/p/7224350.html
Copyright © 2011-2022 走看看