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服务中含有中文不能获取数据的问题相关推荐

  1. Linux编译mybatis,使用mybatis assembly插件打成tar包,在linux系统中运行服务-Go语言中文社区...

    使用mybatis assembly插件打成tar包,在linux系统中运行服务 assembly插件插件地址: 链接:https://pan.baidu.com/s/1i6bWPxF 密码:gad5 ...

  2. xml中加html源码,从xml获取数据以插入html标签,但在源代码中未看到

    从xml获取数据以插入到ul标签中.当我运行代码时,页面正在加载,并且我可以在浏览器上看到图像,但jquery代码不起作用(例如,单击到#GalleryList元素),因为附加代码未显示在浏览器视图源 ...

  3. WIN7中组件服务中的DCOM配置找不到Microsoft Excel应用程序的解决办法和

    转自:http://blog.csdn.net/lploveme/article/details/8215265 在运行栏中输入命令:dcomcnfg,打开组件服务管理窗口,但是却发现找不到Micro ...

  4. WIN7中组件服务中的DCOM配置找不到Microsoft Excel应用程序的解决办法

    在运行栏中输入命令:dcomcnfg,打开组件服务管理窗口,但是却发现找不到Microsoft Excel程序,这主要是64位系统的问题,excel是32位的组件,所以在正常的系统组件服务里是看不到的 ...

  5. 从SQL中相对于日期的特定周获取数据

    目录 介绍 背景 所以我们需要更复杂一点 兴趣点 一个QA问题需要"最后一周的数据",这让我开始思考.使用带有"WW"间隔的DATEADD函数很容易,但这会从今 ...

  6. 浅析GDAL库C#版本支持中文路径问题

    GDAL库对于C#的支持问题还是蛮多的,对于中文路径的支持就是其中之一(另一个就是通过OGR库获取图形的坐标信息). 关于C#支持中文路径,看过我之前博客的应该都不陌生,如果使用的是我修改过的GDAL ...

  7. 开源GIS(十三)——openlayers通过geoserver中WFS添加要素

    目录 一.引言 二.WFS添加要素实现 三.WFS添加要素原理 1.请求xml 2.postman使用 3.要素添加 4.返回xml 四.总结 一.引言 ArcGIS server的要素增删改查实在是 ...

  8. linux unzip乱码,Linux 中unzip解压时中文乱码的解决办法

    Linux 中unzip解压时中文乱码的解决办法 Linux 中unzip解压时中文乱码的解决办法 当我们在linux中解压一个含有中文名字的压缩包如"资料.zip"时,如果直接使 ...

  9. ArcGIS JS API加载GeoServer发布的WFS服务

    文章目录 前言 主要代码 总结 参考链接 前言 WFS(Web Feature Service),OGC标准下的要素服务.其支持的主要操作如下: GetCapabilities (discovery ...

最新文章

  1. 硕博研究生期间应该明确的50件事
  2. 第六届上海市大学生网络安全大赛 | Wp
  3. rpc 服务器不可用_RPC和微服务
  4. 《DeepXDE:a deep learning library for solving differential equations》梳理
  5. 手机游戏中的社交互动与任务剧情
  6. 为什么大数据分析很重要
  7. 让MacOS废纸篓中超过30 天的文件自动清除
  8. 如何让你的Python程序支持多语言
  9. FreeRTOS学习-day01
  10. C语言判断上三角矩阵
  11. 小程序对接企业微信客服
  12. 笔记本电脑怎么拆开后盖_新手怎么拆解笔记本?笔记本拆机注意事项 (全文)
  13. c# 用action做参数进行封装操作
  14. Elastic: ILM与rollover的关系
  15. 外网下载速度过慢问题解决办法
  16. Java腾讯企业邮箱发送邮件
  17. js 中日期转换成时间戳
  18. pandas处理Excel基本方法
  19. Netty 是什么?
  20. 【python】如何用python生成并保存gif动态图

热门文章

  1. Android打包出多个dex文件,一个APK中包含多个dex方法
  2. 能不能翻译PHP网站源码,有朋友可以帮忙用PHP翻译一段PYTHON代码吗?
  3. Linux:(ubuntu)命令行下显示方框的问题
  4. MTK模拟器编译使用
  5. 两轮差速驱动机器人轮间距校准方法
  6. 洛谷——P1024 [NOIP2001 提高组] 一元三次方程求解
  7. 布尔型Boolean+undefined+null(JS)
  8. git的一些简单用法
  9. 蓝色星空背景互联网网络科技PPT模板
  10. Openresty 学习笔记(三)扩展库之neturl