使用GeoTools开发Java程序:地块要素提取及Shapefile生成失败求助
问题描述
- 正在开发一款GUI程序,核心流程为:获取用户输入的地块信息→询问需提取的数据类型→加载全县范围Shapefile→按地块编号筛选目标地块→生成仅包含该地块及其属性的新Shapefile。
- 后续开发计划:导出地块周边指定范围的道路、水系;导出区域内GeoTiff影像及DEM栅格生成的等高线;未来版本支持DXF/DWG格式导出。
- 当前问题:文件系统与GUI部分已完成,但从大型Shapefile筛选提取地块时失败,导出文件为"null_shapefile"且无目标要素写入。参考Ian Turton的代码简化生成逻辑,怀疑问题出在要素提取、内存存储或数据传递环节。
现有代码
File inFile = new File("D:\\GIS_project\\HumCo_Parcels_10.19.22.shp"); File outFile = new File(dirPath + projNum + "_PARCEL.shp"); // Read ShapefileDataStore inputDataStore = (ShapefileDataStore) FileDataStoreFinder.getDataStore(inFile); SimpleFeatureSource featureSource = inputDataStore.getFeatureSource(); String inputTypeName = inputDataStore.getTypeNames()[0]; FeatureType inputType = inputDataStore.getSchema(inputTypeName); Filter filter = CQL.toFilter("APN_12 = '" + projAPN + "'"); FeatureCollection<SimpleFeatureType, SimpleFeature> features = featureSource.getFeatures(filter);
问题分析与解决方案
你的代码仅完成了读取源数据、构建筛选条件、获取符合条件的要素集合这几步,完全缺失了将筛选后的要素写入输出Shapefile的核心步骤,这是生成空文件的直接原因。需要补充以下关键逻辑:
1. 创建输出Shapefile的数据存储
初始化输出数据存储,设置编码与要素类型(与源数据保持一致):
// 创建输出数据存储 ShapefileDataStore outputDataStore = new ShapefileDataStore(outFile.toURI().toURL()); outputDataStore.setCharset(StandardCharsets.UTF_8); // 复用源数据的要素类型结构 outputDataStore.createSchema(inputType);
2. 写入筛选后的要素
通过FeatureWriter遍历要素集合,将每个符合条件的要素写入输出文件:
// 获取要素写入器并写入数据 try (FeatureWriter<SimpleFeatureType, SimpleFeature> writer = outputDataStore.getFeatureWriter()) { SimpleFeatureIterator iterator = features.features(); while (iterator.hasNext()) { SimpleFeature sourceFeature = iterator.next(); SimpleFeature targetFeature = writer.next(); // 复制源要素的所有属性与几何信息 targetFeature.setAttributes(sourceFeature.getAttributes()); writer.write(); } iterator.close(); } finally { // 释放资源 inputDataStore.dispose(); outputDataStore.dispose(); }
3. 额外排查点
- 验证筛选有效性:打印
filter的字符串内容,确认APN_12字段名与源数据完全匹配,projAPN的格式(如是否含特殊字符、引号是否正确)符合CQL语法,避免因筛选条件错误导致无要素返回。 - 检查要素集合:在获取
features后,调用features.size()并打印结果,确认是否真的筛选到了要素。如果返回0,说明筛选条件未匹配到任何数据。 - 资源释放:确保所有数据存储、迭代器资源都正确关闭,避免内存泄漏或文件锁定问题。
内容的提问来源于stack exchange,提问作者TyMart
相关产品推荐
相关产品推荐

