Shapefile文件结构
Shapefile(SHP文件)通常由多个文件组成,每个文件都具有特定的后缀名并承载不同类型的数据。
以下是Shapefile各个文件后缀名的解释:
.shp
:主文件,它包含了地理要素的几何形状信息。每个几何对象(如点、线、多边形)都存储在此文件中。.shx
:索引文件,它包含了地理要素的索引信息。索引文件加快了要素的读取和查询速度,可以通过索引快速定位到指定要素的位置。.dbf
:属性表文件,它包含了地理要素的属性信息。属性表文件以dBase格式存储,每个记录代表一个要素,每个字段存储一个属性值。.prj
:投影文件,它定义了地理数据的坐标系和投影信息。投影文件描述了地理数据如何映射到地图的平面坐标系统,以便正确显示和分析。.sbn
和.sbx
:空间索引文件和空间索引索引文件的补充文件。这些文件存储了Shapefile中的要素的空间索引信息,用于快速查找空间关系和邻近要素。.cpg
:代码页文件,它指定了属性表文件中文本字段的字符编码格式。它用于确保文本字段的正确显示和解释。
这些文件的后缀名和对应的文件内容结合在一起,构成了Shapefile的完整数据集。在使用Shapefile时,通常需要将这些文件一起保持在同一目录中,以便正确读取和使用地理数据。
使用Java解析
在Java中使用geotools解析shp
POM 依赖
<project>
<repositories>
<repository>
<id>osgeo</id>
<name>OSGeo Release Repository</name>
<url>https://repo.osgeo.org/repository/release/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-referencing</artifactId>
<version>24.7</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>24.7</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-extension</artifactId>
<version>24.7</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-jts-wrapper</artifactId>
<version>24.7</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>24.7</version>
</dependency>
</dependencies>
</project>
示例代码
// 请注意此代码示例仅作参考
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.shapefile.ShapefileDataStoreFactory;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.referencing.CRS;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.geometry.Geometry;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
public class Shapefile {
public static void main(String[] args) throws IOException, FactoryException {
File shapefile = new File("xxx.shp");
ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
Map<String, Serializable> params = new HashMap<>();
params.put("url", shapefile.toURI().toURL());
params.put("create spatial index", Boolean.TRUE);
params.put("charset", "UTF-8");
ShapefileDataStore dataStore = (ShapefileDataStore) dataStoreFactory.createDataStore(params);
// 获取数据集名称
for (String typeName : dataStore.getTypeNames()) {
// 获取数据集的元数据信息
SimpleFeatureType schema = dataStore.getSchema(typeName);
// 获取坐标系
CoordinateReferenceSystem crs = schema.getCoordinateReferenceSystem();
// 获取坐标系的EPSG代码
Integer srid = CRS.lookupEpsgCode(crs, true);
SimpleFeatureSource featureSource = dataStore.getFeatureSource();
SimpleFeatureCollection features = featureSource.getFeatures();
try (SimpleFeatureIterator iterator = features.features()) {
while (iterator.hasNext()) {
SimpleFeature feature = iterator.next();
Geometry geometry = (Geometry) feature.getDefaultGeometry();
}
}
}
}
}