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());
                }
            }
        }
    }

运行结果

在这里插入图片描述在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