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定義。
