设为首页 收藏本站
查看: 1249|回复: 0

[经验分享] GDAL添加ECW格式支持

[复制链接]

尚未签到

发表于 2017-6-4 10:03:18 | 显示全部楼层 |阅读模式
GDAL添加ECW格式支持
  本文翻译自 http://trac.osgeo.org/gdal/wiki/ECW,有少量的修改及补充。

ECW
  这个驱动程序的最终用户文档:​http://www.gdal.org/frmt_ecw.html

下载ECW JPEG SDK
  为了让GDAL可以使用ECW格式,你需要从Hexagon Geospatial网站下载ERDAS ECW/JP2 SDK。
  
4.3或更高版本的只读SDK(不支持写ECW文件)需要在同意许可条款后免费下载。如果要通过ECW SDK写ECW或JPEG2000文件,必须从Hexagon Geospatial/ERDAS购买可写版本的SDK.
  如果可以找到过期的libecwj 3.3 SDK,也可以使用它。它的许可信息有显著不同。下面的叙述和讨论基于3.3 SDK。

在Unix平台构建支持ECW的GDAL
  假设您已经在默认位置(LIBRARY_PATH)安装了libecwj库,那么将ECW支持添加到GDAL的过程很简单。
  
只需要在生成编译GDAL的Makefile的configure命令中添加ecw库的安装路径:
$ cd /path/to/gdal  
$ ./configure --with-ecw=/usr/local
  
$ make
  
# make install
  如果在构建中存在问题,可以查看gdal/frmts/ecw/GNUmakefile中的CPPFLAGS是否定义了-DPOSIX和-DLINUX。参考#3344
  在完成上面步骤后,可以查看GDAL已安装支持格式列表,可以看到有ECW:
$ gdalinfo --formats|grep ECW  ECW (rw): ERMapper Compressed Wavelets
  JP2ECW (rw+): ERMapper JPEG2000
  注意:所有依赖GDAL的服务都应该重启。例如:Apache需要重新加载PHP MapScript。

二进制ECW SDK和GCC >= 5.1
  由于GCC 5.1以后,GCC默认使用新的C++ ABI和libstdc++,它与ECW SDK二进制文件不兼容(至少当前如此)。解决的办法是使用CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0"选项去构建GDAL。
./configure CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0"  注意:如果你还使用别的使用新的C++ ABI的库(例如:likbml,podofo,poppler,cryptopp等,这通常来自发行版自带的),则这个方法无法正常使用。如果你必须使用这些库,你必须找到它们的源码,并使用CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0"选项重新编译。

在Linux上构建的教程
  ​http://trac.osgeo.org/ubuntugis/wiki/UserTutorials

在Windows上构建支持ECW的GDAL
  在nmake.opt中有以下使用4.1或更新的只读SDK构建读取支持的选项,去掉前面的注释,并修改ECWDIR只想的路径。
# Uncomment the following and update to enable ECW read support with the  
# 4.1+ readonly SDK
  
#ECWDIR  =  "c:/Program Files/ERDAS/ERDAS ECW JPEG2000 Read SDK"
  
#ECWFLAGS = -DECWSDK_VERSION=41 \
  
#       -I$(ECWDIR)\include \
  
#       -I$(ECWDIR)\include/ecw/api -I$(ECWDIR)\include/ecw/jp2 \
  
#       -I$(ECWDIR)\include/ecw/ecw
  
#ECWLIB  =  $(ECWDIR)\lib\vc90\win32\NCSEcw4_RO.lib \
  
#       $(ECWDIR)\lib\vc90\win32\NCSUtil4.lib \
  
#       $(ECWDIR)\lib\vc90\win32\NCScnet4.lib
  GDAL自带的nmake.opt还是默认的VS2008,比较老了。
  
实际上现在nmake.opt里面有两处关于ECWSDK的位置,最新版本的ECWSDK5需使用链接NCSEcw.lib或者静态库NCSEcwS.lib的即可。如果编译64位版本,还需要去掉WIN64=YES前的#,大致在189行。 例如在使用VS2015`编译的时候,修改的位置及结果如下:
# 45行位置,修改编译器版本  
MSVC_VER=1900
  

  
# 189行位置,编译64位版本
  
WIN64=YES
  

  
# 303行位置,修改libecwj路径
  
ECWDIR  =   "c:/Program Files/ERDAS ECW JPEG 2000 SDK 5.3.0"
  
ECWFLAGS =  -DECWSDK_VERSION=53 \
  -I$(ECWDIR)\include \
  -I$(ECWDIR)\include/NCSECW/API -I$(ECWDIR)\include/NCSECW/JP2 \
  -I$(ECWDIR)\include/NCSECW/ECW
  
