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
Добавление директорий в переменную окружения PATH

Далее, создадим проект консольного приложения, который использует платформу .NET Framework (а не .NET Core), поскольку подключаемые нами библиотеки используют именно эту платформу. Также я выбрал версию .NET Framework 4.6.1, как отмечено на рисунке ниже.

Выбор проекта для демонстрации GDAL в Visual Studio 2017
Выбор проекта для демонстрации GDAL в Visual Studio 2017

Хотя можно выбрать и другую версию не ниже 4.0, что видно из манифеста управляемой сборки gdal_csharp.dll.

Манифест сборки gdal_csharp.dll
Манифест сборки 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. Как видно на скриншоте, у меня они уже установлены.

Окно менеджера пакетов NuGet с установкой GDAL
Окно менеджера пакетов NuGet с установкой GDAL

После загрузки и установки пакетов в проекте появятся 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. С ней все в порядке, однако ошибка все же есть! Если хотите узнать в чем же была причина, то прошу к просмотру:


Надеюсь, в этой статье мне удалось раскрыть бОльшую часть подводных камней и указать на самые большие грабли, которые подстерегают программистов при установке данной библиотеки. А в следующей статье я планирую создать небольшую программу, демонстрирующие возможности данной библиотеки и указать на некоторые полезные методы, которые пригодятся в дальнейшем при разработке своих ГИС приложений.

Файлы для загрузки: