• 技术文章 >Java >java教程

    Java中如何将Excel转shape file的代码案例(图)

    黄舟黄舟2017-09-09 13:32:33原创1145
    这篇文章主要介绍了java 中Excel转shape file的实例详解的相关资料,希望通过本文大家能实现这样的功能,需要的朋友可以参考下

    java 中Excel转shape file的实例详解

    概述:

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

    截图:

    原始Excel文件

    运行耗时

    运行结果

    代码:


    package com.lzugis.geotools;
    
    import com.lzugis.CommonMethod;
    import com.vividsolutions.jts.geom.Coordinate;
    import com.vividsolutions.jts.geom.GeometryFactory;
    import com.vividsolutions.jts.geom.Point;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.poifs.filesystem.POIFSFileSystem;
    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.feature.simple.SimpleFeatureTypeBuilder;
    import org.geotools.referencing.crs.DefaultGeographicCRS;
    import org.opengis.feature.simple.SimpleFeature;
    import org.opengis.feature.simple.SimpleFeatureType;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.io.Serializable;
    import java.nio.charset.Charset;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * Created by admin on 2017/9/6.
     */
    public class Xls2Shape {
      static Xls2Shape xls2Shp = new Xls2Shape();
      private static String rootPath = System.getProperty("user.dir");
      private CommonMethod cm = new CommonMethod();
    
      private HSSFSheet sheet;
    
      private Class getCellType(HSSFCell cell) {
        if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
          return String.class;
        } else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
          return Double.class;
        } else {
          return String.class;
        }
      }
    
      private Object getCellValue(HSSFCell cell) {
        if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
          return cell.getRichStringCellValue().getString();
        } else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
          return cell.getNumericCellValue();
        } else {
          return "";
        }
      }
    
      private List<Map<String, Object>> getExcelHeader() {
        List<Map<String, Object>> list = new ArrayList();
        HSSFRow header = sheet.getRow(0);
        HSSFRow value = sheet.getRow(1);
        //获取总列数
        int colNum = header.getPhysicalNumberOfCells();
        for (int i = 0; i < colNum; i++) {
          HSSFCell cellField = header.getCell(i);
          HSSFCell cellvalue = value.getCell(i);
          String fieldName = cellField.getRichStringCellValue().getString();
          fieldName = cm.getPinYinHeadChar(fieldName);
          Class fieldType = getCellType(cellvalue);
          Map<String, Object> map = new HashMap<String, Object>();
          map.put("name", fieldName);
          map.put("type", fieldType);
          list.add(map);
        }
        return list;
      }
    
      public void excel2Shape(String xlsfile, String shppath) {
        POIFSFileSystem fs;
        HSSFWorkbook wb;
        HSSFRow row;
        try {
          InputStream is = new FileInputStream(xlsfile);
          fs = new POIFSFileSystem(is);
          wb = new HSSFWorkbook(fs);
          sheet = wb.getSheetAt(0);
          //获取总列数
          int colNum = sheet.getRow(0).getPhysicalNumberOfCells();
          // 得到总行数
          int rowNum = sheet.getLastRowNum();
    
          List list = getExcelHeader();
          //创建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", Point.class);
          for (int i = 0; i < list.size(); i++) {
            Map<String, Object> map = (Map<String, Object>) list.get(i);
            tb.add(map.get("name").toString(), (Class) map.get("type"));
          }
          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);
          //写下一条
          SimpleFeature feature = null;
          for (int i = 1; i < rowNum; i++) {
            row = sheet.getRow(i);
            feature = writer.next();
            Map mapLonLat = new HashMap();
            for (int j = 0; j < colNum; j++) {
              HSSFCell cell = row.getCell(j);
              Map<String, Object> mapFields = (Map<String, Object>) list.get(j);
              String fieldName = mapFields.get("name").toString();
              feature.setAttribute(fieldName, getCellValue(cell));
              if (fieldName.toLowerCase().equals("lon") || fieldName.toLowerCase().equals("lat")) {
                mapLonLat.put(fieldName, getCellValue(cell));
              }
            }
            feature.setAttribute("the_geom", new GeometryFactory().createPoint(new Coordinate((double) mapLonLat.get("lon"), (double) mapLonLat.get("lat"))));
          }
          writer.write();
          writer.close();
          ds.dispose();
    
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    
      public static void main(String[] args) {
        long start = System.currentTimeMillis();
        String xlspath = rootPath + "/data/xls/capital.xls",
            shppath = rootPath + "/out/capital.shp";
        xls2Shp.excel2Shape(xlspath, shppath);
        System.out.println("共耗时" + (System.currentTimeMillis() - start) + "ms");
      }
    }

    说明:

    1、转换仅限点对象的转换;
    2、保留所有excel相关的属性,lon、lat字段是必须要有的;
    3、对于中文字段,做了取首字母的处理;

    以上就是Java中如何将Excel转shape file的代码案例(图)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:shape Excel Java
    上一篇:Java中关于复合机制的详解 下一篇:Java实现倒计时的方法详解
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• Java基础归纳之枚举• 完全掌握java之String类• 带你搞懂Java结构化数据处理开源库SPL• 一文搞懂Java接口• 详细整理java枚举的使用总结
    1/1

    PHP中文网