首页 > 其他分享 >使用GeoTools解析shp文件内容

使用GeoTools解析shp文件内容

时间:2024-09-09 11:03:06浏览次数:10  
标签:shp GeoTools JSONArray geometry geom coords new 解析

前言

记录一下工作中使用GeoTools解析shp过程。

默认上传shp文件为zip格式文件,shp压缩包内容如下图

image

代码流程

1.解压zip文件

// 解压缩zip包
File shpFile = ShpParseUtil.unShapeZip(file.getInputStream(), tempDir);

2.解析shp文件内容

parseShapeFile(shpFile);
public static void parseShapeFile(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);
        shpStore.setCharset(Charset.forName("GBK"));

        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();
                System.out.println("名称:" + name);

                //获取坐标系
                CoordinateReferenceSystem coordinateReferenceSystem = feature.getFeatureType().getCoordinateReferenceSystem();
                if (coordinateReferenceSystem != null) {
                    ReferenceIdentifier referenceIdentifier = coordinateReferenceSystem.getCoordinateSystem().getName();
                    String code = referenceIdentifier.getCode();
                    System.out.println("坐标系:" + code);
                }
                //获取shp文件的属性信息
//                List<Object> attributes = feature.getAttributes();
                String geomType = feature.getFeatureType().getDescriptor("the_geom").getType().getName().toString();
                System.out.println("属性值数量:" + feature.getValue().size());
                Map<String, Object> propertoryMap = feature.getValue().stream()
                        .filter(property -> !"the_geom".equals(property.getName().toString()))
                        .collect(Collectors.toMap(property -> property.getName().toString(), Property::getValue));
                for (Property property : feature.getValue()) {
                    String propertyName = property.getName().toString();
                    String typeName = property.getType().getName().toString();
                    System.out.println("属性名:" + propertyName + "类型:" + typeName + " 属性值:" + property.getValue());
                }
                Geometry geom = (Geometry) feature.getAttribute("the_geom");
                String geometryType = geom.getGeometryType();
				// 封装为geojson格式
                String geoJson = convertToJson(geom,propertoryMap);
            }
        }
    }

工具类

public class ShpParseUtil {


    /**
     * 解压shapefile压缩包
     */
    public static File unShapeZip(InputStream inputStream,File tempDir){
        // 解压shp文件
        File unzipFiles = ZipUtil.unzip(inputStream, tempDir, null);
        Optional<File> optional = ListUtil.toList(unzipFiles.listFiles())
                .stream()
                .filter(file1 -> file1.getName().endsWith(".shp"))
                .findAny();
        if (!optional.isPresent()) {
            throw new JeecgBootException("不存在解压后shp文件");
        }
        return optional.get();
    }

    /**
     * 格式化矢量数据为json格式
     * @param the_geom
     * @return
     */
    public static String convertToJson(Geometry the_geom, Map<String, Object> propertoryMap){
        String geomType = the_geom.getGeometryType();
        // 解析组装坐标Json数组
        JSONArray geoJsonArray = getCoordinates(the_geom);

        // 构建 GeoJSON 对象
        JSONObject geoJsonFeature = new JSONObject();
        geoJsonFeature.put("type", "Feature");
        JSONObject geometry = new JSONObject();
        geometry.put("type", geomType);
        geometry.put("coordinates", geoJsonArray);
        geoJsonFeature.put("geometry", geometry);

        // 添加属性
        geoJsonFeature.put("properties", propertoryMap);

        // 返回 GeoJSON 结果
        JSONObject geoJson = new JSONObject();
        geoJson.put("type", "FeatureCollection");
        geoJson.put("features", new JSONArray().fluentAdd(geoJsonFeature));
        return geoJson.toString();
    }

    /**
     *  解析不同类型坐标返回JSON数组
     */
    private static JSONArray getCoordinates(Geometry geometry) {
        if (geometry instanceof Point) {
            Point point = (Point) geometry;
            JSONArray geoJsonPoints = new JSONArray();
            geoJsonPoints.add(point.getX());
            geoJsonPoints.add(point.getY());
            return geoJsonPoints;
        } else if (geometry instanceof LineString) {
            LineString lineString = (LineString) geometry;
            org.locationtech.jts.geom.Coordinate[] coordinates = lineString.getCoordinates();
            JSONArray geoJsonLineString = new JSONArray();
            for (Coordinate coordinate : coordinates) {
                geoJsonLineString.add(coordinate.getX());
                geoJsonLineString.add(coordinate.getY());
            }
            return geoJsonLineString;
        } else if (geometry instanceof Polygon) {
            Polygon polygon = (Polygon) geometry;
            return getPolygonCoordinates(polygon);
        } else if (geometry instanceof MultiPoint) {
            MultiPoint multiPoint = (MultiPoint) geometry;
            JSONArray coords = new JSONArray();
            for (int i = 0; i < multiPoint.getNumGeometries(); i++) {
                Point point = (Point) multiPoint.getGeometryN(i);
                coords.add(new JSONArray().fluentAdd(point.getX()).fluentAdd(point.getY()));
            }
            return coords;
        } else if (geometry instanceof MultiLineString) {
            MultiLineString multiLineString = (MultiLineString) geometry;
            JSONArray coords = new JSONArray();
            for (int i = 0; i < multiLineString.getNumGeometries(); i++) {
                coords.add(getCoordinates(multiLineString.getGeometryN(i)));
            }
            return coords;
        } else if (geometry instanceof MultiPolygon) {
            MultiPolygon multiPolygon = (MultiPolygon) geometry;
            JSONArray coords = new JSONArray();
            for (int i = 0; i < multiPolygon.getNumGeometries(); i++) {
                coords.add(getPolygonCoordinates((Polygon) multiPolygon.getGeometryN(i)));
            }
            return coords;
        } else {
            return null;
        }
    }

