Java使用GeoTools读取shapefile文件



1.配置Maven仓库地址

<repositories>
        <repository>
            <id>maven2-repository.dev.java.net</id>
            <name>Java.net repository</name>
            <url>http://download.java.net/maven/2</url>
        </repository>
        <repository>
            <id>osgeo</id>
            <name>Open Source Geospatial Foundation Repository</name>
            <url>http://download.osgeo.org/webdav/geotools/</url>
        </repository>
        <repository>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <id>boundless</id>
            <name>Boundless Maven Repository</name>
            <url>http://repo.boundlessgeo.com/main</url>
        </repository>
</repositories>

2.引入pom依赖

<dependency>
      <groupId>org.geotools</groupId>
      <artifactId>gt-shapefile</artifactId>
      <version>18.4</version>
</dependency>

3.创建与shape文件映射的实体类


/**
 * @program: tdt-commons
 * @description: Shape文件映射
 * @author: Mr.superbeyone
 * @create: 2018-09-19 11:04
 **/
@Data
public class ShapeModel {
    private String layer;

    private String projection;

    private String region;

    private String regionCode;

    private Integer level;

    private String time;

    private Date createTime;

    private String clazz;

    private String geoStr;
    /**
    *自行选择使用 lombok插件 或者(Get和Set方法)
    *此处省略Get和Set方法
    */
}

4.创建读取ShapeFile的工具类

import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.FeatureSource;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureIterator;
import org.opengis.feature.Property;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;

import java.io.File;
import java.nio.charset.Charset;
import java.util.*;

/**
 * @program: commons
 * @description: 读取Shp文件
 * @author: Mr.superbeyone
 * @create: 2018-09-19 15:26
 **/
public class ShapeReader {

    public ArrayList<ShapeModel> readShapeFile(String filePath) {
        ArrayList<ShapeModel> modelList = new ArrayList<>();
        File folder = new File(filePath);
        if (!folder.isDirectory()) {
            if (folder.toString().endsWith(".shp")) {
                try {
                    modelList = getShapeFile(folder);
                    return modelList;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                System.out.println("选择的文件后缀名不是.shp");
            }
        }else{
	        File[] files = folder.listFiles();
	        if (!(files.length > 0)) {
	            System.out.println("目录文件为空");
	            return modelList;
	        }
	
	        for (File file : files) {
	            if (!file.toString().endsWith(".shp")) {
	                continue;
	            }
	            try {
	                ArrayList<ShapeModel> models = getShapeFile(file);
	                modelList.addAll(models);
	            } catch (Exception e) {
	                e.printStackTrace();
	            }
	        }
        }
        return modelList;
    }

    private ArrayList<ShapeModel> getShapeFile(File file) throws Exception {

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("url", file.toURI().toURL());
        ArrayList<ShapeModel> models = new ArrayList<>();
        DataStore dataStore = DataStoreFinder.getDataStore(map);
        //字符转码,防止中文乱码
        ((ShapefileDataStore) dataStore).setCharset(Charset.forName("utf8"));
        String typeName = dataStore.getTypeNames()[0];
        FeatureSource<SimpleFeatureType, SimpleFeature> source = dataStore.getFeatureSource(typeName);
        FeatureCollection<SimpleFeatureType, SimpleFeature> collection = source.getFeatures();
        FeatureIterator<SimpleFeature> features = collection.features();
        while (features.hasNext()) {
            SimpleFeature feature = features.next();
            ShapeModel model = new ShapeModel();
            Iterator<? extends Property> iterator = feature.getValue().iterator();
            while (iterator.hasNext()) {            
                Property property = iterator.next();
                //property数据与实体类对应
                if (property.getName().toString().equals("the_geom"))
                    model.setGeoStr(property.getValue().toString());
                if (property.getName().toString().equals("layer"))
                    model.setLayer(property.getValue().toString());
                if (property.getName().toString().equals("projection"))
                    model.setProjection(property.getValue().toString());
                if (property.getName().toString().equals("region"))
                    model.setRegion(property.getValue().toString());
                if (property.getName().toString().equals("regionCode"))
                    model.setRegionCode(property.getValue().toString());
                if (property.getName().toString().equals("level"))
                    model.setLevel(Integer.parseInt(property.getValue().toString()));
                if (property.getName().toString().equals("time"))
                    model.setTime(property.getValue().toString());
                model.setCreateTime(new Date());
                model.setClazz("");

            }
            models.add(model);
        }
        return models;
    }

}

5.使用详解

//此处传值既可以是一个目录也可以是一个以.shp结尾的文件,如果是目录的话,会遍历读取所有的以.shp结尾的文件
String filePath = ""; 
ShapeReader shapeReader = new ShapeReader();
shapeReader.readShapeFile(filePath);

参考

转载自:https://blog.csdn.net/superbeyone/article/details/82799645

You may also like...