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