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 SDKECWJPEG2000文件,必须从Hexagon Geospatial/ERDAS购买可写版本的SDK.

如果可以找到过期的libecwj 3.3 SDK,也可以使用它。它的许可信息有显著不同。下面的叙述和讨论基于3.3 SDK

在Unix平台构建支持ECW的GDAL

假设您已经在默认位置(LIBRARY_PATH)安装了libecwj库,那么将ECW支持添加到GDAL的过程很简单。

只需要在生成编译GDALMakefileconfigure命令中添加ecw库的安装路径:

  1. $ cd /path/to/gdal
  2. $ ./configure --with-ecw=/usr/local
  3. $ make
  4. # make install

如果在构建中存在问题,可以查看gdal/frmts/ecw/GNUmakefile中的CPPFLAGS是否定义了-DPOSIX-DLINUX。参考#3344

在完成上面步骤后,可以查看GDAL已安装支持格式列表,可以看到有ECW:

  1. $ gdalinfo --formats|grep ECW
  2. ECW (rw): ERMapper Compressed Wavelets
  3. JP2ECW (rw+): ERMapper JPEG2000

注意:所有依赖GDAL的服务都应该重启。例如:Apache需要重新加载PHP MapScript

二进制ECW SDK和GCC >= 5.1

由于GCC 5.1以后,GCC默认使用新的C++ ABIlibstdc++,它与ECW SDK二进制文件不兼容(至少当前如此)。解决的办法是使用CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0"选项去构建GDAL

  1. ./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只想的路径。

  1. # Uncomment the following and update to enable ECW read support with the
  2. # 4.1+ readonly SDK
  3. #ECWDIR = "c:/Program Files/ERDAS/ERDAS ECW JPEG2000 Read SDK"
  4. #ECWFLAGS = -DECWSDK_VERSION=41 \
  5. # -I$(ECWDIR)\include \
  6. # -I$(ECWDIR)\include/ecw/api -I$(ECWDIR)\include/ecw/jp2 \
  7. # -I$(ECWDIR)\include/ecw/ecw
  8. #ECWLIB = $(ECWDIR)\lib\vc90\win32\NCSEcw4_RO.lib \
  9. # $(ECWDIR)\lib\vc90\win32\NCSUtil4.lib \
  10. # $(ECWDIR)\lib\vc90\win32\NCScnet4.lib

GDAL自带的nmake.opt还是默认的VS2008,比较老了。

实际上现在nmake.opt里面有两处关于ECWSDK的位置,最新版本的ECWSDK5需使用链接NCSEcw.lib或者静态库NCSEcwS.lib的即可。如果编译64位版本,还需要去掉WIN64=YES前的#,大致在189行。 例如在使用VS2015`编译的时候,修改的位置及结果如下:

  1. # 45行位置,修改编译器版本
  2. MSVC_VER=1900
  3. # 189行位置,编译64位版本
  4. WIN64=YES
  5. # 303行位置,修改libecwj路径
  6. ECWDIR = "c:/Program Files/ERDAS ECW JPEG 2000 SDK 5.3.0"
  7. ECWFLAGS = -DECWSDK_VERSION=53 \
  8. -I$(ECWDIR)\include \
  9. -I$(ECWDIR)\include/NCSECW/API -I$(ECWDIR)\include/NCSECW/JP2 \
  10. -I$(ECWDIR)\include/NCSECW/ECW
  11. ECWLIB = $(ECWDIR)\lib\VC140\x64\NCSEcw.lib

一旦构建,则需要将一些ECW的dll拷贝到系统路径(程序工作目录也可)中(VC9环境下如下)

  1. 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中注释的插件行:

  1. # To build ECW support as a plugin uncomment the following, and make sure
  2. # to do "nmake /f makefile.vc plugin" in gdal/frmts/ecw and copy the two
  3. # resulting DLLs to an appropriate place.
  4. ECW_PLUGIN = YES

然后到gdal/frmts/ecw(在GDAL构建后)中去创建插件plugins:

  1. nmake /f makefile.vc plugin

然后将该目录中生成的dll复制到合适的GDAL插件目录,例如.exe文件所在目录下的gdalplugins目录中,或着是GDAL_DRIVER_PATH配置选项(或环境变量)指向的目录。

在Unix上构建libecwj 3.3库

为了在Linux``SolarisMac OS系统下使用具有ECW支持GDAL,您需要自己构建libecwj库,因此需要下载Image Compression SDK源代码,而不是专门为Windows系统分发的二进制文件。当前版本是ECW SDK 3.3,源码包名为libecwj2-3.3-2006-09-06.zip

源码包中有configureMakefile.in脚本,还有一个bootstrap脚本,可以重新生成configureMakefile.in文件。请先确保已经安装了:autoconf, automake, m4, libtool程序。

程序的构建示例如下:

  1. $ cd /path/to/libecwj2-3.3
  2. $ ./configure
  3. $ make
  4. # make install

上面配置没有指定安装路径,最后一步需要superuser权限。

