写在前面
偶尔听到同事说一个数据处理重复性的流程太多,就了解了下,原来是1份shp数据对应着一个xls属性文件,需要把xls文件里的一部分属性更新到shp的相关字段中,当然这种操作是可以用ArcGIS或者QGIS实现,但是当数据特别多的时候,且这种操作流程一模一样时,人就崩溃了,需要用程序的方式去实现。由于自己最熟悉的是js,便用周末的时间用nodejs写了一些代码去处理这个任务。代码托管于github(这里是地址https://github.com/ONEGISER/node-examples/tree/master/shp-relation-xls),特此记录,详细信息请读代码里面的readme.md。
流程介绍
1.shp转成geojson(shapefile库)
2.dbf转成object(因为有乱码的问题,需要将第一步生成的属性替换掉,shapefile库)
3.xls解析成object(node-xlsx库)
4.通过关键字段信息处理(字段替换、删除、追加、特殊类型转换等操作),生成新的geojson
5.geojson转成shp(结果为压缩包,需要@gis-js/geojson2shp、JSZip库)
6.压缩包解压(compressing库)
关键配置信息
const encodings = { "2023涉河建筑物": "utf-8", "2022年涉河建筑物": "GBK" }; //shp的编码
const shpRelationId = "code"; //shp的关联id
const xlsTableHeaderIndex = 1; //excel字段起始列
const xlsRelationId = "BM"; //excel的关联id
const deleteFields = []; //原始数据需要删除的字段
const addFields = ["XMMC"]; //添加的字段,"*"代表xls的所有字段
const toStringFields = ["code", "经度", "纬度", "年份"]; //转成字符串的字段
const replaceFields = {
市: "S",
县: "X",
位置: "WZ",
河流: "RV_NAME",
名称: "XMMC",
类型: "LXMC",
}; //替换字段对应关系
const sortFields = [
"XMMC",
"市",
"县",
"显隐",
"名称",
"类型",
"经度",
"纬度",
"位置",
"河流",
"备注",
// "code",
// "年份",
]; //排序字段
原始文件
xls
shp
成果输出
文件成果
shp属性信息
geojson属性信息