liujiusheng / blog

个人博客,blog
19 stars 0 forks source link

Mapserver一种比Geoserver更好用的GIS引擎(二、进一步简化使用Node.js包装,去除Apache和Nginx) #205

Open liujiusheng opened 3 years ago

liujiusheng commented 3 years ago

紧接上一期工作继续。

Mapserver一种比Geoserver更好用的GIS引擎(一、技术方案探索)

2021-8-29更新问题排查

cmd和powershell的问题今天又搞了一天,有点浪费时间。

初步怀疑是字符集的问题,但是查看了cmd和powershell的字符集,都是936 简体中文GBK

于是分别在cmd和powershell中执行,然后直接用vscode打开txt查看字符编码来排查问题: ping www.baidu.com -t > atest.txt

结果发现,powershell输出的txt打开后vscode显示为UTF-16 LE CMD输出的txt打开后vscode显示为UTF-8

image

所以问题还是出在了字符集上,cmd看起来配置上默认是GBK,但实际输出是utf-8,powershell看起来配置上默认是GBK,但实际输出是utf-16 le。

值得说一下的是,这个输出的字符集使用chcp 65001是改不了的,不知道具体原因。

顺手百度了一下“utf-16 le utf-8”,要补充的知识还挺多,直接引用别人写好的吧。

参考: http://www.360doc.com/content/11/1215/13/2036337_172427020.shtml

那目前就只有三个方法:

一是让node.js默认调用cmd.exe执行,

二是在node.js中动态修改powershell的输出字符集,

三是在node.js中用脚本动态转换字符集。

前两种方法大概率要从系统上去修改,所以我选择第三种方法。 关键的几行代码:

const result = await spawnSync('./cgi-bin/mapserv.exe', ["-nh","QUERY_STRING=map=./local-demo/local.map&layers=ocean%20countries%20lakes%20ocean-labels%20places&mode=map&map_imagetype=png&mapext=-180.3006+-120.2004+180.3006+120.2004&imgext=-180.3006+-120.2004+180.3006+120.2004&map_size=600+400&imgx=300&imgy=200&imgxy=600+400"]);
    const stdout = Buffer.from(result.stdout, 'utf16le');
    this.ctx.set('Content-Type','image/png');
    this.ctx.body = stdout;

原文地址:

Mapserver一种比Geoserver更好用的GIS引擎(Node.js包装初探)

后面可直接使用的成果套件研究出来后我也将在这儿发布。