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

node中shapefile字符集判断

概述

最近在用node做一个shp文件的上传入库的功能,使用的是shapefile库,但是在入库的时候由于dbf文件字符集的原因导致数据的入库失败或者不能正确的显示。于是几经搜索资料,找到了一个可行的方法,跟大家分享一下。

shapefile简介

Shapefile-js提供了编写简单的JavaScript程序以读取ESRI Shapefile 以及关联的属性文件的功能,它可以在网页端使用,也可在Node.js环境下使用,node安装后也可在终端使用。

npm i shapefile

Node中使用:

var shapefile = require("shapefile");shapefile.open("example.shp").then(source => source.read().then(function log(result) {if (result.done) return;console.log(result.value);return source.read().then(log);})).catch(error => console.error(error.stack));

web中使用:

<!DOCTYPE html>
<script src="https://unpkg.com/shapefile@0.6"></script>
<script>shapefile.open("https://cdn.rawgit.com/mbostock/shapefile/master/test/points.shp").then(source => source.read().then(function log(result) {if (result.done) return;console.log(result.value);return source.read().then(log);})).catch(error => console.error(error.stack));</script> 

终端中可以快速将shp转换为json文件。

shp2json example.shp

dbf文件

dbf文件由头记录数据记录组成。头记录定义该表的结构并包含与表相关的其他信息。
image.png

BDF文件头的详细格式如下表:

image.png

如上表,dbf文件的语言驱动ID在第29个字节。下表为各字符集对应的编码。

IDCodepageDescription
10x01437
20x02850
30x031252
40x0410000
80x08865
90x09437
100x0A850
110x0B437
130x0D437
140x0E850
150x0F437
160x10850
170x11437
180x12850
190x13932
200x14850
210x15437
220x16850
230x17865
240x18437
250x19437
260x1A850
270x1B437
280x1C863
290x1D850
310x1F852
340x22852
350x23852
360x24860
370x25850
380x26866
550x37850
640x40852
770x4D936
780x4E949
790x4F950
800x50874
870x57Current ANSI CP
880x581252
890x591252
1000x64852
1010x65866
1020x66865
1030x67861
1040x68895
1050x69620
1060x6A737
1070x6B857
1080x6C863
1200x78950
1210x79949
1220x7A936
1230x7B932
1240x7C874
1340x86737
1350x87852
1360x88857
1500x9610007
1510x9710029
1520x9810006
2000xC81250
2010xC91251
2020xCA1254
2030xCB1253
2040xCC1257

通过上表,我们可得知中文对应的Id为77,因此代码实现的时候我们可以这么做判断:

  async parseFields(file) {try {// 检查DBF文件是否存在const dbfExists = await existsAsync(file.dbfFilePath);if (!dbfExists) {logger.error(`DBF文件不存在: ${file.dbfFilePath}`);return [];}console.log('start open Dbf file...', file.dbfFilePath);// 读取DBF文件的前几个字节来检测编码const buffer = await readFileAsync(file.dbfFilePath);// DBF文件的语言驱动ID在第29个字节(0-based索引为28)// http://shapelib.maptools.org/codepage.html?d=1563413688103const languageDriverId = buffer[29];let charset = 'UTF-8';if (languageDriverId === 77) {charset = 'GBK';}logger.info(`DBF文件字符集检测结果: ${charset} (languageDriverId: ${languageDriverId})`);// 使用检测到的字符集打开DBF文件let source = null;try {source = await shapefile.openDbf(file.dbfFilePath, {encoding: charset});} catch (error) {// 如果使用检测到的字符集打开失败,尝试使用GBK(中文环境常用)logger.error(`使用${charset}打开DBF文件失败:`, error);charset = 'GBK';source = await shapefile.openDbf(file.dbfFilePath, {encoding: charset});}// 使用shapefile库读取DBF文件const fields = [];// 获取字段信息if (source._fields) {for (const field of source._fields) {const fieldTypeDixt = {C: 'String',N: 'Number',D: 'Date',F: 'Number',}fields.push({name: field.name,type: fieldTypeDixt[field.type] || 'String',size: field.length,decimal: field.decimal});}}return {fields: fields,charset: charset};} catch (error) {logger.error('解析字段信息失败:', error);return [];}}
}
http://www.dtcms.com/a/313099.html

相关文章:

  • Sklearn 机器学习 数据聚类 KMeans实现聚类
  • wav音频格式中,ACM波形、A/mu-Law Wave、Windows PCM、Microsoft ADPCM的区别
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——9. 接入真实硬件:驱动USB摄像头
  • LeetCode 分类刷题:2824. 统计和小于目标的下标对数目
  • Go语言--语法基础7--函数定义与调用--自定义函数
  • Go语言实战案例:TCP服务器与客户端通信
  • HoloLens+vuforia打包后遇到的问题
  • 图像、视频、音频多模态大模型中长上下文token压缩方法综述
  • Connection refused: no further information: localhost/127.0.0.1:2375
  • Git的安装和配置
  • JavaWeb开发
  • XSS-DOM 2
  • [硬件电路-150]:数字电路 - 数字电路与模拟电路的异同
  • 洛谷 B3841:[GESP202306 二级] 自幂数判断
  • 当Windows远程桌面出现“身份验证错误。要求的函数不受支持”的问题
  • 方差 协方差矩阵是什么
  • java的隐式类型转换和强制转换类型
  • 科威特塔观测指南:412米高空俯瞰石油城变迁
  • 在AI技术快速迭代的背景下,如何通过RAG技术提升模型的实时性和准确性?从Naive RAG到Modular RAG:AI技术进化的关键路径
  • 生成式人工智能展望报告-欧盟-04-社会影响与挑战
  • 86、信息系统建设原则
  • Java 中的多态性及其实现方式
  • AI + 云原生:正在引爆下一代应用的技术革命
  • 中国计算机学会杭州分部副主席朱霖潮:多模态大模型的研究进展与未来
  • k8s+isulad 国产化技术栈云原生技术栈搭建4-添加worker节点
  • Java函数式编程之【Stream终止操作】【上】【简单约简】
  • ethtool,lspci,iperf工具常用命令总结
  • 前端面试手撕题目全解析
  • CXGrId中按回车控制
  • 微店所有店铺内的商品数据API接口