java使用geotools读取shp文件
GeoTools是一个开源的Java GIS工具包,可利用它来开发符合标准的地理信息系统。GeoTools提供了OGC(Open Geospatial Consortium)规范的一个实现来作为他们的开发。
一份完整的shp文件应该至少具备这三个文件:dbf(存储矢量数据的属性信息)、shp(存储矢量数据的空间信息的)、shx(保留要素几何学特征的索引文件)。
下面直接具体解析的代码
测试shp文件
引入geotools包
<!-- 解析shp文件 -->
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>${geotools.version}</version>
</dependency>
<!-- Apache工具类 -->
<dependency>
<artifactId>commons-io</artifactId>
<groupId>commons-io</groupId>
<version>2.0.1</version>
</dependency>
压缩包文件处理
@PostMapping("/uploadShpAndGetInfo")
public void uploadShpAndGetInfo(@RequestParam MultipartFile multipartFile) throws Exception {
String fileName = multipartFile.getOriginalFilename();
if (CharSequenceUtil.isNotBlank(fileName)) {
String fileType = fileName.split("[.]")[1];
if (!fileType.endsWith("zip")) {
// 不是以.shp结尾的文件
log.error("上传的文件格式只能是.shp文件和.zip压缩包!");
} else {
//临时保存路径
String filename = multipartFile.getOriginalFilename();
String shpFileTempUrl = "D:/tmp";
String path = shpFileTempUrl + StrUtil.SLASH + filename;
//目录是否存在 不存在就创建
if (!FileUtil.exist(shpFileTempUrl)) {
FileUtil.mkdir(shpFileTempUrl);
}
//创建文件
File file = FileUtil.file(path);
if(fileType.endsWith("zip")){
//解压
File unzip = ZipUtil.unzip(multipartFile.getInputStream(), file, CharsetUtil.CHARSET_GBK);
//获取以.shp结尾的文件
List<File> shp = FileUtil.loopFiles(unzip, pathname -> pathname.getName().endsWith("shp"));
//循环获取shp文件信息
for (File shpFile : shp) {
FileShapeReaderUtil.getShapeFile(shpFile);
}
}
}
} else {
log.error("文件不能为空!");
}
}
shp文件相关信息的读取
public static void getShapeFile(File file) throws Exception {
Map<String, Object> map = new HashMap<>(1);
map.put("url", file.toURI().toURL());
DataStore dataStore = DataStoreFinder.getDataStore(map);
//字符转码,防止中文乱码
ShapefileDataStore shpStore = (ShapefileDataStore) dataStore;
shpStore.setCharset(StandardCharsets.UTF_8);
//获取shp文件坐标系
SimpleFeatureSource source = shpStore.getFeatureSource();
SimpleFeatureType schema = source.getSchema();
Query query = new Query(schema.getTypeName());
FeatureCollection<SimpleFeatureType, SimpleFeature> collection = source.getFeatures(query);
//获取shp文件所有的地块
try (FeatureIterator<SimpleFeature> features = collection.features()) {
while (features.hasNext()) {
SimpleFeature feature = features.next();
String name = feature.getName().toString();
log.info("地块名称=【{}】", name);
//坐标系的名称
ReferenceIdentifier referenceIdentifier = feature.getFeatureType().getCoordinateReferenceSystem().getCoordinateSystem().getName();
String code = referenceIdentifier.getCode();
log.info("地块坐标系=【{}】", code);
//获取shp文件的属性信息
Iterator<? extends Property> iterator = feature.getValue().iterator();
while (iterator.hasNext()) {
Property property = iterator.next();
log.info("地块属性名【{}】 地块属性值【{}】", property.getName(), property.getValue());
}
}
}
}
运行结果
版权声明:本文为weixin_45003796原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。