首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以非UTF8 8格式加载带有属性的shapefile

问以非UTF8 8格式加载带有属性的shapefile
EN

Stack Overflow用户
提问于 2020-02-18 12:22:22
回答 1查看 394关注 0票数 1

我可以在传单中成功地加载和显示一个shapefile。然而,当我试图访问这些特性属性时,所有的字符都会被破坏。为了进行调查,我定义了以下函数:

代码语言:javascript
复制
function unpack(str) {
    var codePoints = [];
    for(var i = 0; i < str.length; i++)
        codePoints.push( str.charCodeAt(i) );
    return codePoints;
};

然后,我做以下几点:

代码语言:javascript
复制
const options = {
    onEachFeature: (feature, layer) => {
         console.log(unpack(feature.properties.NAME));
    }
};
L.shapefile(url, options);

当我加载应用程序时,我在控制台数组上看到如下所示:

65533,65533,65533,65533,65533,65533,65533,65533,65533,65533,65533,

..。它对应于Unicode替换字符。

为了说明它的价值,我使用二进制编辑器检查了*.dbf文件,并确定feature.properties.NAME是以ISO8859-7 (ISO拉丁/希腊字母表)给出的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-18 12:54:18

让我们来了解一下Leaflet.shapefile如何处理特性属性中的字符串。

首先,如果您对shapefile格式有一点了解,那么您将熟悉这样一个事实:.shp文件保存几何图形,而.dbf文件保存属性。每个特性的数据被分割在这些文件之间。

因此,Leaflet.shapefile依赖于振型来进行解析,而shapefilejs则依赖于parseDBF来读取.dbf文件的内容。读取来自parseDBF的代码位显示,通过凹凸棒支持多个字符编码

代码语言:javascript
复制
module.exports = function(buffer, encoding) {
  var decoder = createDecoder(encoding);
  // ...etc...

因此,可以用parseDBF文件的内容调用带有buffer的buffer模块,并传递一个具有图标兼容编码的字符串。

现在,shapefilejs是否使用此功能?再一次让我们看看代码

代码语言:javascript
复制
  if (zip[name + '.dbf']) {
    dbf = parseDbf(zip[name + '.dbf'], zip[name + '.cpg']);
  }

这意味着“如果有.dbf文件,使用.dbf文件的内容和.cpg文件的内容调用.dbf”。等等,它为什么要读取.cpg文件?那是什么意思?答案在任何shapefile的侧文件列表中,比如维基百科里的那个。

.cpg -用于指定用于标识要使用的字符编码的代码页(仅用于.dbf)

这应该表明传单-shapefile正在按预期处理字符编码-它从右侧文件读取编码信息,并通过.dbf文件通过iconv-lite解码字符串。您应该检查该侧文件是否存在,并且该文件的内容是否为所需的字符编码。

请注意,iconv的支持编码列表 (也包括iconv的支持编码)很难完成(与已知文本编码列表相比)。也许您的.cpg文件是可以的,但是对文本编码的支持并不存在。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60280798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档