    // 解析获取多边形的坐标数组
    private static JSONArray getPolygonCoordinates(Polygon polygon) {
        JSONArray coords = new JSONArray();
        // 多边形外环
        JSONArray exteriorRing = new JSONArray();
        for (int i = 0; i < polygon.getExteriorRing().getNumPoints(); i++) {
            exteriorRing.fluentAdd(new JSONArray().fluentAdd(polygon.getExteriorRing().getCoordinateN(i).x)
                    .fluentAdd(polygon.getExteriorRing().getCoordinateN(i).y));
        }
        coords.add(exteriorRing);
        // 多边形内环
        for (int i = 0; i < polygon.getNumInteriorRing(); i++) {
            JSONArray interiorRing = new JSONArray();
            for (int j = 0; j < polygon.getInteriorRingN(i).getNumPoints(); j++) {
                interiorRing.fluentAdd(new JSONArray().fluentAdd(polygon.getInteriorRingN(i).getCoordinateN(j).x)
                        .fluentAdd(polygon.getInteriorRingN(i).getCoordinateN(j).y));
            }
            coords.add(interiorRing);
        }
        return coords;
    }
}

标签:shp,GeoTools,JSONArray,geometry,geom,coords,new,解析
From: https://www.cnblogs.com/Snowclod/p/18404141

相关文章

  • Spring Cloud全解析:熔断之Hystrix隔离策略
    Hystrix隔离策略Hystrix通过隔离限制依赖的并发量和阻塞扩散,Hystrix的隔离策略有两种:线程隔离(THREAD)使用该策略,HystrixCommand将会在单独的线程上执行,并发请求受线程池中的线程数的限制,默认使用该策略,因为该策略有一个除网络超时外的额外保护层执行依赖调用的线程与请求......
  • Android开发 - Map 键值对链表的使用解析
    创建和初始化MapHashMap:常用的实现类,基于哈希表Map<String,Integer>map=newHashMap<>();LinkedHashMap:保持插入顺序的实现类Map<String,Integer>map=newLinkedHashMap<>();TreeMap:基于红黑树,按键的自然顺序或提供的比较器排序Map<String,Integer>map=......
  • Python 错误 AttributeError 解析,实际错误实例详解
    文章目录前言Python错误AttributeError:_csv.readerobjectHasNoAttributeNext修复Python中的AttributeError:'_csv.reader'objecthasnoattribute'next'错误Python错误AttributeError:‘_io.TextIOWrapper‘objectHasNoAttribute‘Sp......
  • 深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析
    深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析1.语音合成任务简介1.1.语音与文本对比语音来说,NLP技术在深度学习中更为普及。在介绍语音合成任务前,我们先来了解语音这一模态的特点,并将其与文本模态对比。文本模态语音模态表现方式......
  • 2024年“羊城杯”粤港澳大湾区网络安全大赛Misc 部分解析
    2024年“羊城杯”粤港澳大湾区网络安全大赛Misc部分解析前言:Misc-不一样的数据库_2:Misc-hiden:Misc-miaoro:Misc-so_much:前言:本次解析是后期复现当时没时间打用于交流学习,感谢支持!![X]......
  • shp文件转换为CAD文件(dxf格式)
    今天晚上来试一下SHP文件转换为CAD文件。看到一个粉丝留言说能不能实现arcgis图斑转CAD填充的代码。首先我对CAD不熟,基本没接触过,查了查DWG是CAD的专有文件。在网上查资料又发现CAD软件支持DXF格式。昨天写了《三种通过代码创建矢量文件的方法及例子》,依稀记得geopandas就......
  • 使用multipartFile对象解析Execl
    1.需要使用multipartFile包packageorg.springframework.web.multipart;2.数据校验publicStringexportVehicleViol(MultipartFilemultipartFile){    try{      //对前端传递的文件进行校验      if(multipartFile==null&&multipartF......
  • Redis 集群的实现方案全解析
    在当今大数据时代,Redis作为一款高性能的内存数据库,被广泛应用于各种场景。然而,随着数据量的不断增长和业务需求的日益复杂,单节点的Redis往往无法满足需求,这时就需要使用Redis集群来实现数据的分布式存储和高可用性。今天,我们就来一起探讨一下Redis集群的实现方案有哪些。一......
  • Java中的集合框架深度解析:从ArrayList到ConcurrentHashMap的性能考量
    Java中的集合框架深度解析:从ArrayList到ConcurrentHashMap的性能考量大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Java的集合框架为开发者提供了多种数据结构,每种数据结构都有其特定的使用场景和性能特征。本文将深度解析Java中的主要集合类,从Array......
  • Transformer图解以及相关的概念解析
    前言transformer是目前NLP甚至是整个深度学习领域不能不提到的框架,同时大部分LLM也是使用其进行训练生成模型,所以transformer几乎是目前每一个机器人开发者或者人工智能开发者不能越过的一个框架。接下来本文将从顶层往下去一步步掀开transformer的面纱。transformer概述Transforme......