Сборка GDAL 1.9.0 с использованием Visual Studio 2010: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Нет описания правки
Строка 1: Строка 1:
{{Статья|Черновик}}
{{Статья|Черновик}}


== Сборка библиотеки GDAL 1.9.0 с использованием Visual Studio 2010 ==  
== Введение ==  
В мире все развивается и это касается так же программного обеспечения, а именно выходят новые версии библиотек и новые версии программ для разработки. Поэтому в данной статье речь пойдет о сборке библиотеки GDAL 1.9.0 на Visual Studio 2010.  
В данной статье пойдет речь о сборке библиотеки GDAL 1.9.0 на Visual Studio 2010. Библиотека [http://gdal.org/ GDAL] - это библиотека для работы с растровыми географическими форматами файлов данных. GDAL распространяется [http://www.osgeo.org/ Open Source Geospatial Foundation] на условиях лицензии [http://trac.osgeo.org/gdal/wiki/FAQGeneral#WhatlicensedoesGDALOGRuse X/MIT] , то есть является проектом [http://www.opensource.org/ с открытым исходным кодом]. Как библиотека GDAL предоставляет вызывающему приложению [http://gdal.org/gdal_datamodel_ru.html единую обобщённую модель данных] для всех поддерживаемых форматов файлов данных. Помимо этого в состав GDAL входит [http://gdal.org/gdal_utilities.html набор вспомогательных программ], вызываемых из командной строки, для преобразования и обработки данных.


===== Оглавление =====
Для сборки GDAL и библиотек от которых она зависит будет использоваться система сборки [http://www.cmake.org/ CMake].


# Краткая информация о структуре библиотеки GDAL
В настоящий момент не существует официального скрипта для сборки GDAL при помощи Cmake. Поэтому, данный метод следует рассматривать в качестве примера сборки и одного из вариантов (унифицированный способ сборки посредством CMake).
# Сборка зависимых библиотек
Кроме того, сборка представляет собой минимальный набор поддерживаемых растровых и векторных драйверов.
# Сборка GDAL
# Тестовый пример


===== 1. Краткая информация о структуре библиотеки GDAL =====  
== Структура библиотеки GDAL ==
Библиотека GDAL состоит из 3-х частей:
Библиотека GDAL состоит из 3-х основных частей:
#CPL - базовые функции работы с файловой системой, строками, xml и т.п.<br />
#CPL - базовые функции работы с файловой системой, строками, xml и т.п.<br />
#OGR - работа с векторными форматами. Список форматов: http://www.gdal.org/ogr/ogr_formats.html<br />
#OGR - работа с векторными форматами. Список форматов размещен здесь: http://www.gdal.org/ogr/ogr_formats.html<br />
#GDAL - работа с растровыми форматами. Список форматов: http://www.gdal.org/formats_list.html <br />
#GDAL - работа с растровыми форматами. Список форматов размещен здесь: http://www.gdal.org/formats_list.html <br />


OGR и GDAL обеспечивают не только поддержку форматов, но и операции работы с векторами и растрами. Т.е. GDAL позволяет не только считывать но и манипулировать с геоданными. <br />
OGR и GDAL обеспечивают не только поддержку форматов, но и операции работы с векторами и растрами. Т.е. GDAL позволяет не только считывать но и манипулировать с геоданными. <br />


'''Теперь про зависимости.''' Компонент CPL (исходники лежат в подпапке port) зависит от библиотек: zlib, curl. <br />
'''Про зависимости.''' Компонент CPL (исходники лежат в подпапке port) зависит от библиотек: zlib, curl. <br />
OGR зависит от многих библиотек, но базовый набор от expat, geos и proj. <br />
OGR зависит от многих библиотек, но базовый набор от expat, geos и proj. <br />
GDAL зависит от tiff, jpeg, png. <br />
GDAL зависит от tiff, jpeg, png. <br />


Тут надо понимать что такое драйвер. Это отдельный плагин обеспечивающий поддержку формата из списка. В таблице  http://www.gdal.org/formats_list.html  можно посмотреть что от чего зависит. Иногда драйвер не зависит ни от чего и компилировать его просто. Иногда нужна еще отдельная библиотека или набор библиотек.<br />
Следует понимать что такое драйвер. Драйвер - это отдельный плагин обеспечивающий поддержку формата из списков, приведенных выше. В этих списках можно посмотреть, что от чего зависит. Иногда драйвер не зависит ни от какой из сторонних библиотек и компилировать его просто. Иногда нужна еще отдельная библиотека или целый набор библиотек.<br />


'''Коротко о сборке.''' В зависимости от необходимости можно собрать GDAL именно в той конфигурации, что нужна (с определенным перечнем драйверов).<br />
'''О сборке.''' В зависимости от необходимости можно собрать GDAL именно в той конфигурации, что нужна (с определенным перечнем драйверов). Собирать будем пошагово: вначале все зависимые библиотеки, затем сам GDAL. Для простоты предлагается делать это все с использованием системы сборки CMake. Для большинства библиотек уже имеются скрипты CMake и сборка становится однотипной и простой. Заодно на выходе будут привычные проекты Visual Studio, где можно зайти в свойства и посмотреть, что и как.
Собирать будем пошагово: вначале все зависимые библиотеки, затем сам GDAL. Для простоты предлагаю делать это все с использованием системы сборки CMake. <br />
Суть в том что для большинства библиотек разработаны скрипты CMake и сборка становится однотипной и простой. Заодно на выходе будут привычные проекты Visual Studio, где можно залезть в свойсnва и посмотреть, что и как.<br />


===== 2. Сборка зависимых библиотек =====
Поэтому скачиваем последнюю версию системы сборки CMake по адресу http://www.cmake.org/cmake/resources/software.html (на текущий момент последняя версия http://www.cmake.org/files/v2.8/cmake-2.8.7-win32-x86.exe) и ставим ее.  
Первой библиотекой будем компилировать '''expat'''.<br />
 
'''''Первое''''': скачиваем систему сборки cmake http://www.cmake.org/files/v2.8/cmake-2.8.7-win32-x86.exe и ставим ее.<br />
== Сборка зависимых библиотек ==
'''''Второе''''': берем файл отсюда http://sourceforge.net/projects/expat/files/expat/2.0.1/ под названием expat-2.0.1.tar.gz - это последняя стабильная версия на 20.03.2012 и распаковываем в папку где у нас будут храниться все проекты для сборки библиотек, например сюда ''C:\project\expat-2.0.1\''. Обратите внимание, что эта и все последующие папки должны быть разархивированы так, что в конечной папке, в данном случае expat-2.0.1, должны лежать различные папки и файлы (см. Рис. 1), а не вложенная папка expat-2.0.1(для данного примера).<br />
=== Библиотека expat ===
[[Файл:Рис. 1.JPG|center|Рис. 1]]
Первой библиотекой будем компилировать '''expat'''.
'''Рис. 1'''<br />
 
<br />
Скачиваем исходные тексты библиотеки отсюда http://sourceforge.net/projects/expat/files/expat/2.0.1/ (актуальная версия на момент написания находится в файле под названием expat-2.0.1.tar.gz) и распаковываем в папку, где у нас будут храниться все проекты для сборки библиотек. Например, по следующему пути
'''''Третье''''': скачиваем фаил CMakeLists.txt [[Файл:CMakeLists.zip]] и помещаем в разархивированную папку expat-2.0.1.<br />
C:\project\expat-2.0.1\
Обратите внимание, что эта и все последующие папки должны быть разархивированы так, что в конечной папке, в данном случае expat-2.0.1, должны лежать различные папки и файлы (см. Рис. 1), а не вложенная папка expat-2.0.1 (для данного примера).
 
[[Файл:Рис. 1.JPG|мини|центр|300пкс|Структура директории]]
 
Далее скачиваем файл CMakeLists.txt ([[Файл:CMakeLists.zip]]) и помещаем в разархивированную папку expat-2.0.1.


Далее запускаем CMake и указываем два пути:
Далее запускаем CMake и указываем два пути:
''Where is the source code'' - это то, куда вы разархивировали expat, например ''C:/project/expat-2.0.1'' и
''Where is the source code'' - это то, куда вы разархивировали expat, например ''C:/project/expat-2.0.1'' и
''Where to build the binaries'' – это та папка, куда сгенерируются файлы проекта ''C:/project/expat-2.0.1/build''.
''Where to build the binaries'' – это та папка, куда сгенерируются файлы проекта ''C:/project/expat-2.0.1/build''.
Нажимаем кнопку ''Configure'' и выбираем версию Visual Studio(в нашем случае Visual Studio 2010), если выдаст ошибку, нажимаем еще раз. После нажимаем кнопку Generate (см. Рис. 2).
Нажимаем кнопку ''Configure'' и выбираем версию Visual Studio(в нашем случае Visual Studio 2010), если выдаст ошибку, нажимаем еще раз. После нажимаем кнопку Generate.
[[Файл:Рис. 2.JPG|center|Рис. 2]]
 
'''Рис. 2'''<br />
[[Файл:Рис. 2.JPG|мини|центр|300пкс|Окно интерфейса пользователя Cmake]]
 
В папке ''build'' должен появиться фаил ''libexpat.sln''. Открываем его с помощью Visual Studio, выставляем сверху  
В папке ''build'' должен появиться фаил ''libexpat.sln''. Открываем его с помощью Visual Studio, выставляем сверху  
Тип сборки ''Release'' вместо ''Debug'' (см Рис. 3) и компилируем проект(нажимаем F7).  
Тип сборки ''Release'' вместо ''Debug'' и компилируем проект (нажимаем F7).  
[[Файл:Рис. 3.JPG|center|Рис. 3]]
 
'''Рис. 3'''<br />
[[Файл:Рис. 3.JPG|мини|центр|300пкс|Выбор типа сборки]]


После этого в папке ''C:/projects/expat-2.0.1/lib/Release'' (далее все скомпилированные библиотеки будем класть в схожие папки ''lib/Release'') должны появиться следующие файлы
После этого в папке ''C:/projects/expat-2.0.1/lib/Release'' (далее все скомпилированные библиотеки будем класть в схожие папки ''lib/Release'') должны появиться следующие файлы
''libexpat.dll''<br />
*libexpat.dll
''libexpat.exp''<br />
*libexpat.exp
''libexpat.lib''<br />
*libexpat.lib
 
Это мы скомпилировали так называему '''shared dll'''. Есть еще '''static dll''' - тогда на выходе только ''libexpat.lib''. Потом ''libexpat.dll'' надо будет скопировать в папку с вашей программой. Туда же надо будет кидать все зависимые библиотеки.


Это мы скомпилировали так называему '''shared dll'''. Есть еще '''Static dll''' - тогда на выходе только ''libexpat.lib''. Потом ''libexpat.dll'' надо будет скопировать в папку с вашей программой. Туда надо будет кидать все зависимые библиотеки.<br />
=== Библиотека zlib ===


'''Далее делаем тоже самое для zlib''', качаем ее отсюда http://zlib.net/zlib126.zip CmakeLists.txt в архив уже включена. Разархивируем ''C:\project\zlib-1.2.6''<br />
'''Далее делаем тоже самое для zlib''', качаем ее отсюда http://zlib.net/zlib126.zip CmakeLists.txt в архив уже включена. Разархивируем ''C:\project\zlib-1.2.6''<br />
Строка 67: Строка 71:


После всего этого компилируем проект и получаем 3 файла в папке ''C:/project/zlib-1.2.6/Debug/Release''. Перенесем их в папку ''C:/project/zlib-1.2.6/lib/Release'' для унификации, эту папку необходимо создать самим.<br />
После всего этого компилируем проект и получаем 3 файла в папке ''C:/project/zlib-1.2.6/Debug/Release''. Перенесем их в папку ''C:/project/zlib-1.2.6/lib/Release'' для унификации, эту папку необходимо создать самим.<br />
=== Библиотека geos ===


'''Далее соберем библиотеку geos'''. Качаем отсюда http://trac.osgeo.org/geos/ последнюю версию http://download.osgeo.org/geos/geos-3.3.2.tar.bz2 . Извлекаем в ''C:\project\geos-3.3.2'' . Делаем конфигурацию в CMake, после этого в разделе Ungrouped Entries убираем калочку с BUILD_TESTING (см. Рис. 5). Примечание, чтобы у вас появился раздел Ungrouped Entries, поставьте галки в Grouped и Advanced (см. Рис. 5).
'''Далее соберем библиотеку geos'''. Качаем отсюда http://trac.osgeo.org/geos/ последнюю версию http://download.osgeo.org/geos/geos-3.3.2.tar.bz2 . Извлекаем в ''C:\project\geos-3.3.2'' . Делаем конфигурацию в CMake, после этого в разделе Ungrouped Entries убираем калочку с BUILD_TESTING (см. Рис. 5). Примечание, чтобы у вас появился раздел Ungrouped Entries, поставьте галки в Grouped и Advanced (см. Рис. 5).
Строка 86: Строка 92:
''str[i] = toupper(str[i]);''<br />
''str[i] = toupper(str[i]);''<br />
и скомпилируйте еще раз. После того как все закончится успешно скопируйте файлы из папки ''C:\project\geos-3.3.2\build\lib\Release'' в папку ''C:\project\geos-3.3.2\lib\Release''.<br />
и скомпилируйте еще раз. После того как все закончится успешно скопируйте файлы из папки ''C:\project\geos-3.3.2\build\lib\Release'' в папку ''C:\project\geos-3.3.2\lib\Release''.<br />
=== Библиотека curl ===


'''Далее соберем  curl.''' Качаем отсюда http://curl.haxx.se/download.html последнюю версию http://curl.haxx.se/download/curl-7.24.0.zip и разархивируем в ''C:\project\curl-7.24.0''. Идем в CMake, указываем пути и нажимаем Configurate. Далее прописываем в<br />
'''Далее соберем  curl.''' Качаем отсюда http://curl.haxx.se/download.html последнюю версию http://curl.haxx.se/download/curl-7.24.0.zip и разархивируем в ''C:\project\curl-7.24.0''. Идем в CMake, указываем пути и нажимаем Configurate. Далее прописываем в<br />
Строка 103: Строка 111:
Нажимаем применить и ОК, далее компилируем проект. После успешной компиляции помещаем файлы из папки ''C:\project\curl-7.24.0\build\lib\Debug'' в папку ''C:\project\curl-7.24.0\lib\Realese'' <br />
Нажимаем применить и ОК, далее компилируем проект. После успешной компиляции помещаем файлы из папки ''C:\project\curl-7.24.0\build\lib\Debug'' в папку ''C:\project\curl-7.24.0\lib\Realese'' <br />


'''Далее будем собирать ibjpeg'''  - брать здесь http://www.ijg.org/ последнюю версию http://www.ijg.org/files/jpegsr8d.zip .
=== Библиотека libjpeg ===
'''Далее будем собирать libjpeg'''  - брать здесь http://www.ijg.org/ последнюю версию http://www.ijg.org/files/jpegsr8d.zip .
CMakeLists скачиваем тут [[Файл:CMakeListsjpeg.zip]] и разархивируем, кладем в папку ''C:\project\jpeg-8d''.<br />
CMakeLists скачиваем тут [[Файл:CMakeListsjpeg.zip]] и разархивируем, кладем в папку ''C:\project\jpeg-8d''.<br />
Запускаем CMAke и делаем ''configurate'', затем ''Generate''. Идем в папку ''Debug'', открываем ''libjpeg.sln'', ставим ''Realese'' и компилируем. <br />
Запускаем CMAke и делаем ''configurate'', затем ''Generate''. Идем в папку ''Debug'', открываем ''libjpeg.sln'', ставим ''Realese'' и компилируем. <br />
=== Библиотека libpng ===


'''Далее будем собирать libpng''' - брать здесь http://www.libpng.org/pub/png/libpng.html последнюю версию http://download.sourceforge.net/libpng/lpng159.zip . Разархивировать, запустить CMake, произвести конфигурацию. Прописываем пути для ZLIB_INCLUDE_DIR и ZLIB_LIBRARY-NOTFOUND как делали это выше.  Нажимаем Configurate и Generate, далее открываем libpng.sln, ставим Release и компилируем. Файлы из папки ''C:\project\lpng159\build\Release'' переносим в ''C:\project\lpng159\lib\Release''.<br />
'''Далее будем собирать libpng''' - брать здесь http://www.libpng.org/pub/png/libpng.html последнюю версию http://download.sourceforge.net/libpng/lpng159.zip . Разархивировать, запустить CMake, произвести конфигурацию. Прописываем пути для ZLIB_INCLUDE_DIR и ZLIB_LIBRARY-NOTFOUND как делали это выше.  Нажимаем Configurate и Generate, далее открываем libpng.sln, ставим Release и компилируем. Файлы из папки ''C:\project\lpng159\build\Release'' переносим в ''C:\project\lpng159\lib\Release''.<br />
=== Библиотека libtiff ===


'''Дальше собираем libtiff''' - брать здесь ftp://ftp.remotesensing.org/pub/libtiff последнюю версию ftp://ftp.remotesensing.org/pub/libtiff/tiff-4.0.1.zip , разархивируем ''C:\project\tiff-4.0.1'', качаем CMakeLists и еще пару файлов и разархивируем как обычно [[Файл:Tiff.zip]]. Запускаем CMakt, делаем ''Configurate'' и прописываем пути для ZLIB_INCLUDE_DIR и ZLIB_LIBRARY-NOTFOUND как делали это выше.  Нажимаем ''Configurate'' и ''Generate'', далее открываем ''libtiff.sln'' ставим ''Release'' и компилируем.<br />
'''Дальше собираем libtiff''' - брать здесь ftp://ftp.remotesensing.org/pub/libtiff последнюю версию ftp://ftp.remotesensing.org/pub/libtiff/tiff-4.0.1.zip , разархивируем ''C:\project\tiff-4.0.1'', качаем CMakeLists и еще пару файлов и разархивируем как обычно [[Файл:Tiff.zip]]. Запускаем CMakt, делаем ''Configurate'' и прописываем пути для ZLIB_INCLUDE_DIR и ZLIB_LIBRARY-NOTFOUND как делали это выше.  Нажимаем ''Configurate'' и ''Generate'', далее открываем ''libtiff.sln'' ставим ''Release'' и компилируем.<br />
=== Библиотека proj ===


'''Последняя из этих библиотек proj''' - брать здесь http://trac.osgeo.org/proj/ последнюю версию http://download.osgeo.org/proj/proj-4.8.0.zip . Разархивируем, кидаем туда этот фаил [[Файл:CMakeListsproj.zip]], запускаем CMake, прописываем пути до proj, жмем ''Configurate'' и ''Generate'', открываем ''proj4.sln'', ставим ''Release'' и компилируем.
'''Последняя из этих библиотек proj''' - брать здесь http://trac.osgeo.org/proj/ последнюю версию http://download.osgeo.org/proj/proj-4.8.0.zip . Разархивируем, кидаем туда этот фаил [[Файл:CMakeListsproj.zip]], запускаем CMake, прописываем пути до proj, жмем ''Configurate'' и ''Generate'', открываем ''proj4.sln'', ставим ''Release'' и компилируем.
На этом вся подготовка закончена, у нас есть все необходимые библиотеки.<br />
На этом вся подготовка закончена, у нас есть все необходимые библиотеки.<br />


===== 3. Сборка GDAL =====
== Сборка GDAL ==
Приступаем к сборке самого '''GDAL'''.<br />
 
Приступаем к сборке самого '''GDAL'''.
 
Скачиваем отсюда http://trac.osgeo.org/gdal/wiki/DownloadSource последнюю версию gdal 1.9.0 ( http://download.osgeo.org/gdal/gdal190.zip ). Качаем архив [[Файл:Gdal_trank.zip]] . Разархивируем gdal в папку ''project'', в разархивированную папку gdal разархивируем файлы из архива ''Gdal_trank.zip'' : папку cmake и файл CMakeLists.<br />
Скачиваем отсюда http://trac.osgeo.org/gdal/wiki/DownloadSource последнюю версию gdal 1.9.0 ( http://download.osgeo.org/gdal/gdal190.zip ). Качаем архив [[Файл:Gdal_trank.zip]] . Разархивируем gdal в папку ''project'', в разархивированную папку gdal разархивируем файлы из архива ''Gdal_trank.zip'' : папку cmake и файл CMakeLists.<br />


Строка 131: Строка 148:
  Нажимаем ''Configure'', все должно закончиться успешно, нажимаем ''Generate''. Далее идем в папку ''C:\project\gdal-1.9.0\build'' и открываем файл ''gdallib.sln'' с помощью visual studio. Ставим ''Release''  и компилируем. Если все прошло без ошибок, '''вы собрали GDAL! Поздравляю!'''<br />
  Нажимаем ''Configure'', все должно закончиться успешно, нажимаем ''Generate''. Далее идем в папку ''C:\project\gdal-1.9.0\build'' и открываем файл ''gdallib.sln'' с помощью visual studio. Ставим ''Release''  и компилируем. Если все прошло без ошибок, '''вы собрали GDAL! Поздравляю!'''<br />


===== 4. Тестовый пример ===== 
== Тестовый пример ==  
Теперь можно попробовать сделать тестовый пример для проверки работоспособности c этого сайта http://www.gdal.org/gdal_tutorial_ru.html .<br />
Теперь можно попробовать сделать тестовый пример для проверки работоспособности c этого сайта http://www.gdal.org/gdal_tutorial_ru.html .<br />
  Создадим консольный проект C++ CLR. Пропишем следующие пути:<br />
  Создадим консольный проект C++ CLR. Пропишем следующие пути:<br />
Строка 143: Строка 160:


Так же необходимо в папку, где содержатся файлы проекта положить сформированные dll, собрынные нами ранее вместе с файлами .lib:<br />
Так же необходимо в папку, где содержатся файлы проекта положить сформированные dll, собрынные нами ранее вместе с файлами .lib:<br />
gdal19.dll <br />
*gdal19.dll
geos.dll <br />
*geos.dll
geos_c.dll <br />
*geos_c.dll
libcurl.dll <br />
*libcurl.dll
libexpat.dll <br />
*libexpat.dll
libjpeg.dll <br />
*libjpeg.dll
libpng15.dll <br />
*libpng15.dll
libtiff.dll <br />
*libtiff.dll
proj4.dll <br />
*proj4.dll
zlib1.dll <br />
*zlib1.dll
 
Так же в эту папку положите какой-нибудь рисунок и напишите его имя вместо моего, у меня это 1.JPG.
 
Так выглядит мой код^


Так же в эту папку положите какой-нибудь рисунок и напишите его имя вместо моего, у меня это 1.JPG.<br />
<source lang=cpp>
Так выглядит мой код:<br />
'''тут надо как-то сделать, чтобы весь текст был кодом''' <br />
#include "stdafx.h"
#include "stdafx.h"
#include "gdal_priv.h"
#include "gdal_priv.h"
Строка 164: Строка 183:
     GDALDataset  *poDataset;
     GDALDataset  *poDataset;
     GDALAllRegister();
     GDALAllRegister();
     poDataset = (GDALDataset *) GDALOpen( "1.JPG", GA_ReadOnly ); // здесь надо заменить имя рисунка
     poDataset = (GDALDataset *) GDALOpen( "1.JPG", GA_ReadOnly ); // здесь надо указать путь до изображения
if( poDataset == NULL )
if( poDataset == NULL )
     {
     {
Строка 187: Строка 206:
     return 0;
     return 0;
}
}
</source>


Ну вот и все. На этом данная статья заканчивается. В ней Вы научились собирать '''GDAL''' и сделали тестовый пример для работы с ним. Успехов. Комментарии и отзывы приветствуются.
Ну вот и все. На этом данная статья заканчивается. В ней Вы научились собирать '''GDAL''' и сделали тестовый пример для работы с ним. Успехов. Комментарии и отзывы приветствуются.

Версия от 00:05, 5 апреля 2012

Эта страница является черновиком статьи.


Введение

В данной статье пойдет речь о сборке библиотеки GDAL 1.9.0 на Visual Studio 2010. Библиотека GDAL - это библиотека для работы с растровыми географическими форматами файлов данных. GDAL распространяется Open Source Geospatial Foundation на условиях лицензии X/MIT , то есть является проектом с открытым исходным кодом. Как библиотека GDAL предоставляет вызывающему приложению единую обобщённую модель данных для всех поддерживаемых форматов файлов данных. Помимо этого в состав GDAL входит набор вспомогательных программ, вызываемых из командной строки, для преобразования и обработки данных.

Для сборки GDAL и библиотек от которых она зависит будет использоваться система сборки CMake.

В настоящий момент не существует официального скрипта для сборки GDAL при помощи Cmake. Поэтому, данный метод следует рассматривать в качестве примера сборки и одного из вариантов (унифицированный способ сборки посредством CMake). Кроме того, сборка представляет собой минимальный набор поддерживаемых растровых и векторных драйверов.

Структура библиотеки GDAL

Библиотека GDAL состоит из 3-х основных частей:

  1. CPL - базовые функции работы с файловой системой, строками, xml и т.п.
  2. OGR - работа с векторными форматами. Список форматов размещен здесь: http://www.gdal.org/ogr/ogr_formats.html
  3. GDAL - работа с растровыми форматами. Список форматов размещен здесь: http://www.gdal.org/formats_list.html

OGR и GDAL обеспечивают не только поддержку форматов, но и операции работы с векторами и растрами. Т.е. GDAL позволяет не только считывать но и манипулировать с геоданными.

Про зависимости. Компонент CPL (исходники лежат в подпапке port) зависит от библиотек: zlib, curl.
OGR зависит от многих библиотек, но базовый набор от expat, geos и proj.
GDAL зависит от tiff, jpeg, png.

Следует понимать что такое драйвер. Драйвер - это отдельный плагин обеспечивающий поддержку формата из списков, приведенных выше. В этих списках можно посмотреть, что от чего зависит. Иногда драйвер не зависит ни от какой из сторонних библиотек и компилировать его просто. Иногда нужна еще отдельная библиотека или целый набор библиотек.

О сборке. В зависимости от необходимости можно собрать GDAL именно в той конфигурации, что нужна (с определенным перечнем драйверов). Собирать будем пошагово: вначале все зависимые библиотеки, затем сам GDAL. Для простоты предлагается делать это все с использованием системы сборки CMake. Для большинства библиотек уже имеются скрипты CMake и сборка становится однотипной и простой. Заодно на выходе будут привычные проекты Visual Studio, где можно зайти в свойства и посмотреть, что и как.

Поэтому скачиваем последнюю версию системы сборки CMake по адресу http://www.cmake.org/cmake/resources/software.html (на текущий момент последняя версия http://www.cmake.org/files/v2.8/cmake-2.8.7-win32-x86.exe) и ставим ее.

Сборка зависимых библиотек

Библиотека expat

Первой библиотекой будем компилировать expat.

Скачиваем исходные тексты библиотеки отсюда http://sourceforge.net/projects/expat/files/expat/2.0.1/ (актуальная версия на момент написания находится в файле под названием expat-2.0.1.tar.gz) и распаковываем в папку, где у нас будут храниться все проекты для сборки библиотек. Например, по следующему пути

C:\project\expat-2.0.1\

Обратите внимание, что эта и все последующие папки должны быть разархивированы так, что в конечной папке, в данном случае expat-2.0.1, должны лежать различные папки и файлы (см. Рис. 1), а не вложенная папка expat-2.0.1 (для данного примера).

Структура директории

Далее скачиваем файл CMakeLists.txt (Файл:CMakeLists.zip) и помещаем в разархивированную папку expat-2.0.1.

Далее запускаем CMake и указываем два пути: Where is the source code - это то, куда вы разархивировали expat, например C:/project/expat-2.0.1 и Where to build the binaries – это та папка, куда сгенерируются файлы проекта C:/project/expat-2.0.1/build. Нажимаем кнопку Configure и выбираем версию Visual Studio(в нашем случае Visual Studio 2010), если выдаст ошибку, нажимаем еще раз. После нажимаем кнопку Generate.

Окно интерфейса пользователя Cmake

В папке build должен появиться фаил libexpat.sln. Открываем его с помощью Visual Studio, выставляем сверху Тип сборки Release вместо Debug и компилируем проект (нажимаем F7).

Выбор типа сборки

После этого в папке C:/projects/expat-2.0.1/lib/Release (далее все скомпилированные библиотеки будем класть в схожие папки lib/Release) должны появиться следующие файлы

  • libexpat.dll
  • libexpat.exp
  • libexpat.lib

Это мы скомпилировали так называему shared dll. Есть еще static dll - тогда на выходе только libexpat.lib. Потом libexpat.dll надо будет скопировать в папку с вашей программой. Туда же надо будет кидать все зависимые библиотеки.

Библиотека zlib

Далее делаем тоже самое для zlib, качаем ее отсюда http://zlib.net/zlib126.zip CmakeLists.txt в архив уже включена. Разархивируем C:\project\zlib-1.2.6
При нажатии на кнопку Configure в самом конце cmake напишет следующее сообщение: CMake Error at CMakeLists.txt:65 (message):

 You must remove C:/project/zlib-1.2.6/zconf.h from the
 source tree.  This file is included with zlib but CMake generates this file
 for you automatically in the build directory.

Здесь говорится, что нужно стереть файл C://project/zlib-1.2.6/zconf.h т.к. он сгенерил новый. После того как сотрете опять нажимайте Configure, процесс должен закончиться без ошибок, после запускайте Generate. Далее идем в папку build и открываем файл zlib.sln с помощью Visual Studio(далее VS), ставим Release. А так же заходим в меню в пункт Построение и выбираем диспетчер конфигураций, после этого снимаем галочки с examles и minizip они нам не понадобятся (Рис. 4), если же будут нужны, необходимо в свойствах этих проектов прописать путь к zlib.h.

Рис. 4

Рис. 4

После всего этого компилируем проект и получаем 3 файла в папке C:/project/zlib-1.2.6/Debug/Release. Перенесем их в папку C:/project/zlib-1.2.6/lib/Release для унификации, эту папку необходимо создать самим.

Библиотека geos

Далее соберем библиотеку geos. Качаем отсюда http://trac.osgeo.org/geos/ последнюю версию http://download.osgeo.org/geos/geos-3.3.2.tar.bz2 . Извлекаем в C:\project\geos-3.3.2 . Делаем конфигурацию в CMake, после этого в разделе Ungrouped Entries убираем калочку с BUILD_TESTING (см. Рис. 5). Примечание, чтобы у вас появился раздел Ungrouped Entries, поставьте галки в Grouped и Advanced (см. Рис. 5).

Рис. 5

Рис. 5

Далее нажимаем Generate и открываем в VS файл C:\project\geos-3.3.2\build\geos.sln , выставляем Release и компилируем. Если у вас возникла ошибка
Ошибка 1 error C2668: log: неоднозначный вызов перегруженной функции C:\project\geos-3.3.2\src\operation\buffer\BufferOp.cpp 97 1 geos-static
кликните по ней 2 раза мышкой и в открывшемся файле замените строчку
int bufEnvPrecisionDigits = (int) (std::log(bufEnvMax) / std::log(10) + 1.0); тут надо сделать шрифт как код
на
int bufEnvPrecisionDigits = (int) (std::log(bufEnvMax) / std::log(10.0) + 1.0); и тут
и скомпилируйте заново.
Далее если возникла ошибка
Ошибка 1 error C2039: toupper: не является членом "std" C:\project\geos-3.3.2\tests\unit\capi\GEOSisValidDetailTest.cpp 60 1 geos_unit
кликните по ней 2 раза мышкой и в открывшемся файле сверху припишите #include <ctype.h>, а вместо
str[i] = std::toupper(str[i]);
напишите
str[i] = toupper(str[i]);
и скомпилируйте еще раз. После того как все закончится успешно скопируйте файлы из папки C:\project\geos-3.3.2\build\lib\Release в папку C:\project\geos-3.3.2\lib\Release.

Библиотека curl

Далее соберем curl. Качаем отсюда http://curl.haxx.se/download.html последнюю версию http://curl.haxx.se/download/curl-7.24.0.zip и разархивируем в C:\project\curl-7.24.0. Идем в CMake, указываем пути и нажимаем Configurate. Далее прописываем в
WSOCK32_LIBRARY - WSOCK32.lib
WS2_32_LIBRARY - WS2_32.lib
в ZLIB_INCLUDE_DIR прописываем два пути через точку запятую:
C:\project\zlib-1.2.6;C:\project\zlib-1.2.6\build
в ZLIB_LIBRARY прописываем путь до zlib.lib
C:\project\zlib-1.2.6\lib\Release\zlib.lib
И последнее расставляем галочки как на скриншоте, см. Рис. 6:

Рис. 6

Рис. 6

После того как все будет сделано, нажимайте Configurate, все должно закончиться без ошибок и потом Generate. Далее открываем файл CURL.sln в папке build. Заходим в свойства проекта (для этого в Обозревателе решений надо выбрать libcurl)(Проект -> Свойства), далее Свойства конфигурации -> Компоновщик -> Ввод, далее в окне справа Дополнительные зависимости, нажимаем Изменить и удаляем
WSOCK32_LIBRARY-NOTFOUND
WS2_32_LIBRARY-NOTFOUND
Нажимаем применить и ОК, далее компилируем проект. После успешной компиляции помещаем файлы из папки C:\project\curl-7.24.0\build\lib\Debug в папку C:\project\curl-7.24.0\lib\Realese

Библиотека libjpeg

Далее будем собирать libjpeg - брать здесь http://www.ijg.org/ последнюю версию http://www.ijg.org/files/jpegsr8d.zip . CMakeLists скачиваем тут Файл:CMakeListsjpeg.zip и разархивируем, кладем в папку C:\project\jpeg-8d.
Запускаем CMAke и делаем configurate, затем Generate. Идем в папку Debug, открываем libjpeg.sln, ставим Realese и компилируем.

Библиотека libpng

Далее будем собирать libpng - брать здесь http://www.libpng.org/pub/png/libpng.html последнюю версию http://download.sourceforge.net/libpng/lpng159.zip . Разархивировать, запустить CMake, произвести конфигурацию. Прописываем пути для ZLIB_INCLUDE_DIR и ZLIB_LIBRARY-NOTFOUND как делали это выше. Нажимаем Configurate и Generate, далее открываем libpng.sln, ставим Release и компилируем. Файлы из папки C:\project\lpng159\build\Release переносим в C:\project\lpng159\lib\Release.

Библиотека libtiff

Дальше собираем libtiff - брать здесь ftp://ftp.remotesensing.org/pub/libtiff последнюю версию ftp://ftp.remotesensing.org/pub/libtiff/tiff-4.0.1.zip , разархивируем C:\project\tiff-4.0.1, качаем CMakeLists и еще пару файлов и разархивируем как обычно Файл:Tiff.zip. Запускаем CMakt, делаем Configurate и прописываем пути для ZLIB_INCLUDE_DIR и ZLIB_LIBRARY-NOTFOUND как делали это выше. Нажимаем Configurate и Generate, далее открываем libtiff.sln ставим Release и компилируем.

Библиотека proj

Последняя из этих библиотек proj - брать здесь http://trac.osgeo.org/proj/ последнюю версию http://download.osgeo.org/proj/proj-4.8.0.zip . Разархивируем, кидаем туда этот фаил Файл:CMakeListsproj.zip, запускаем CMake, прописываем пути до proj, жмем Configurate и Generate, открываем proj4.sln, ставим Release и компилируем. На этом вся подготовка закончена, у нас есть все необходимые библиотеки.

Сборка GDAL

Приступаем к сборке самого GDAL.

Скачиваем отсюда http://trac.osgeo.org/gdal/wiki/DownloadSource последнюю версию gdal 1.9.0 ( http://download.osgeo.org/gdal/gdal190.zip ). Качаем архив Файл:Gdal trank.zip . Разархивируем gdal в папку project, в разархивированную папку gdal разархивируем файлы из архива Gdal_trank.zip : папку cmake и файл CMakeLists.

Запускаем CMake и как обычно прописываем 2 пути, C:\project\gdal-1.9.0 и C:\project\gdal-1.9.0\ и C:\project\gdal-1.9.0 и C:\project\gdal-1.9.0\build, нажимаем Configure.
Когда выскочит ошибка, прописываем пути до zlib: C:\project\zlib-1.2.6;C:\project\zlib-1.2.6\build и C:/project/zlib-1.2.6/lib/Release/zlib.lib в директориях соответственно ZLIB_INCLUDE_DIR и ZLIB_LIBRARY. Далее все пути надо будет прописывать примерно аналогично для директории INCLUDE и LIBRARY.
Нажимаем Configure, получаем ошибку и прописываем пути для CURL C:/project/curl-7.24.0/include и C:/project/curl-7.24.0/lib/Release/libcurl_imp.lib.
дальше наоборот надо сделать, чтобы было простым текстом, а не кодом

Нажимаем Configure, получаем ошибку и прописываем пути для EXPAT: C:/project/expat-2.0.1/lib/ и C:/project/expat-2.0.1/lib/Release/libexpat.lib.
Нажимаем Configure, получаем ошибку и прописываем пути для GEOS: C:\project\geos-3.3.2\include и C:/project/geos-3.3.2/lib/Release/geos_c.lib.
Нажимаем Configure, получаем ошибку и прописываем пути для PROJ: C:\project\proj-4.8.0\src и C:/project/proj-4.8.0/lib/Release/proj4.lib.

Нажимаем Configure, получаем ошибку, идем в OGR и убираем галочку с OGR_PG.

Нажимаем Configure, получаем ошибку и прописываем пути для JPEG: C:\project\jpeg-8d;C:\project\jpeg-8d\build и C:/project/jpeg-8d/lib/Release/libjpeg.lib.
Нажимаем Configure, получаем ошибку и прописываем пути для TIFF: C:\project\tiff-4.0.1\libtiff;C:\project\tiff-4.0.1\build и C:\project\tiff-4.0.1\lib\Release\libtiff.lib.

Нажимаем Configure, получаем ошибку и прописываем пути для PNG, тут внимательно! Первая строчка - пути до LIBRARY: C:/project/lpng159/lib/Release/libpng15.lib, вторая C:\project\lpng159;C:\project\lpng159\build.

Нажимаем Configure, все должно закончиться успешно, нажимаем Generate. Далее идем в папку C:\project\gdal-1.9.0\build и открываем файл gdallib.sln с помощью visual studio. Ставим Release  и компилируем. Если все прошло без ошибок, вы собрали GDAL! Поздравляю!

Тестовый пример

Теперь можно попробовать сделать тестовый пример для проверки работоспособности c этого сайта http://www.gdal.org/gdal_tutorial_ru.html .

Создадим консольный проект C++ CLR. Пропишем следующие пути:

выбираем в меню Проект->Свойства...->Свойства конфигурации->Компоновщик->Ввод На этой странице в дополнительных зависимостях прописать C:\project\gdal-1.9.0\build\Release\gdal19.lib
теперь в Проект->Свойства...->Свойства конфигурации->C/C++ в Дополнительные зависимости включаемых файлов прописать
C:\project\gdal-1.9.0\build\port\
C:\project\gdal-1.9.0\alg\
C:\project\gdal-1.9.0\
C:\project\gdal-1.9.0\gcore
C:\project\gdal-1.9.0\port

Так же необходимо в папку, где содержатся файлы проекта положить сформированные dll, собрынные нами ранее вместе с файлами .lib:

  • gdal19.dll
  • geos.dll
  • geos_c.dll
  • libcurl.dll
  • libexpat.dll
  • libjpeg.dll
  • libpng15.dll
  • libtiff.dll
  • proj4.dll
  • zlib1.dll

Так же в эту папку положите какой-нибудь рисунок и напишите его имя вместо моего, у меня это 1.JPG.

Так выглядит мой код^

#include "stdafx.h"
#include "gdal_priv.h"
using namespace System;
int main(array<System::String ^> ^args)
{
    GDALDataset  *poDataset;
    GDALAllRegister();
    poDataset = (GDALDataset *) GDALOpen( "1.JPG", GA_ReadOnly ); // здесь надо указать путь до изображения
	 if( poDataset == NULL )
    {
       return 0;
    }
	double        adfGeoTransform[6];
    printf( "Драйвер: %s/%s\n",
            poDataset->GetDriver()->GetDescription(), 
            poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ) );
    printf( "Размер %dx%dx%d\n", 
            poDataset->GetRasterXSize(), poDataset->GetRasterYSize(),
            poDataset->GetRasterCount() );
    if( poDataset->GetProjectionRef()  != NULL )
        printf( "Проекция \"%s\"\n", poDataset->GetProjectionRef() );
    if( poDataset->GetGeoTransform( adfGeoTransform ) == CE_None )
    {
        printf( "Начало координат (%.6f,%.6f)\n",
                adfGeoTransform[0], adfGeoTransform[3] );
        printf( "Размер пиксела (%.6f,%.6f)\n",
                adfGeoTransform[1], adfGeoTransform[5] );
    }
    return 0;
}

Ну вот и все. На этом данная статья заканчивается. В ней Вы научились собирать GDAL и сделали тестовый пример для работы с ним. Успехов. Комментарии и отзывы приветствуются.

Огромное СПАСИБО за помощь со сборкой и терпение пользователю Bishop.

Автор: Евгений(LEXX413), Дмитрий(Bishop)