我可以在传单中成功地加载和显示一个shapefile。然而,当我试图访问这些特性属性时,所有的字符都会被破坏。为了进行调查,我定义了以下函数:
function unpack(str) {
var codePoints = [];
for(var i = 0; i < str.length; i++)
codePoints.push( str.charCodeAt(i) );
return codePoints;
};然后,我做以下几点:
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拉丁/希腊字母表)给出的。
发布于 2020-02-18 12:54:18
让我们来了解一下Leaflet.shapefile如何处理特性属性中的字符串。
首先,如果您对shapefile格式有一点了解,那么您将熟悉这样一个事实:.shp文件保存几何图形,而.dbf文件保存属性。每个特性的数据被分割在这些文件之间。
因此,Leaflet.shapefile依赖于振型来进行解析,而shapefilejs则依赖于parseDBF来读取.dbf文件的内容。读取来自parseDBF的代码位显示,通过凹凸棒支持多个字符编码
module.exports = function(buffer, encoding) {
var decoder = createDecoder(encoding);
// ...etc...因此,可以用parseDBF文件的内容调用带有buffer的buffer模块,并传递一个具有图标兼容编码的字符串。
现在,shapefilejs是否使用此功能?再一次让我们看看代码
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文件是可以的,但是对文本编码的支持并不存在。
https://stackoverflow.com/questions/60280798
复制相似问题