Murain的笔记

Murain的笔记

记录遇到的一些问题和解决方法

Shapefile文件结构

Shapefile(SHP文件)通常由多个文件组成,每个文件都具有特定的后缀名并承载不同类型的数据。
以下是Shapefile各个文件后缀名的解释:

  1. .shp:主文件,它包含了地理要素的几何形状信息。每个几何对象(如点、线、多边形)都存储在此文件中。
  2. .shx:索引文件,它包含了地理要素的索引信息。索引文件加快了要素的读取和查询速度,可以通过索引快速定位到指定要素的位置。
  3. .dbf:属性表文件,它包含了地理要素的属性信息。属性表文件以dBase格式存储,每个记录代表一个要素,每个字段存储一个属性值。
  4. .prj:投影文件,它定义了地理数据的坐标系和投影信息。投影文件描述了地理数据如何映射到地图的平面坐标系统,以便正确显示和分析。
  5. .sbn.sbx:空间索引文件和空间索引索引文件的补充文件。这些文件存储了Shapefile中的要素的空间索引信息,用于快速查找空间关系和邻近要素。
  6. .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();
                }
            }
        }
    }
}

定义

CRS 是坐标参照系统(Coordinate Reference System)的缩写。在地理信息系统(GIS)中,坐标参照系统是一个用于描述地球或其部分的坐标系统和地理数据集。它包括一个坐标系统和一个地理坐标的转换方法。

CRS 可以分为两类:地理坐标参照系统(Geographic CRS)和投影坐标参照系统(Projected CRS)。

  • 地理坐标参照系统(Geographic CRS):也称为地理坐标系统,它使用经度和纬度来定义地球表面上的位置。这种系统通常用于全球范围内的地图。
  • 投影坐标参照系统(Projected CRS):这是一种地理坐标系统的平面表示,它将地球表面的三维形状转换为二维平面。这种转换通常会导致一些扭曲,但在小范围内(如城市或国家)这种扭曲是可以接受的。

在 GIS 中,选择正确的 CRS 是非常重要的,因为它会影响到地图的准确性和可用性。

SRID 是 Spatial Reference System Identifier 的缩写。在地理信息系统(GIS)中,SRID 是用来唯一标识坐标参照系统(CRS)的数字。每个坐标参照系统都有一个与之关联的 SRID。

描述CRS

通常会使用两种主要的文本格式:WKT(Well-Known Text)和 PROJ。

WKT(Well-Known Text):这是一种文本标记语言,用于表示矢量几何对象、空间参照系统以及空间参照系统之间的转换。WKT 格式的 CRS 描述非常详细,包括了投影方法、地理区域、单位、轴信息等。

PROJ:这是一个开源库,用于转换地理坐标。PROJ 字符串是一种简洁的方式来描述 CRS,它包括了投影方法和参数。虽然 PROJ 字符串比 WKT 更简洁,但它可能不包含 WKT 所有的信息。

这两种格式都可以用来在 GIS 软件中定义和转换 CRS。选择使用哪种格式取决于你的具体需求和你正在使用的 GIS 软件。