当前位置: 首页 > news >正文

做GIS开发的看过来,用java获取shapefile的编码

在 Java 中判断 Shapefile(.shp)的编码(特别是属性表 .dbf 的编码),由于 Shapefile 本身不直接存储编码信息(除非有.cpg文件),我们可以采取以下策略:

  1. 优先检查是否存在.cpg文件,若有则直接读取其内容;
  2. 若无.cpg文件,则尝试用常见编码(如 UTF-8、GBK)读取 .dbf 文件的字段名或记录内容,通过是否出现乱码或解码异常来判断。

Java 生态中常用读取 Shapefile 的库是GeoTools。下面提供一个完整的 Java 示例代码,使用 GeoTools 实现自动检测编码。具体代码实现如下:

import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.data.simple.SimpleFeatureIterator; import org.geotools.data.simple.SimpleFeatureSource; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import java.io.BufferedReader; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; import java.util.List; import java.util.regex.Pattern; public class ShapefileEncodingDetector { private static final List<String> CANDIDATE_ENCODINGS = Arrays.asList("UTF-8", "GBK", "GB2312"); private static final Pattern CHINESE_PATTERN = Pattern.compile("[\u4e00-\u9fff]"); private static final Pattern OBVIOUS_GARBAGE_PATTERN = Pattern.compile(".*[\?]{2,}.*|[\x00-\x08\x0B\x0C\x0E-\x1F].*"); /** * 严谨检测 Shapefile 编码(JDK 8 兼容) */ public static String detectEncoding(String shpFilePath) { Path shpPath = Paths.get(shpFilePath); if (!shpPath.toString().toLowerCase().endsWith(".shp")) { shpPath = Paths.get(shpFilePath + ".shp"); } // Step 1: Check .cpg file (JDK 8 compatible read) Path cpgPath = shpPath.resolveSibling(shpPath.getFileName().toString().replace(".shp", ".cpg")); if (Files.exists(cpgPath)) { String encodingFromCpg = readCpgFile(cpgPath); if (encodingFromCpg != null && Charset.isSupported(encodingFromCpg)) { System.out.println("[INFO] Encoding from .cpg: " + encodingFromCpg); return encodingFromCpg; } } String bestEncoding = null; // Step 2: Try candidate encodings for (String encoding : CANDIDATE_ENCODINGS) { try { ShapefileDataStore store = new ShapefileDataStore(shpPath.toUri().toURL()); store.setCharset(Charset.forName(encoding)); SimpleFeatureSource source = store.getFeatureSource(); SimpleFeatureType schema = source.getSchema(); boolean valid = true; boolean currentHasChinese = false; // Validate field names for (int i = 0; i < schema.getAttributeCount(); i++) { String fieldName = schema.getDescriptor(i).getLocalName(); if (isObviousGarbage(fieldName)) { valid = false; break; } if (containsChinese(fieldName)) { currentHasChinese = true; } } if (!valid) { store.dispose(); continue; } // Validate first few feature attribute values SimpleFeatureCollection features = source.getFeatures(); SimpleFeatureIterator iter = features.features(); try { int count = 0; while (iter.hasNext() && count < 5) { SimpleFeature feature = iter.next(); for (Object attr : feature.getAttributes()) { if (attr == null) continue; String value = attr.toString(); if (isObviousGarbage(value)) { valid = false; break; } if (containsChinese(value)) { currentHasChinese = true; } } if (!valid) break; count++; } } finally { iter.close(); // JDK 8 没有 try-with-resources for AutoCloseable in older GeoTools? } store.dispose(); if (valid) { if (currentHasChinese) { System.out.println("[INFO] Valid encoding with Chinese detected: " + encoding); return encoding; } else { if (bestEncoding == null) { bestEncoding = encoding; } } } } catch (Exception e) { // Skip this encoding continue; } } if (bestEncoding != null) { System.out.println("[INFO] No Chinese found, using safe fallback: " + bestEncoding); return bestEncoding; } System.out.println("[WARN] All encodings failed, defaulting to UTF-8"); return "UTF-8"; } /** * JDK 8 兼容方式读取 .cpg 文件(纯文本,单行编码名) */ private static String readCpgFile(Path cpgPath) { try { // 使用默认字符集(通常是 UTF-8)读取 .cpg,因为 .cpg 本身是 ASCII/UTF-8 StringBuilder content = new StringBuilder(); try (BufferedReader reader = Files.newBufferedReader(cpgPath)) { String line; while ((line = reader.readLine()) != null) { content.append(line.trim()); break; // .cpg 通常只有一行 } } return content.toString().trim(); } catch (IOException e) { System.err.println("[WARN] Failed to read .cpg file: " + e.getMessage()); return null; } } /** * 判断字符串是否包含中文字符 */ private static boolean containsChinese(String s) { return s != null && CHINESE_PATTERN.matcher(s).find(); } /** * 判断是否为明显乱码 */ private static boolean isObviousGarbage(String s) { if (s == null || s.isEmpty()) return false; if (OBVIOUS_GARBAGE_PATTERN.matcher(s).matches()) { return true; } long badCharCount = 0; for (char c : s.toCharArray()) { if (c == '?' || c == '\ufffd') { badCharCount++; } } return badCharCount >= 2 || (s.length() > 0 && (double) badCharCount / s.length() > 0.3); }

http://www.jsqmd.com/news/337287/

相关文章:

  • unicloud 云函数“上传运行”报错:Cannot read properties of undefined (reading test),本地正常
  • Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置 (Day 22) JavaScript
  • 同步磁阻电机SynRM滑模控制(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 2026年龙行营销创始人傅志军:深度分析价值营销理论在多元场景的应用 - 品牌推荐
  • AIGC检测怎么降下来?论文摘要部分的专项处理
  • 2026年知名的面粉机械/大型面粉机厂家推荐及采购参考 - 品牌宣传支持者
  • Leetcode 74. 搜索二维矩阵 (Day 22) JavaScript
  • 基于Hadoop的网上购物行为分析设计与实现一整套含代码含虚拟机环境含讲解视频基于Hadoop的网上购物行为大数据分析系统(自动发货)(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文
  • 论文AIGC检测怎么降?文献综述部分的降AI技巧
  • 2026年中小企业营销增长专家推荐:基于实战案例与行业痛点深度评测 - 品牌推荐
  • 潮玩一番赏小程序开发玩法分析(附技术落地要点)
  • 2026 年质量好的陕西保温装饰铝板厂家用户好评推荐榜 - 朴素的承诺
  • yolov8均有)包含航拍目标检测【数据集8k多张】(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 细聊源头洁净板气密修补厂家怎么选择 - 工业设备
  • 2026年中小企业营销增长专家推荐:傅志军价值营销实战评测,破解增长与落地痛点 - 品牌推荐
  • 完整教程:webrtc代码走读(十)-QOS-Sender Side BWE原理
  • 【双模态目标检测】YOLOv8/v10/v11双模态改进版源码资料(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 全面升级的会员卡积分营销源码系统,一套源码搞定多场景会员营销
  • 2026年友为重工(天津)集团有限公司详细介绍 - 工业品网
  • 基于一致性算法的分布式控制方法孤岛微电网二次控制simulink模型(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • vue3配置404页面
  • 2026年呼叫中心厂商选型指南:部署周期、维护服务及行业方案全解析 - 品牌2025
  • 一键生成证件照,AI智能证件照在线生成源码系统的十大核心功能
  • 探讨2026年忻州钢结构车间厂家,告诉你如何选择 - 工业品网
  • 盘点2026年靠谱的餐桌椅专业厂家,办公餐桌椅费用多少 - 工业品牌热点
  • AIGC检测太高怎么办?2026年最全降AI方法汇总
  • 支持多用户独立运营的会员积分营销系统源码,低成本搭建商家会员体系
  • 2026网红登山火车设计服务商推荐,靠谱的有哪些 - mypinpai
  • 基于深度学习的杂草检测系统(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 聊聊深圳天象文仪茶桌椅子,它的性价比如何,值得推荐吗 - 工业品牌热点