GDAL库中WFS服务中含有中文不能获取数据的问题
GDAL库中目前提供了对WFS服务发布的数据进行获取,目前发现对于中文的服务名称或者图层名为中文,GDAL不能正确识别。通过调试发现,其原因有下面两点:
1、输入的URL路径没有使用UTF8编码而从网页获取的内容全部都是由UTF8编码组成,造成图层名使用EQUAL进行比较的时候出现错误。
2、输入的URL路径使用%开始的UTF8编码,而GDAL没有对%的转义编码进行转义导致,GDAL直接认为%XX是一个字符串,而不认为是一个UTF8编码导致。
首先对获取的图层名不支持中文的问题进行修改,主要内容就是要求输入的URL中如果含有中文,必须全部使用%开始的UTF8转义编码输入,然后编写一个编码函数,对%开头的UTF8转义字符串转换为真正的UTF8编码,这样可以解决图层名是中文的问题,具体修改的代码如下。
在ogr_wfs.h文件中添加一个函数定义,用来将%开始的UTF8转义编码转为UTF8编码,函数定义和实现如下,定义放到ogr_wfs.h文件中,实现放到ogrwfsdatasource.cpp文件中。
/************************************************************************/
/* WFS_DecodeURL() */
/************************************************************************/CPLString WFS_DecodeURL(CPLString &osSrc)
{CPLString ret;char ch;int ii;for (size_t i=0; i<osSrc.length(); i++) {if (int(osSrc[i])==37){sscanf(osSrc.substr(i+1,2).c_str(), "%x", &ii);ch=static_cast<char>(ii);ret+=ch;i=i+2;} else {ret+=osSrc[i];}}return (ret);
}
接下来修改Open函数中的相关位置,将图层名的编码进行转换。需要修改的地方有三个,都在Open函数里面,可能还有些地方没有找到。具体位置如下:
line 754原始代码为:
CPLHTTPResult* psResult = SendGetCapabilities(pszBaseURL,osTypeName);
修改为,也就是将原来返回的osTypeName,使用上面写的函数转义一次,将转义的结果给osTypeName。
CPLString strOriginalTypeName = "";CPLHTTPResult* psResult = SendGetCapabilities(pszBaseURL, strOriginalTypeName);osTypeName = WFS_DecodeURL(strOriginalTypeName);
line 858:
osTypeName = CPLURLGetValue(pszBaseURL, "TYPENAME");if( osTypeName.size() == 0 )osTypeName = CPLURLGetValue(pszBaseURL, "TYPENAMES");
修改为:
CPLString strOriginalTypeName = CPLURLGetValue(pszBaseURL, "TYPENAME");if( strOriginalTypeName.size() == 0 )strOriginalTypeName = CPLURLGetValue(pszBaseURL, "TYPENAMES");osTypeName = WFS_DecodeURL(strOriginalTypeName);
line 865:
CPLHTTPResult* psResult = SendGetCapabilities(pszBaseURL,osTypeName);
修改为:
CPLHTTPResult* psResult = SendGetCapabilities(pszBaseURL, strOriginalTypeName);osTypeName = WFS_DecodeURL(strOriginalTypeName);
修改完上面的三处,然后重新编译GDAL库,应该就可以支持中文的图层名称了,但是需要注意的是,传入的URL中的中文必须使用%转义的方式,不能直接使用中文,要不然还是会报错,获取不到图层信息。
经过测试发现还有一个问题,就是服务名称如果是中文的话,只能支持偶数个汉字的服务名称,奇数个汉字的服务名称还是不能正确获取到,具体的原因还是汉字UTF8的编码导致的,和之前写的那个C#版本支持中文的问题一样,具体解决方法和C#的那个一样,需要将从网页获取的WFS中的XML全部转码得到汉字,然后再进行处理,但是这样的话,整个驱动里面所有的都需要修改,所以暂时没有改动,我会将这个bug提交到GDAL库中。目前使用的话,建议发布的WFS服务名称最好不要有中文,实在有中文的话,那么也搞成偶数个汉字,图层名有没有中文以及中文个数是多少个,通过的上面的修改可以进行避免。不过上面的修改没有经过大量的测试,也可能会存在问题。
GDAL库中WFS服务中含有中文不能获取数据的问题相关推荐
- Linux编译mybatis,使用mybatis assembly插件打成tar包,在linux系统中运行服务-Go语言中文社区...
使用mybatis assembly插件打成tar包,在linux系统中运行服务 assembly插件插件地址: 链接:https://pan.baidu.com/s/1i6bWPxF 密码:gad5 ...
- xml中加html源码,从xml获取数据以插入html标签,但在源代码中未看到
从xml获取数据以插入到ul标签中.当我运行代码时,页面正在加载,并且我可以在浏览器上看到图像,但jquery代码不起作用(例如,单击到#GalleryList元素),因为附加代码未显示在浏览器视图源 ...
- WIN7中组件服务中的DCOM配置找不到Microsoft Excel应用程序的解决办法和
转自:http://blog.csdn.net/lploveme/article/details/8215265 在运行栏中输入命令:dcomcnfg,打开组件服务管理窗口,但是却发现找不到Micro ...
- WIN7中组件服务中的DCOM配置找不到Microsoft Excel应用程序的解决办法
在运行栏中输入命令:dcomcnfg,打开组件服务管理窗口,但是却发现找不到Microsoft Excel程序,这主要是64位系统的问题,excel是32位的组件,所以在正常的系统组件服务里是看不到的 ...
- 从SQL中相对于日期的特定周获取数据
目录 介绍 背景 所以我们需要更复杂一点 兴趣点 一个QA问题需要"最后一周的数据",这让我开始思考.使用带有"WW"间隔的DATEADD函数很容易,但这会从今 ...
- 浅析GDAL库C#版本支持中文路径问题
GDAL库对于C#的支持问题还是蛮多的,对于中文路径的支持就是其中之一(另一个就是通过OGR库获取图形的坐标信息). 关于C#支持中文路径,看过我之前博客的应该都不陌生,如果使用的是我修改过的GDAL ...
- 开源GIS(十三)——openlayers通过geoserver中WFS添加要素
目录 一.引言 二.WFS添加要素实现 三.WFS添加要素原理 1.请求xml 2.postman使用 3.要素添加 4.返回xml 四.总结 一.引言 ArcGIS server的要素增删改查实在是 ...
- linux unzip乱码,Linux 中unzip解压时中文乱码的解决办法
Linux 中unzip解压时中文乱码的解决办法 Linux 中unzip解压时中文乱码的解决办法 当我们在linux中解压一个含有中文名字的压缩包如"资料.zip"时,如果直接使 ...
- ArcGIS JS API加载GeoServer发布的WFS服务
文章目录 前言 主要代码 总结 参考链接 前言 WFS(Web Feature Service),OGC标准下的要素服务.其支持的主要操作如下: GetCapabilities (discovery ...
最新文章
- 硕博研究生期间应该明确的50件事
- 第六届上海市大学生网络安全大赛 | Wp
- rpc 服务器不可用_RPC和微服务
- 《DeepXDE:a deep learning library for solving differential equations》梳理
- 手机游戏中的社交互动与任务剧情
- 为什么大数据分析很重要
- 让MacOS废纸篓中超过30 天的文件自动清除
- 如何让你的Python程序支持多语言
- FreeRTOS学习-day01
- C语言判断上三角矩阵
- 小程序对接企业微信客服
- 笔记本电脑怎么拆开后盖_新手怎么拆解笔记本?笔记本拆机注意事项 (全文)
- c# 用action做参数进行封装操作
- Elastic: ILM与rollover的关系
- 外网下载速度过慢问题解决办法
- Java腾讯企业邮箱发送邮件
- js 中日期转换成时间戳
- pandas处理Excel基本方法
- Netty 是什么?
- 【python】如何用python生成并保存gif动态图
热门文章
- Android打包出多个dex文件,一个APK中包含多个dex方法
- 能不能翻译PHP网站源码,有朋友可以帮忙用PHP翻译一段PYTHON代码吗?
- Linux:(ubuntu)命令行下显示方框的问题
- MTK模拟器编译使用
- 两轮差速驱动机器人轮间距校准方法
- 洛谷——P1024 [NOIP2001 提高组] 一元三次方程求解
- 布尔型Boolean+undefined+null(JS)
- git的一些简单用法
- 蓝色星空背景互联网网络科技PPT模板
- Openresty 学习笔记(三)扩展库之neturl