09.04.2017 Программируем с использованием GDAL/OGR на C# (часть 1). Установка и настройка
Что нам понадобится?
Предполагается, что читатель знаком с платформой .NET, языком программирования C# и средой разработки Visual Studio хотя бы на начальном уровне. В своем примере я буду использовать последнюю версию Visual Studio, а именно - Visual Studio 2017 Community Edition, которая является абсолютно бесплатной для учащихся, разработчиков открытого ПО и отдельных разработчиков. А где взять саму библиотеку GDAL/OGR, я уже расскажу по ходу самой статьи.
Что такое GDAL/OGR?
Чтобы ответить на этот философский вопрос, обратимся к официальному сайту. GDAL (Geospatial Data Abstraction Library — библиотека абстракции геопространственных данных) - это библиотека для работы с растровыми географическими форматами файлов данных. GDAL распространяется Open Source Geospatial Foundation на условиях лицензии X/MIT, то есть является проектом с открытым исходным кодом. Для разработчиков это означает, что им разрешено использовать лицензируемый код и в закрытом ПО. Единственное условие - указание авторского права и включение текста лицензии в распространяемое ПО. Таким образом, GDAL предоставляет некий унифицированный интерфейс по работе с различными источниками растровых географических данных.
Библиотека OGR, входящая в состав проекта GDAL, предоставляет аналогичные возможности для работы с векторными данными. Теоретически OGR отделен от GDAL, но в настоящее время эта библиотека является частью дерева исходных кодов GDAL. В будущем планируется полностью поместить OGR в GDAL, так что GDAL будет единой библиотекой для доступа к растровым и векторным данным.
Установка библиотеки GDAL/OGR вручную
Первым делом нам нужно скачать бинарники этой библиотеки для ОС Windows, т.к. здесь пойдет речь именно о работе в этой операционной системе. Загрузить скомпилированные бинарники можно с сайта GISInternals. В зависимости от вида ОС (x86 или x64) необходимо выбрать соответствующий архив. Для своей ОС я загрузил release-1800-x64-gdal-2-1-3-mapserver-7-0-4.zip. Далее, архив необходимо распаковать в произвольную директорию. Я распаковал в каталог c:\Programs\gdal.
На следующем шаге необходимо добавить в переменную окружения PATH пути к каталогам:
- c:\Programs\gdal\bin\gdal\csharp
- c:\Programs\gdal\bin
В случае, если вы распаковали архив в другую директорию, то путь необходимо соответствующим образом изменить.
![Добавление директорий в переменную окружения PATH](/Content/img/blog/gdal_install/path.jpg)
Далее, создадим проект консольного приложения, который использует платформу .NET Framework (а не .NET Core), поскольку подключаемые нами библиотеки используют именно эту платформу. Также я выбрал версию .NET Framework 4.6.1, как отмечено на рисунке ниже.
![Выбор проекта для демонстрации GDAL в Visual Studio 2017](/Content/img/blog/gdal_install/vs.jpg)
Хотя можно выбрать и другую версию не ниже 4.0, что видно из манифеста управляемой сборки gdal_csharp.dll.
![Манифест сборки gdal_csharp.dll](/Content/img/blog/gdal_install/manifest.jpg)
После того как проект создан, добавим ссылки на следующие сборки:
- gdal_csharp.dll
- gdalconst_csharp.dll
- ogr_csharp.dll
- osr_csharp.dll
Эти сборки расположены в директории c:\Programs\gdal\bin\gdal\csharp, если вы, конечно, распаковали архив в директорию c:\Programs\gdal.
![Добавляемые в проект сборки](/Content/img/blog/gdal_install/asm_ref.jpg)
На следующем шаге нам нужно в свойствах проекта изменить целевую платформу. Если вы загрузили x64 версию бинарников, как я, то вам нужно выбрать значение x64, как показано на рисунке ниже. Если же у вас x86 версия бинарников, то выберите значение x86.
![Изменение целевой платформы проекта](/Content/img/blog/gdal_install/vs_proj_prop.jpg)
Итак, все приготовления уже позади, и нам осталось только проверить корректность настройки нашего рабочего окружения и библиотеки GDAL/OGR. Для этого напишем простейшую программу, которая ничего не будет делать, но ее цель - корректно отработать, не выбросив никакого исключения. Наша проверочная программа выглядит таким образом:
using System;
using OSGeo.GDAL;
using OSGeo.OGR;
namespace GDALDemo
{
class Program
{
static void Main(string[] args)
{
Gdal.AllRegister();
Ogr.RegisterAll();
Console.WriteLine("All right!");
Console.ReadLine();
}
}
}
Эта программа регистрирует драйвера доступа к растровым и векторным данным. Если все прошло успешно, то в консоли вы увидете строку "All right!" и программа будет ожидать нажатия клавиши [ENTER]. Рассмотрим некоторые виды ошибок, возникающие, когда что-то пошло не так. Многие исключения библиотеки содержат следующее малоинформативное сообщение: Инициализатор типа "OSGeo.GDAL.GdalPINVOKE" выдал исключение. Чтобы докопаться до сути нужно исследовать вложенные исключения. Последнее вложенное сообщение уже содержит больше информации: Была сделана попытка загрузить программу, имеющую неверный формат. (Исключение из HRESULT: 0x8007000B). Это сообщение означает, что в настройках проекта вы не выбрали нужную целевую платформу (о чем я написал выше) и у вас в настройках скорей всего стоит Any CPU.
Еще одной ошибкой может быть отсутствие путей к каталогам c:\Programs\gdal\bin\gdal\csharp и c:\Programs\gdal\bin в переменной окружения PATH. (Здесь я предполагаю, что архив с библиотекой распакован в каталог c:\Programs\gdal). При этом сообщение в исключении верхнего уровня содержит те же строки: Инициализатор типа "OSGeo.GDAL.GdalPINVOKE" выдал исключение. А если пройти всю цепочку внутренних исключений, то получим более информативное сообщение: Не удается загрузить DLL "gdal_wrap": Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E).
Установка библиотеки GDAL/OGR с помощью пакетного менеджера NuGet.
На самом деле, есть гораздо более простой способ установки и запуска библиотеки GDAL/OGR. Для этого нужно лишь воспользоваться менеджером пакетов NuGet. Воспользуемся графической оболочкой менеджера, которую можно открыть через меню Tools - NuGet Package Manager - Manage NuGet Packages for Solution.... На вкладке "Browse" вводим в строку поиска GDAL и устанавливаем 2 пакета: GDAL и GDAL Native. На момент написания статьи версия этих пакетов была 1.11.1. Как видно на скриншоте, у меня они уже установлены.
![Окно менеджера пакетов NuGet с установкой GDAL](/Content/img/blog/gdal_install/nuget.jpg)
После загрузки и установки пакетов в проекте появятся 2 файла: GdalConfiguration.cs и GdalConfiguration.vb. В данном случае нас интересует файл GdalConfiguration.cs. Если исследовать его содержимое, то можно увидеть, что его статический конструктор в зависимости от разрядности приложения добавляет в переменную окружения PATH путь к соответствующему библиотечному каталогу, а также устанавливаются некоторые другие переменные окружения. А вызовы методов GdalConfiguration.ConfigureGdal() и GdalConfiguration.ConfigureOgr() регистрируют драйверы растровых и векторных данных соответственно.
Запустим приведенное ниже консольное приложение.
using System;
namespace GDALDemo
{
class Program
{
static void Main(string[] args)
{
GdalConfiguration.ConfigureGdal();
GdalConfiguration.ConfigureOgr();
Console.WriteLine("All right!");
Console.ReadLine();
}
}
}
Если все прошло успешно и у вас выбрана конфигурация Debug, то вы увидете список зарегистрированных драйверов и нашу строку "All right!", а в случае конфигурации Debug - только нашу строку.
12.04.2017 Видео о том, когда что-то пошло не так :) (обновление)
Решил записать еще ролик по ручной установке библиотеки GDAL/OGR, что описана в начале статьи. Запись осуществлялась на другой машине, где ранее не разворачивалась эта библиотека. И как это часто бывает, получил непредвиденную ошибку Не удается загрузить DLL "gdal_wrap"! Естественно, проверил добавленные пути в переменную окружения PATH. С ней все в порядке, однако ошибка все же есть! Если хотите узнать в чем же была причина, то прошу к просмотру:
Надеюсь, в этой статье мне удалось раскрыть бОльшую часть подводных камней и указать на самые большие грабли, которые подстерегают программистов при установке данной библиотеки. А в следующей статье я планирую создать небольшую программу, демонстрирующие возможности данной библиотеки и указать на некоторые полезные методы, которые пригодятся в дальнейшем при разработке своих ГИС приложений.
Файлы для загрузки:
- Библиотека GDAL/OGR x64 - архив с библиотекой GDAL/OGR x64 версии 2.1.3.