专栏首页跟牛老师一起学WEBGIS用GeoTools实现shp+sld导出图片

用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、出图是需要结合地图分辨率的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 说说geotools中坐标转换那点事

    本文说说geotools中坐标转换的那点事情,以WGS84和web墨卡托相互转换为例。

    lzugis
  • geotools中shp和geojson格式的相互转换

    lzugis
  • shape文件上传与展示

    lzugis
  • 让DeepLearning4j阅读小说并给出关联度最高的词

    DeepLearning4j是一个java的神经网络框架,便于java程序员使用神经网络来完成一些机器学习工程。

    天涯泪小武
  • springBoot生成SQL文件-Hibernate5的SchemaUpdate实现

    之前两篇介绍了使用Hibernate生成SQL全量脚本文件的方式,若需要生成增量脚本进行版本维护呢?想到的对于生成增量脚本的方案可归为:

    汐楓
  • SNMP学习笔记之SNMP4J介绍(Java)

      SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应。SNMP4J是纯面向对象设计与SNMP++...

    Jetpropelledsnake21
  • jface databinding:部分实现POJO对象的监测

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648
  • Excel转shape file

    本文讲述如何结合geotools和POI实现Excel到shp的转换,再结合前文shp到geojson数据的转换,即可实现用户上传excel数据并在web端的展...

    lzugis
  • Java实现数据库和数据表的二级联动

    实现的效果是获取Mysql的所有数据库,然后点击数据库名就可以实现获取该数据库里的所有表。

    SmileNicky
  • HDFS基本操作

    一、hadoop搭建     1、修改主机名     2、ip等     3、主机映射     4、关闭防火墙(两种)     5、ssh免密登录(免...

    曼路

扫码关注云+社区

领取腾讯云代金券