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

运行结果

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

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以使用Geotools库来读写shp文件。下面是一个简单的示例代码,可以读取shp文件并打印出其属性表信息: ```java import java.io.File; import java.io.IOException; import org.geotools.data.DataStore; import org.geotools.data.DataStoreFinder; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.data.simple.SimpleFeatureIterator; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; public class ShpFileReader { public static void main(String[] args) throws IOException { // 读取shp文件 File file = new File("path/to/shapefile.shp"); DataStore dataStore = DataStoreFinder.getDataStore(file); String typeName = dataStore.getTypeNames()[0]; SimpleFeatureType schema = dataStore.getSchema(typeName); // 获取属性表信息 System.out.println("Feature Type: " + typeName); System.out.println("Number of attributes: " + schema.getAttributeCount()); System.out.println("Attributes: "); for (int i = 0; i < schema.getAttributeCount(); i++) { System.out.println(schema.getAttributeDescriptors().get(i).getName()); } // 获取要素信息 SimpleFeatureCollection collection = dataStore.getFeatureSource(typeName).getFeatures(); try (SimpleFeatureIterator features = collection.features()) { while (features.hasNext()) { SimpleFeature feature = features.next(); System.out.println(feature.getID() + ": " + feature.getDefaultGeometryProperty().getValue()); } } dataStore.dispose(); } } ``` 需要注意的是,需要在pom.xml中添加geotools依赖: ```xml <dependency> <groupId>org.geotools</groupId> <artifactId>gt-shapefile</artifactId> <version>24.0</version> </dependency> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值