功能
从数据库查询数据,导出为 Shapefile 文件
关键技术
1. 数据库查询 - MyBatis-Plus LambdaQuery
依赖 :com.baomidou.mybatisplus.core.toolkit.Wrappers
java
// Lambda 查询
List<KsJkpcqk> ksJkpcqks = ksJkpcqkMapper.selectList(
Wrappers.lambdaQuery(KsJkpcqk.class)
.gt(KsJkpcqk::getId, 2457) // 大于条件
);
2. 创建 Shapefile 数据存储 - GeoTools
依赖 :org.geotools.data.shapefile.ShapefileDataStoreFactory
java
// 配置参数
Map<String, Serializable> params = new HashMap<>();
params.put("url", file.toURI().toURL());
params.put("create spatial index", Boolean.TRUE);
// 创建 ShapefileDataStore
ShapefileDataStoreFactory factory = new ShapefileDataStoreFactory();
ShapefileDataStore dataStore = (ShapefileDataStore) factory.createNewDataStore(params);
// 设置字符集
dataStore.setCharset(Charset.forName("UTF-8"));
说明:
ShapefileDataStoreFactory- Shapefile 数据存储工厂createNewDataStore(params)- 创建新的数据存储setCharset()- 设置编码(解决中文乱码)
3. 定义要素类型 - SimpleFeatureTypeBuilder
依赖 :org.geotools.feature.simple.SimpleFeatureTypeBuilder
java
// 创建要素类型构建器
SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
builder.setName("fqkdpc"); // 类型名称
// 设置坐标系(EPSG:4490 CGCS2000)
CoordinateReferenceSystem crs = CRS.decode("EPSG:4490");
builder.setCRS(crs);
// 添加几何字段
builder.add("the_geom", Point.class); // 点几何
// 添加属性字段
builder.add("ksmc", String.class);
builder.add("sxzqdm", Double.class);
builder.add("sxzqmc", String.class);
// 构建要素类型
SimpleFeatureType featureType = builder.buildFeatureType();
说明:
builder.setCRS()- 设置坐标系builder.add(name, type)- 添加字段(几何/属性)buildFeatureType()- 构建要素类型
4. 创建要素 - SimpleFeatureBuilder + GeometryFactory
依赖 :org.geotools.feature.simple.SimpleFeatureBuilder, org.locationtech.jts.geom.GeometryFactory
java
// 创建要素构建器和几何工厂
SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(featureType);
GeometryFactory geometryFactory = new GeometryFactory();
// 创建点几何
Coordinate coord = new Coordinate(lon, lat);
Point point = geometryFactory.createPoint(coord);
// 添加几何和属性
featureBuilder.add(point); // 几何字段
featureBuilder.add("矿山名称"); // 属性字段
// 构建要素
SimpleFeature feature = featureBuilder.buildFeature("point" + id);
说明:
GeometryFactory.createPoint()- 创建点几何featureBuilder.add()- 添加字段值(按定义顺序)buildFeature(id)- 构建要素并指定 ID
5. 写入 Shapefile - Transaction
依赖 :org.geotools.data.DefaultTransaction
java
// 获取要素存储
String typeName = dataStore.getTypeNames()[0];
SimpleFeatureStore featureStore = (SimpleFeatureStore) dataStore.getFeatureSource(typeName);
// 创建事务
Transaction transaction = new DefaultTransaction("create");
featureStore.setTransaction(transaction);
try {
// 添加要素
featureStore.addFeatures(collection);
transaction.commit(); // 提交事务
} catch (Exception e) {
transaction.rollback(); // 回滚事务
throw e;
} finally {
transaction.close(); // 关闭事务
}
// 释放资源
dataStore.dispose();
说明:
Transaction- 事务管理,确保数据完整性addFeatures()- 添加要素集合commit()/rollback()- 提交/回滚dispose()- 释放资源