ECWLIB  =   $(ECWDIR)\lib\VC140\x64\NCSEcw.lib
  一旦构建,则需要将一些ECW的dll拷贝到系统路径(程序工作目录也可)中(VC9环境下如下)
copy "C:\Program Files\ERDAS\ERDAS ECW JPEG2000 Read SDK\redistributable\vc90\win32\*.dll" C:\windows\system32  当前最新版本的为ECW JPEG 2000 SDK 5.3.0,使用VC11/12/14编译。
  以上将ECW的支持构建到GDAL核心DLL中。
  为了构建ECW和JP2ECW驱动程序作为插件,需要取消nmake.opt中注释的插件行:
# To build ECW support as a plugin uncomment the following, and make sure  
# to do "nmake /f makefile.vc plugin" in gdal/frmts/ecw and copy the two
  
# resulting DLLs to an appropriate place.
  
ECW_PLUGIN = YES
  然后到gdal/frmts/ecw(在GDAL构建后)中去创建插件plugins:
  nmake /f makefile.vc plugin  然后将该目录中生成的dll复制到合适的GDAL插件目录,例如.exe文件所在目录下的gdalplugins目录中,或着是GDAL_DRIVER_PATH配置选项(或环境变量)指向的目录。

在Unix上构建libecwj 3.3库
  为了在Linux``Solaris或Mac OS系统下使用具有ECW支持的GDAL,您需要自己构建libecwj库,因此需要下载Image Compression SDK源代码,而不是专门为Windows系统分发的二进制文件。当前版本是ECW SDK 3.3,源码包名为libecwj2-3.3-2006-09-06.zip。
  源码包中有configure和Makefile.in脚本,还有一个bootstrap脚本,可以重新生成configure和Makefile.in文件。请先确保已经安装了:autoconf, automake, m4, libtool程序。
  程序的构建示例如下:
$ cd /path/to/libecwj2-3.3  
$ ./configure
  
$ make
  
# make install
  上面配置没有指定安装路径,最后一步需要superuser权限。
  在SuSE 11(低版本gcc),你需要传递一个flag给configure脚本去使用c99兼容性。
$ cd /path/to/libecwj2-3.3  
$ ./configure CFLAGS="-std=c99"
  
$ make
  
# make install
  默认情况下,安装时使用prefix指向目录/usr/local来安装libecwj。你可以使用configure的--prefix选项指定。运行configure --help查看更多选项。如果编译libecwj使用了--prefix(例如/usr/local/libecwj2-3.3),则make install会失败,因为不会自动创建<prefix>/include。执行mkdir <prefix>/include(例如mkdir /usr/local/libecwj2-3.3/include),然后再次运行make install。
  在较新的平台(Fedora 16/17/18和RHEL/CentOS 6)上,libecwj2可以在读取JPEG2000文件时会导致程序崩溃。错误在与libecwj2绑定的XML处理代码中,显而易见,这是新的编译器带来的问题。上述平台的一个解决办法是在编译libecwj2时禁用优化,可以通过传递-O0来配置:
$ ./configure CFLAGS="-O0" CXXFLAGS="-O0"  或者在make时候指定:
$ make CFLAGS="-O0" CXXFLAGS="-O0"
Mac OS X notes
  在Mac OS X上构建libecwj2-3.3可能会有一点问题。相关详细信息,参阅#2032。

libecwj2-3.3 补丁
  使用最新的编译器从源码构建libecwj2-3.3可能需要一些改进,可以在#3162中找到libecwj2的修复程序和补丁程序中找到。
  综合累积可用补丁:
  
https://trac.osgeo.org/gdal/attachment/wiki/ECW/libecwj2-3.3.patch
  使用libecwj2-3.3打开和关闭ECW文件占用大量内存的问题,可以使用http://trac.osgeo.org/mapserver/ticket/3245补丁来解决。
  #3366中提供了一个补丁,来避免在libecwj2-3.3中的NCSPhysicalMemorySize()的linux实现中溢出。这个工作可以解决内存大于2G的计算机中大内存使用情况。
  A patch to fix crash when creating 16 bit JP2 (that occurs on 64bit platforms) is available in ticket #2593中提供了修复16 bit JP2(在64为平台发生)时出现故障的补丁。
  在最新的平台(如Fedora 17,使用GCC 4.7)上修复ECWInitialize()崩溃的补丁程序可在#4868中找到。

Open Tickets
  #2162 ecw_cs.dat文件出自多云天(provenance cloudy)
  
#2340 意大利基准(italian datum)问题。
  
#4127 [PATCH] ECW文件ecw_cs.wkt附加CRS定义。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-383394-1-1.html 上篇帖子: 使用WinSCP进行简单代码文件同步 下篇帖子: HBase导入SQL Server数据库数据
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表