GDAL C#開発環境構成

6557 ワード

一、GDAL C#の一部の資源と参考
1.GDAL/OGR In CSharp公式ホームページ
2.GDAL CSharpコンパイル後のdllダウンロードアドレス
3.良いヘルプドキュメントgdal api document
4.公式サイトが提供するcsharpインスタンスコードフラグメント
5.GDAL Raster Formats
二、GDAL C#DLLダウンロード
1.コンパイルされたDLLダウンロードアドレス:http://www.gisinternals.com/sdk/、「GDAL and MapServer lasted release version」で最新バージョンをダウンロードします.
GDAL C# 开发环境配置_第1张图片
2.クリックしてダウンロードページに入る:
http://www.gisinternals.com/sdk/PackageList.aspx?file=release-1400-gdal-1-10-1-mapserver-6-4-1.zip
GDAL C# 开发环境配置_第2张图片
3.コンパイル後のDLLはgdal 110を除く.dllおよびその依存項目はbinディレクトリの下にあり、残りは圧縮パッケージの「bingdalcsharp...」ディレクトリの下にあります.
GDAL C# 开发环境配置_第3张图片
4.開発時に「_csharp.dll」で終わるdllライブラリをプロジェクトリファレンスに追加し、残りはdebugディレクトリにコピーします.
三、よくある異常解決
例外の説明:上記の手順が完了した後も、通常は正常に開発できず、頻繁に呼び出されます.
Gdal.AllRegister()メソッドでは、次のような例外が放出されます.
「OSGeo.GDAL.GdalPINVOKE」のタイプ初期値設定項目に異常が発生します.
原因分析:1.gdalが初期化されると、dllに依存する項目が不完全であるため、登録に失敗して例外が投げ出され、Dependency Walkerツールを使用して依存項目を表示できます.9つのDLLと見つかったすべての依存項目をdebugディレクトリに簡単にコピーすることは、通常、問題を解決することはできません.
2.同じアプリケーションのプライマリ・プログラムが参照しているクラス・ライブラリと異なるバージョンのgdal csharp dllファイルを使用している場合、同じ例外が発生します.
3.この異常を総合的に分析するのは、依存するdllと構成情報によるものであり、dllが構成に関連するファイルに対応している必要がある.
解決方法:SharpMapのGDAL初期化方法で解決し、二つのデータが必要:
1.      GdalConfiguration.cs
2.      gdal_data_config.rar
注意:以上の2つのファイルのダウンロードアドレス:gdal_csharp開発環境プロファイル
ステップ1:GdalConfiguration.csをプロジェクトに追加し、gdal_を解凍します.data_config.rarはdebugディレクトリの下にあり、フォルダ名はgdalです.
ステップ2:Gdalを使用する.AllRegister()を初期化する前に、次の2つのコードを呼び出して関連する初期化データの構成を行えばよい.
SharpMap.GdalConfiguration.ConfigureGdal();
SharpMap.GdalConfiguration.ConfigureOgr();  3.GdalConfigurationクラスの内容は次のとおりです.
/******************************************************************************
 *
 * Name:     GdalConfiguration.cs.pp
 * Project:  GDAL CSharp Interface
 * Purpose:  A static configuration utility class to enable GDAL/OGR.
 * Author:   Felix Obermaier
 *
 *****************************************************************************/

using System;
using System.IO;
using System.Reflection;
using Gdal = OSGeo.GDAL.Gdal;
using Ogr = OSGeo.OGR.Ogr;

namespace SharpMap
{
    public static partial class GdalConfiguration
    {
        private static bool _configuredOgr;
        private static bool _configuredGdal;

        /// 
        /// Function to determine which platform we're on
        /// 
        private static string GetPlatform()
        {
            return IntPtr.Size == 4 ? "x86" : "x64";
        }

        /// 
        /// Construction of Gdal/Ogr
        /// 
        static GdalConfiguration()
        {
            var executingAssemblyFile = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase).LocalPath;
            var executingDirectory = Path.GetDirectoryName(executingAssemblyFile);

            if (string.IsNullOrEmpty(executingDirectory))
                throw new InvalidOperationException("cannot get executing directory");


            var gdalPath = Path.Combine(executingDirectory, "gdal");
            var nativePath = Path.Combine(gdalPath, GetPlatform());

            // Prepend native path to environment path, to ensure the
            // right libs are being used.
            var path = Environment.GetEnvironmentVariable("PATH");
            path = nativePath + ";" + Path.Combine(nativePath, "plugins") + ";" + path;
            Environment.SetEnvironmentVariable("PATH", path);

            // Set the additional GDAL environment variables.
            var gdalData = Path.Combine(gdalPath, "data");
            Environment.SetEnvironmentVariable("GDAL_DATA", gdalData);
            Gdal.SetConfigOption("GDAL_DATA", gdalData);

            var driverPath = Path.Combine(nativePath, "plugins");
            Environment.SetEnvironmentVariable("GDAL_DRIVER_PATH", driverPath);
            Gdal.SetConfigOption("GDAL_DRIVER_PATH", driverPath);

            Environment.SetEnvironmentVariable("GEOTIFF_CSV", gdalData);
            Gdal.SetConfigOption("GEOTIFF_CSV", gdalData);

            var projSharePath = Path.Combine(gdalPath, "share");
            Environment.SetEnvironmentVariable("PROJ_LIB", projSharePath);
            Gdal.SetConfigOption("PROJ_LIB", projSharePath);
        }

        /// 
        /// Method to ensure the static constructor is being called.
        /// 
        /// Be sure to call this function before using Gdal/Ogr/Osr
        public static void ConfigureOgr()
        {
            if (_configuredOgr) return;

            // Register drivers
            Ogr.RegisterAll();
            _configuredOgr = true;
        }

        /// 
        /// Method to ensure the static constructor is being called.
        /// 
        /// Be sure to call this function before using Gdal/Ogr/Osr
        public static void ConfigureGdal()
        {
            if (_configuredGdal) return;

            // Register drivers
            Gdal.AllRegister();
            _configuredGdal = true;
        }
    }
}

四、GDALがShapeデータを読み書きする時の中国語の文字化けし問題
//Shpフィールド、属性等の符号化を空Gdalとする.SetConfigOption("SHAPE_ENCODING", "");
//Shpファイルの中国語パスの文字化けし、読み取れない問題(削除しても中国語を認識できる場合があり、解決すべき)Gdal.SetConfigOption(「GDAL_FILENAME_IS_UTF 8」、「NO」)を解決する.//中国語のパスの問題を完全に解決することができなくて、パスは奇数の中国語を含む時通常すべて正しく認識することができなくて、偶数は正常です
注意:上記の第3部で説明した方法を使用しても、タイプ初期値異常の問題がある場合は、プログラムdebugディレクトリの下に非_csharpの最後のdllを削除すればいい(コードはgdalフォルダの下の関連dllに自動的に一致している).