Sharpmap, GDAL, OziExplorer OZF2, OZF3

Опубликовано Мар 16, 2011 в .NET | Нет комментариев

Уже давно, я задумывался об одновлении Particler — программы для визуализации и рендера GPS треков на карте и для наложения GPS данных на видео. Программа требует обновления картографического движка, и новый движок должен быть open source, написан для .net или с возможностью работы с ним из .net и уметь работать как с растровыми, так и векторными данными. А также обязательно поддерживать формат OziExplorer MAP/OZF2/OZF3. Поддержка OziExplorer необходима, т.к. несмотря на широкое распространение в последние годы векторных карт, они хороши в основном для тех мест, где есть дороги, а для туристов всё же основными остаются старые, добрые карты ген. штаба.

Всем перечисленным требованиям удовлетворяет картографический движок Sharpmap. Но заставить его понимать OZF, оказалось не просто.


С ESRI Shape файлами SharpMap заработал без проблем. Достаточно в своём проекте подключить проекты SharpMap, SharpMap.UI,SharpMap.Extensions и добавить каталог ExternalReferences с библиотеками, которые используются этими проектами.

Для работы с MapInfo TAB файлами используется OGR провайдер, а для для работы с растром GDAL. Проект Sharpmap рекомендует загрузить FWTools (текущая версия 2.4.7), в состав которого входят и сборки GDAL, для включения поддержки одновременно как OGR, так и GDAL. Одако если вы так сделаете, вас ждёт разочарование. Sharpmap начнёт работать с MapInfo TAB файлами, но не откроет ни .OZF, ни даже просто .MAP файл от OziExplorer.

Дальше, у меня начался долгий поиск решения. Оказалось, что поддержка OziExplorer MAP файлов появилась в GDAL начиная с версии 1.7.1, а поддержка OZF с версии 1.8.0. Если же мы посмотрим версию GDAL из FWTools 2.4.7 командой «gdal_translate –version», то увидим «GDAL 1.7.0b2». Эта версия не понимает .MAP и .OZF файлы.

Начались поиски скомпилированной под Windows последней (1.8.0) версии GDAL. Политика самого проекта GDAL подразумевает, что такая компиляция — дело самого пользователя.

The GDAL project does not produce regular downloadable binaries (executables) for each release. However, a variety of efforts do produce ready to use binaries.

Для установки последних версий ПО для работы с пространственными данными предназначен пакет OsGeo4W, однако его использование в данном случае избыточно. Рекомендуемый FWTools 2.4.7, как я указал ранее, содержит GDAL устаревшей версии 1.7.0b2. Сборка Geoinformatica также включала устаревший GDAL.

И наконец лучший вариант — сборки от Tamas Szekeres, http://vbkto.dyndns.org/sdk/ содержат последние версии GDAL скомпилированные под Win32 и Win64 (x86, x64).

После установки последней сборки от Tamas Szekeres проверяем «gdal_translate –version» и получаем долгожданный результат: GDAL 1.9dev.

Тестовая программа работает нормально, открываются как OZF2/3, так и .MAP файлы OziExplorer.

Как отучить SharpMap от FWTools

SharpMap использует FWTools, это жёстко прошито в проекте SharpMap.Extensions.

SharpMap.Extensions\Data\FwToolsHelper.cs [31]:

string fwtoolsPath = ConfigurationManager.AppSettings[«FWToolsBinPath»];

Соответственно в вашем проекте требуется обязательно жёстко задать расположение FWTools.

app.config:


<?xml version="1.0"?>
<configuration>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
<appSettings>
<add key="FWToolsBinPath" value="C:\Program Files (x86)\FWTools2.4.7\bin"/>
<add key="FWToolsProjLib" value="C:\Program Files (x86)\FWTools2.4.7\proj_lib"/>
<add key="FWToolsGeoTiffCsv" value="C:\Program Files (x86)\FWTools2.4.7\data"/>
<add key="FWToolsGdalData" value="C:\Program Files (x86)\FWTools2.4.7\data"/>
<add key="FWToolsGdalDriver" value="C:\Program Files (x86)\FWTools2.4.7\plugins"/>
</appSettings>
</configuration>

Однако нам не всегда нужен FWTools и тем более нет смысла устанавливать его вместе со своей программой, не говоря уже о том, что в зависимости от битности ОС 32/64 расположение этого пакета будет изменяться. Ну и наконец он содержит GDAL устаревшей версии.

Попробуем обмануть проект SharpMap.Extensions и избавиться от использования FWTools.

Создадим новый проект, использующий SharpMap. Далее к нему необходимо добавить существующие проекты
sharpmap.zip/\Trunk\SharpMap
sharpmap.zip/\Trunk\SharpMap.Extensions
sharpmap.zip/\Trunk\SharpMap.UI
и каталог
sharpmap.zip/\Trunk\ExternalReferences

Т.к. новые сборки используют .NET Framework 4, то в свойствах всех проектов, включая свой, меняем TargetFramework на .NET Framework 4 (обратите внимание, не Client Profile!).

Далее заменяем устаревшие сборки
ExternalReferences\References4SharpMap.Extensions\gdal_csharp.dll
ExternalReferences\References4SharpMap.Extensions\ogr_csharp.dll
ExternalReferences\References4SharpMap.Extensions\osr_csharp.dll
на новые из пакета release-1600-gdal-mapserver.zip/bin\gdal\csharp\

Добавляем в свой проект файлы
release-1600-gdal-mapserver.zip/\bin\*.dll
release-1600-gdal-mapserver.zip/\bin\gdal\csharp\*.dll
и устанавливаем для них свойство «Copy to Output Directory: Copy if newer».

Подключаем к своему проекту System.Configuration.dll и добавляем в конструктор:

ConfigurationManager.AppSettings["FWToolsBinPath"] = Application.StartupPath;
ConfigurationManager.AppSettings["FWToolsProjLib"] = Application.StartupPath;
ConfigurationManager.AppSettings["FWToolsGeoTiffCsv"] = Application.StartupPath;
ConfigurationManager.AppSettings["FWToolsGdalData"] = Application.StartupPath;
ConfigurationManager.AppSettings["FWToolsGdalDriver"] = Application.StartupPath;

Всё, мы обманули SharpMap.Extensions без изменения исходников.
Прописывать в app.config больше ничего не нужно.

Оставить комментарий