JAVA解析shp文件

时间:2019.12.24.20.37
之前写过JAVA实现shp文件转wkb文件
现在做一个补充,实现获取shp文件的属性信息
java代码如下

package com.atlchain.bcgis.data;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.geotools.data.FileDataStore;
import org.geotools.data.FileDataStoreFinder;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryCollection;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.type.AttributeDescriptor;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Shp2Wkb {
    private File shpFile = null;

    /**
     * Shp2Wkb
     * @param shpFile Shapefile文件
     */
    public Shp2Wkb(File shpFile) {
        this.shpFile = shpFile;
    }

    /**
     * 将Shapefile中的空间几何对象保存到WKB文件
     * @param wkbFile WKB文件
     * @throws IOException
     */
    public void save(File wkbFile){
        try {
            if (!wkbFile.exists()) {
                wkbFile.createNewFile();
            }
            byte[] WKBByteArray = getGeometryBytes();
            FileOutputStream out = null;
            try {
                out = new FileOutputStream(wkbFile);
                out.write(WKBByteArray);
            } finally {
                out.close();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 将ShapeFile文件中所有Geometry存入GeometryCollection,并转换为byte[]
     * @return
     */
    public byte[] getGeometryBytes(){
        ArrayList<Geometry> geometryList = readShpFile();
        Geometry[] geometries = geometryList.toArray(new Geometry[geometryList.size()]);
        GeometryCollection geometryCollection = Utils.getGeometryCollection(geometries);
        byte[] WKBByteArray = Utils.getBytesFromGeometry(geometryCollection);
        return WKBByteArray;
    }

    /**
     * 获取Shapefile文件中的所有空间几何对象
     * @return 包含所有空间几何对象的GeometryCollection
     */
    public ArrayList<Geometry> getGeometry(){
        return readShpFile();
    }

    /**
     * 读取Shapefile,将其中所有的空间几何对象保存在GeometryCollection中
     * @return 包含Shapefile中所有空间几何对象的GeometryCollection
     */
    private ArrayList<Geometry> readShpFile()  {
        ArrayList<Geometry> geometryArrayList = new ArrayList<>();
        try {
            FileDataStore store = FileDataStoreFinder.getDataStore(shpFile);
            SimpleFeatureSource featureSource = store.getFeatureSource();
            SimpleFeatureCollection featureCollection = featureSource.getFeatures();
            SimpleFeatureIterator featureIterator = featureCollection.features();
            while (featureIterator.hasNext()) {
                SimpleFeature feature = featureIterator.next();
                Object geomObj = feature.getDefaultGeometry();
                geometryArrayList.add((Geometry) geomObj);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return geometryArrayList;
    }

    /**
     * 获取 shpfile 文件属性
     * @return
     */
    public JSONArray getShpFileAttributes()  {
        JSONArray jsonArray = new JSONArray();
        try {
            FileDataStore store = FileDataStoreFinder.getDataStore(shpFile);
             // GeoTools读取ShapeFile文件的默认编码为ISO-8859-1。而我们中文操作系统下ShapeFile文件的默认编码一般为utf-8
            ((ShapefileDataStore) store).setCharset(Charset.forName("utf-8"));
            SimpleFeatureSource featureSource = store.getFeatureSource();
            // 提取出属性的 ID 值
            List<String> attributeID = new LinkedList<>();
            List<AttributeDescriptor> attrList= featureSource.getSchema().getAttributeDescriptors();
            for(AttributeDescriptor attr : attrList){
                String ID = attr.getName().getLocalPart();
                if( !ID.equals("the_geom")){
                    attributeID.add(ID);
                }
            }
            SimpleFeatureCollection featureCollection = featureSource.getFeatures();
            SimpleFeatureIterator featureIterator = featureCollection.features();

            while (featureIterator.hasNext()) {
                SimpleFeature feature = featureIterator.next();
                JSONObject jsonObject = new JSONObject();
                list = feature.getAttributes();
                for(int k = 1; k < list.size(); k++ ){
                    jsonObject.put(attributeID.get(k-1), list.get(k));
                }
                jsonArray.add(jsonObject);
                jsonObject = null;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonArray;
    }
}
<think>好的,我需要帮助用户找到在JDK1.8环境下使用Java解析SHP文件的方法或库。首先,我得回忆一下常见的GIS处理库有哪些。记得有GeoTools,这是一个开源的Java库,专门处理地理空间数据,应该支持SHP文件。不过要确认它是否兼容JDK1.8。另外,ESRI的Shapefile格式比较常见,可能有其他库如JShape或者GeoToolkit。不过GeoToolkit可能已经合并到GeoTools里了?不太确定,需要查证。 接下来,用户提到使用JDK1.8,所以需要确保推荐的库支持这个版本。例如,GeoTools的某个旧版本可能适配JDK1.8,但最新版可能要求更高版本的Java。需要指出具体版本号,比如GeoTools 24.x可能支持Java 8,而最新的可能不行。另外,可能需要检查Maven依赖,给出具体的pom.xml配置示例,这样用户可以直接复制使用。 然后,用户可能需要具体的代码示例,展示如何读取SHP文件。例如,使用GeoTools的FileDataStoreFinder来获取DataStore,然后读取FeatureSource。代码中需要处理异常,关闭资源,确保正确读取几何数据和属性数据。同时,注意JDK1.8的特性,比如try-with-resources,但Java8是支持的,所以可以用。 另外,可能还有其他库,比如JGeoToolkit或者简单的ShapefileReader,但不太常见。需要推荐最常用和稳定的库,避免用户走弯路。同时,要提醒用户注意依赖冲突,特别是GeoTools可能依赖的其他库版本问题,需要正确配置仓库和依赖管理。 最后,生成相关问题,帮助用户深入了解更多内容,比如如何处理SHP中的几何对象,坐标转换,性能优化等。这些相关问题应该围绕用户的需求展开,帮助他们在实际应用中解决问题。</think>在JDK1.8环境解析SHP文件,推荐使用以下方法及库: ### 1. **GeoTools库** GeoTools是开源GIS工具包,支持SHP文件读写,兼容Java8环境。 - **Maven依赖**: ```xml <dependency> <groupId>org.geotools</groupId> <artifactId>gt-shapefile</artifactId> <version>24.0</version> <!-- 支持Java8的版本 --> </dependency> ``` - **代码示例**: ```java import org.geotools.data.FileDataStore; import org.geotools.data.FileDataStoreFinder; import org.geotools.data.simple.SimpleFeatureSource; public class ShpParser { public static void readShp(String filePath) { try (FileDataStore dataStore = FileDataStoreFinder.getDataStore(new File(filePath))) { SimpleFeatureSource featureSource = dataStore.getFeatureSource(); // 读取几何数据与属性 featureSource.getFeatures().forEach(feature -> { System.out.println("几何对象: " + feature.getDefaultGeometry()); System.out.println("属性: " + feature.getAttributes()); }); } catch (Exception e) { e.printStackTrace(); } } } ``` ### 2. **Java Topology Suite (JTS) + ShapefileReader** 若需轻量级方案,可结合JTS与第三方ShapefileReader: ```java import com.vividsolutions.jts.geom.Geometry; import org.geotools.shapefile.ShapefileReader; public class SimpleShpReader { public static void parse(String shpPath) { ShapefileReader reader = new ShapefileReader(new File(shpPath)); while (reader.hasNext()) { Geometry geometry = reader.nextRecord().geometry(); System.out.println("几何类型: " + geometry.getGeometryType()); } reader.close(); } } ``` ### 3. **注意事项** - **依赖冲突**:GeoTools需添加Maven仓库声明: ```xml <repository> <id>osgeo</id> <url>https://repo.osgeo.org/repository/release/</url> </repository> ``` - **编码问题**:SHP属性表若含中文,需指定编码如`CP936`[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值