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
В случае, если вы распаковали архив в другую директорию, то путь необходимо соответствующим образом изменить.
Далее, создадим проект консольного приложения, который использует платформу .NET Framework (а не .NET Core), поскольку подключаемые нами библиотеки используют именно эту платформу. Также я выбрал версию .NET Framework 4.6.1, как отмечено на рисунке ниже.
Хотя можно выбрать и другую версию не ниже 4.0, что видно из манифеста управляемой сборки gdal_csharp.dll.
После того как проект создан, добавим ссылки на следующие сборки:
- gdal_csharp.dll
- gdalconst_csharp.dll
- ogr_csharp.dll
- osr_csharp.dll
Эти сборки расположены в директории c:\Programs\gdal\bin\gdal\csharp, если вы, конечно, распаковали архив в директорию c:\Programs\gdal.
На следующем шаге нам нужно в свойствах проекта изменить целевую платформу. Если вы загрузили x64 версию бинарников, как я, то вам нужно выбрать значение x64, как показано на рисунке ниже. Если же у вас x86 версия бинарников, то выберите значение x86.
Итак, все приготовления уже позади, и нам осталось только проверить корректность настройки нашего рабочего окружения и библиотеки 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. Как видно на скриншоте, у меня они уже установлены.
После загрузки и установки пакетов в проекте появятся 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.