在SuSE 11(低版本gcc),你需要传递一个flagconfigure脚本去使用c99兼容性。

  1. $ cd /path/to/libecwj2-3.3
  2. $ ./configure CFLAGS="-std=c99"
  3. $ make
  4. # 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来配置:

  1. $ ./configure CFLAGS="-O0" CXXFLAGS="-O0"

或者在make时候指定:

  1. $ 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定义。

GDAL添加ECW格式支持的更多相关文章

  1. GDAL打开HDF格式时遇到的中文路径问题(未解决)

    众所周知,中文环境下(VS2010 C++工程编码为多字节编码),在使用1.8.0版本以后的GDAL打开中文路径下的影像文件(如GeoTiff文件)时, 需对中文文件路径做特殊处理,有2种方法:(我使 ...

  2. deerlet-redis-client添加集群支持,邀请各路大神和菜鸟加入。

    引言 经过几周的修改,deerlet已经添加了对于redis集群的支持,策略与memcached客户端一样,采用一致性Hash.不过目前Hash的算法取自Java自带的String类型的HashCod ...

  3. MySQL 5.7原生JSON格式支持

    在MySQL与PostgreSQL的对比中,PG的JSON格式支持优势总是不断被拿来比较.其实早先MariaDB也有对非结构化的数据进行存储的方案,称为dynamic column,但是方案是通过BL ...

  4. Windowns的GVIM添加markdown语法支持

    gvim 7.4中其实也是有对markdown的语法文件,但格式支持并不全面,如行业代码``就没有实现. 修改方案: 从github下载plasticboy的markdown语法版本,windowns ...

  5. Intellij IDEA14 下添加ExtJS提示支持

    前言: 虽然Interlij IDEA比起Eclipse对待EXT更为支持,但自己上手后总不能达到Intellij 开发ExtJS 应用指南(http://blog.csdn.net/s4640368 ...

  6. yum安装的Nginx添加第三方模块支持tcp

    需求:生产有个接口是通过socket通信.nginx1.9开始支持tcp层的转发,通过stream实现的,而socket也是基于tcp通信. 实现方法:Centos7.2下yum直接安装的nginx, ...

  7. java PDF添加图层,支持多页图层添加

     java PDF添加图层,支持多页图层添加 代码: import java.io.File; import java.io.FileOutputStream; import java.io.IOEx ...

  8. IdentityServer4 中文文档 -12- (快速入门)添加外部认证支持

    IdentityServer4 中文文档 -12- (快速入门)添加外部认证支持 原文:http://docs.identityserver.io/en/release/quickstarts/4_e ...

  9. [WPF]为旧版本的应用添加触控支持

    之前做WPF开发时曾经遇到这样一个需求:为一个基于 .NET Framework 3.5开发的老旧WPF程序添加触控支持,以便于大屏触控展示. 接手之后发现这是一个大坑. 项目最初的时候完全没考虑过软 ...

随机推荐

  1. Resultset转Bean工具类

    package org.pandas.webIdp.webOP.help; import java.lang.reflect.Field; import java.lang.reflect.Metho ...

  2. 【BZOJ】【4152】【AMPZZ2014】The Captain

    最短路 题解:http://zyfzyf.is-programmer.com/posts/97953.html 按x坐标排序,相邻点之间连边.满足dist(x1,x3)<=dist(x1,x2) ...

  3. ofstream的使用方法--超级精细。C++文件写入、读出函数(转)

    ofstream的使用方法ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;  在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的, ...

  4. 【Spark】Spark Streaming 动态更新filter关注的内容

    Spark Streaming 动态更新filter关注的内容 spark streaming new thread on driver_百度搜索 (1 封私信)Spark Streaming 动态更 ...

  5. 转:RNN(Recurrent Neural Networks)

    RNN(Recurrent Neural Networks)公式推导和实现 http://x-algo.cn/index.php/2016/04/25/rnn-recurrent-neural-net ...

  6. java 从网络Url中下载文件 (转)

    http://blog.csdn.net/xb12369/article/details/40543649/ /**       * 从网络Url中下载文件       * @param urlStr ...

  7. 一个小框架,基于rx_retrofit2_mvp

    离职在即,也没什么事情做,就鼓捣了一下.任意搭建了一个小框架,看看以后能不能搞出自己的一个model,好了.不说别的,上代码 1,先上依赖库 compile 'io.reactivex:rxandro ...

  8. Sphinx + Coreseek 实现中文分词搜索

    Sphinx + Coreseek 实现中文分词搜索 Sphinx Coreseek 实现中文分词搜索 全文检索 1 全文检索 vs 数据库 2 中文检索 vs 汉化检索 3 自建全文搜索与使用Goo ...

  9. IIS 7.5: HOW TO ENABLE TLS 1.1 AND TLS 1.2

    In IIS 7.5, which is installed on Windows 2008 R2 servers, only SSL 3.0 and TLS 1.0 are enabled for ...

  10. BigDecimal 的幂次方运算

    public static void main(String[] args){ BigDecimal bg1, bg2; bg1 = new BigDecimal("200000.45&qu ...