GDAL添加ECW格式支持


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庫的安裝路徑:

$ 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++ ABIlibstdc++,它與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``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程序。

程序的構建示例如下:

$ cd /path/to/libecwj2-3.3
$ ./configure
$ make
# make install

上面配置沒有指定安裝路徑,最后一步需要superuser權限。

在SuSE 11(低版本gcc),你需要傳遞一個flagconfigure腳本去使用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定義。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM