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服务中含有中文不能获取数据的问题的更多相关文章
- PHP中判断字符串是否含有中文
<?php /** * [1.测试一] * 当$str = '中文测试'; 时输出"全部是汉字";当$str = '中a文3测试'; 时输出"不全是汉字" ...
- 基于GDAL库,读取.grd文件(以海洋地形数据为例)C++版
技术背景 海洋地形数据主要是通过美国全球地形起伏数据(GMT)获得,数据格式为grd(GSBG)二进制数据,打开软件通过是Surfer软件,surfer软件可进行数据的编辑处理,以及进一步的可视化表达 ...
- 基于GDAL库,读取.grd文件(以海洋地形数据为例)Java版
技术背景 海洋地形数据主要是通过美国全球地形起伏数据(GMT)获得,数据格式为grd(GSBG)二进制数据,打开软件通过是Surfer软件,surfer软件可进行数据的编辑处理,以及进一步的可视化表达 ...
- vue单页应用中,使用setInterval()定时向服务器获取数据,后来跳转页面后,发现还在不停的获取数据。
使用VUE开发单页项目时遇到这样的问题,mounted中使用setInterval()定时向服务器获取数据,后来跳转页面后,发现还在不停的获取数据.我以为是因为我路由用的push导致的,改成repla ...
- WIN7中组件服务中的DCOM配置找不到Microsoft Excel应用程序的解决办法
转自:http://blog.csdn.net/lploveme/article/details/8215265 在运行栏中输入命令:dcomcnfg,打开组件服务管理窗口,但是却发现找不到Micro ...
- Java中多线程服务中遇到的Redis并发问题?
背景: 一个中小型H5游戏 核心错误信息: (1): java.lang.ClassCastException: [B cannot be cast to java.lang.Long at redi ...
- 在java项目中怎样利用Dom4j解析XML文件获取数据
在曾经的学习.net时常常会遇到利用配置文件来解决项目中一些须要常常变换的数据.比方数据库的连接字符串儿等.这个时候在读取配置文件的时候.我们一般会用到一个雷configuration,通过这个类来进 ...
- 浅析GDAL库C#版本支持中文路径问题
GDAL库对于C#的支持问题还是蛮多的,对于中文路径的支持就是其中之一(另一个就是通过OGR库获取图形的坐标信息). 关于C#支持中文路径,看过我之前博客的应该都不陌生,如果使用的是我修改过的GDAL ...
- ArcMap AddIn之下载ArcGIS Server地图服务中的数据
涉及到开发知识点1.ArcGIS Server地图服务 2.C# web请求获取数据 3.AddIN开发技术 工具界面: 具体涉及到的代码之后有空贴出来.先上工具 AddIn插件下载地址:点击这里下载 ...
随机推荐
- WPF TextBlock 判断 isTextTrimmed 文本是否超出
WPF TextBlock 设置TextTrimming情况下 判断 isTextTrimmed(Text 文本是否超出 是否出现了省略号) private bool HasTextTrimmed(T ...
- 120. Triangle(中等)
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- Docker内核能力机制
能力机制(Capability)是 Linux 内核一个强大的特性,可以提供细粒度的权限访问控制. Linux 内核自 2.2 版本起就支持能力机制,它将权限划分为更加细粒度的操作能力,既可以作用在进 ...
- Android动态修改ToolBar的Menu菜单
Android动态修改ToolBar的Menu菜单 效果图 实现 实现很简单,就是一个具有3个Action的Menu,在我们滑动到不同状态的时候,把对应的Action隐藏了. 开始上货 Menu Me ...
- Visual studio debug—Process with an Id of 5616 is not running的解决方法
今天调试的时候,碰到下面的问题 打开项目的csproj文件,拉到最下方找我我图中红框中的部分,删除它即可.
- 大话XML解析
之前我写过一篇关于xml解析的文章:http://blog.csdn.net/sdksdk0/article/details/50749326.今天这篇文章主要是进一步加深对xml基础的理解了使用,毕 ...
- PGM:部分有向模型之条件随机场与链图模型
http://blog.csdn.net/pipisorry/article/details/52529287 贝叶斯网与马尔可夫网 [PGM:无向图模型:马尔可夫网]中例3.8和例4.8显示,贝叶斯 ...
- Windows运行GitStats
Windows运行GitStats(金庆的专栏)GitStats - git history statistics generatorhttp://gitstats.sourceforge.net/G ...
- RxJava(五) onErrorResumeNext操作符实现app与服务器间token机制
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/51533586 本文出自:[余志强的博客] 一.需求场景: 在开发Ap ...
- ROS探索总结(十六)——HRMRP机器人的设计
1. HRMRP简介 HRMRP(Hybrid Real-time Mobile Robot Platform,混合实时移动机器人平台)机器人是我在校期间和实验室的其他小伙伴一起从零开 ...