zoukankan      html  css  js  c++  java
  • geotools中shp和geojson格式的相互转换

    概述:

    在本文中,讲述如何在geotools中实现shp和geojson数据的相互转换。


    效果:


    实现代码:

    package com.lzugis.geotools;
    
    import java.io.File;
    import java.io.Reader;
    import java.io.Serializable;
    import java.io.StringReader;
    import java.io.StringWriter;
    import java.nio.charset.Charset;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.geotools.data.FeatureWriter;
    import org.geotools.data.Transaction;
    import org.geotools.data.shapefile.ShapefileDataStore;
    import org.geotools.data.shapefile.ShapefileDataStoreFactory;
    import org.geotools.data.simple.SimpleFeatureCollection;
    import org.geotools.data.simple.SimpleFeatureIterator;
    import org.geotools.data.simple.SimpleFeatureSource;
    import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
    import org.geotools.geojson.feature.FeatureJSON;
    import org.geotools.geojson.geom.GeometryJSON;
    import org.geotools.referencing.crs.DefaultGeographicCRS;
    import org.opengis.feature.simple.SimpleFeature;
    import org.opengis.feature.simple.SimpleFeatureType;
    
    import com.amazonaws.util.json.JSONArray;
    import com.amazonaws.util.json.JSONObject;
    import com.lzugis.CommonMethod;
    import com.vividsolutions.jts.geom.LineString;
    import com.vividsolutions.jts.geom.MultiLineString;
    import com.vividsolutions.jts.geom.MultiPoint;
    import com.vividsolutions.jts.geom.MultiPolygon;
    import com.vividsolutions.jts.geom.Point;
    import com.vividsolutions.jts.geom.Polygon;
    
    public class FileFormat {
    	private static CommonMethod cm = new CommonMethod();
    	/**
    	 * geojson转换为shp文件
    	 * @param jsonPath
    	 * @param shpPath
    	 * @return
    	 */
    	public Map geojson2Shape(String jsonPath, String shpPath){
    		Map map = new HashMap();
    		GeometryJSON gjson = new GeometryJSON();
    		try{
    			String strJson = cm.getFileContent(jsonPath);
    			JSONObject json = new JSONObject(strJson);
    			JSONArray features = (JSONArray) json.get("features");
    			JSONObject feature0 = new JSONObject(features.get(0).toString());
    			System.out.println(feature0.toString());
    			String strType = ((JSONObject)feature0.get("geometry")).getString("type").toString();
    			
    			Class<?> geoType = null;
    			switch(strType){
    				case "Point":
    					geoType = Point.class;
    				case "MultiPoint":
    					geoType = MultiPoint.class;
    				case "LineString":
    					geoType = LineString.class;
    				case "MultiLineString":
    					geoType = MultiLineString.class;
    				case "Polygon":
    					geoType = Polygon.class;
    				case "MultiPolygon":
    					geoType = MultiPolygon.class;
    			}
    			//创建shape文件对象
    			File file = new File(shpPath);
    			Map<String, Serializable> params = new HashMap<String, Serializable>();
    			params.put( ShapefileDataStoreFactory.URLP.key, file.toURI().toURL() );
    			ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);
    			//定义图形信息和属性信息
    			SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
    			tb.setCRS(DefaultGeographicCRS.WGS84);
    			tb.setName("shapefile");
    			tb.add("the_geom", geoType);
    			tb.add("POIID", Long.class);
    			ds.createSchema(tb.buildFeatureType());
    			//设置编码
                Charset charset = Charset.forName("GBK");
                ds.setCharset(charset);
    			//设置Writer
    			FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT);
    			
    			for(int i=0,len=features.length();i<len;i++){
    				String strFeature = features.get(i).toString();
    				Reader reader = new StringReader(strFeature);
    				SimpleFeature feature = writer.next();
    				feature.setAttribute("the_geom",gjson.readMultiPolygon(reader));
    				feature.setAttribute("POIID",i);
    				writer.write();
    			}
    			writer.close();
    			ds.dispose();
    			map.put("status", "success");
    			map.put("message", shpPath);
    		}
    		catch(Exception e){
    			map.put("status", "failure");
    			map.put("message", e.getMessage());
    			e.printStackTrace();
    		}
    		return map;
    	}
    	/**
    	 * shp转换为Geojson
    	 * @param shpPath
    	 * @return
    	 */
    	public Map shape2Geojson(String shpPath, String jsonPath){
    		Map map = new HashMap();
    		
    		FeatureJSON fjson = new FeatureJSON();
    		
    		try{
    			StringBuffer sb = new StringBuffer();
    			sb.append("{"type": "FeatureCollection","features": ");
    			
    			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);
                SimpleFeatureCollection result = featureSource.getFeatures();
                SimpleFeatureIterator itertor = result.features();
                JSONArray array = new JSONArray();
                while (itertor.hasNext())
                {
                    SimpleFeature feature = itertor.next();
                    StringWriter writer = new StringWriter();
                    fjson.writeFeature(feature, writer);
                    JSONObject json = new JSONObject(writer.toString());
                    array.put(json);
                }
                itertor.close();
                sb.append(array.toString());
                sb.append("}");
                
                //写入文件
                cm.append2File(jsonPath, sb.toString());
                
    			map.put("status", "success");
    			map.put("message", sb.toString());
    		}
    		catch(Exception e){
    			map.put("status", "failure");
    			map.put("message", e.getMessage());
    			e.printStackTrace();
    			
    		}
    		return map;
    	}
    	
    	/**
    	 * 工具类测试方法
    	 * @param args
    	 */
    	public static void main(String[] args){
    		FileFormat fileFormat = new FileFormat();
    		long start = System.currentTimeMillis();
    		String shpPath = "/Users/lzugis/Documents/chinadata/cityboundry.shp";
    		String jsonPath = "/Users/lzugis/Documents/chinadata/cityboundry.geojson";
    		Map map = fileFormat.shape2Geojson(shpPath, jsonPath);
    		
    //		String shpPath = "D:/data/beijing/China43262.shp";
    //		String jsonPath = "D:/data/beijing/China4326.geojson";
    //		Map map = fileFormat.geojson2Shape(jsonPath, shpPath);
    		
    		System.out.println(jsonPath+",共耗时"+(System.currentTimeMillis() - start)+"ms");
    	}
    }
    

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

    技术博客

    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)



  • 相关阅读:
    倍增算法2(树上倍增)
    倍增算法1
    可持久线段树
    【BZOJ】1059: [ZJOI2007]矩阵游戏(二分图匹配)
    【BZOJ】2743: [HEOI2012]采花(树状数组)
    【BZOJ】2959: 长跑(lct+缩点)(暂时弃坑)
    【学习笔记】LCT link cut tree
    【学习笔记】FFT
    【BZOJ】1001: [BeiJing2006]狼抓兔子(最小割 / 对偶图)
    【BZOJ】1007: [HNOI2008]水平可见直线(凸包)
  • 原文地址:https://www.cnblogs.com/lzugis/p/7224348.html
Copyright © 2011-2022 走看看