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