提取shape文件数据到csv

pom文件:

	<dependencies>
		<dependency>
			<groupId>nl.cloudfarming.client</groupId>
			<artifactId>lib-geotools</artifactId>
			<version>2.7.5</version>
		</dependency>
		<dependency>
			<groupId>org.geotools</groupId>
			<artifactId>gt-geojson</artifactId>
			<version>18.0</version>
		</dependency>
	</dependencies>

java代码:

import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.type.AttributeType;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ShapeToCsv {


    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        System.out.println(startTime);
        System.out.println(shape2Geojson("E:\\jingwei\\china_2000.shp","E:\\csv\\北京.csv"));
        long endTime = System.currentTimeMillis();
        System.out.println(endTime-startTime);
    }

    /**
     * shp转换为Geojson
     * @param shpPath
     * @return
     */
    public static int shape2Geojson(String shpPath, String csvPath){
        int size = 0;
        try{
            BufferedWriter out =new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvPath),"UTF-8"));
            File file = new File(shpPath);
            ShapefileDataStore shpDataStore = null;
            shpDataStore = new ShapefileDataStore(file.toURL());
            // 设置编码,防止中文乱码
            shpDataStore.setStringCharset(Charset.forName("utf8"));
            String typeName = shpDataStore.getTypeNames()[0];
            SimpleFeatureSource featureSource = null;
            featureSource =  shpDataStore.getFeatureSource (typeName);
            SimpleFeatureCollection result = featureSource.getFeatures();

            Map<String, Class> mapFields = new HashMap();
            List<AttributeType > attributeTypes = result.getSchema().getTypes();

            // geometry的类型
            String geometryType = result.getSchema().getGeometryDescriptor().getType().getName().toString();

            List<String> csvHeader = new ArrayList<>();
            for (int i=0;i<attributeTypes.size();i++){
                AttributeType attributeType = attributeTypes.get(i);
                String key = attributeType.getName().toString();
                Class classType = attributeType.getBinding();
                if (geometryType.equals(key)){
                    continue;
                }
                csvHeader.add(key);
                out.write(key + ",");
                mapFields.put(key,classType);
            }

            out.write("coords");
            out.newLine();

            SimpleFeatureIterator itertor = result.features();
            while (itertor.hasNext()) {
                SimpleFeature feature = itertor.next();
                for(int i=0;i<csvHeader.size();i++){
                    String key = csvHeader.get(i);
                    String classType = mapFields.get(key).getTypeName();
                    String oneCsvData = feature.getAttribute(csvHeader.get(i)).toString();

                    if (classType.contains("Double")){
                        BigDecimal bd = new BigDecimal(oneCsvData);
                        oneCsvData = bd.toPlainString();
                    }

                    if(oneCsvData.contains(",")){
                        oneCsvData = "\"" + oneCsvData + "\"";
                    }

                    out.write(oneCsvData);
                    out.write(",");
                }

                String coords = feature.getDefaultGeometry().toString();
                if(coords.contains(",")){
                    coords = "\"" + coords + "\"";
                }
                out.write(coords);
                out.newLine();
                size++;
            }
            itertor.close();
            out.flush();
            out.close();
        }
        catch(Exception e){
            System.out.println("转换失败");
            e.printStackTrace();
        }
        return size;

    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纯洁的小魔鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值