11

問題は次のとおりです 。GDALは、ラスターとベクトルの両方の複雑なGISデータを管理するように設計された素晴らしいオープンソースライブラリです。Mac OS(William Kyngesburye提供)およびその他のプラットフォーム用に完全にコンパイルされていますが、iOS用にはコンパイルされていません。

ネットを閲覧すると、 3年以上前に書かれたpseudogreenの有名なスクリプトから始めて、iOSライブラリの作成に関するトピックに関する(比較的古い)情報を見つけることができます。iPhoneのGDAL/OGRなど、スタックオーバーフローには、追加情報を提供する断片もあります。

この記事は、iOS6とXCode4.5.5を使用したシンプルなiOSアプリでGDAL/OGRを完全に機能的に統合するために行ったすべての手順を網羅することを目的としています。

4

2 に答える 2

20

ノート

この応答は少し前に書かれたもので、moはXcode6以降で動作しなくなりました。この問題に対する最新の回答については、このリンクを確認してください。

序章

iOSアプリにGDALを組み込むには、次の5つの手順が必要です。

  1. GDALWebサイトからGDALソースコードをダウンロードします
  2. 以下に示すconfigure/build/installスクリプトを実行します
  3. 結果の静的ライブラリをインクルードファイルと一緒にiOSプロジェクトに追加します
  4. iOSプロジェクトの追加ライブラリとリンクする
  5. コーディングを開始...GDALとOGRのチュートリアルは良い出発点です

GDALのダウンロード

GDALはC++オープンソースライブラリであり、www.gdal.orgWebサイトからダウンロードできます。執筆時点での最新バージョンは1.9.0です。可能であれば、最新の安定バージョンをダウンロードする必要があります。

スクリプトを実行して、iOSおよびシミュレーター用のGDALをコンパイルします

iOSプロジェクトでGDALを使用するには、ソースコードを静的ライブラリ(.a)としてコンパイルする必要があります。iOS6でサポートされている最新のアーキテクチャでは、次のアーキテクチャの静的ライブラリを作成する必要があります。

  • シミュレータ用のi386
  • armv7 foriPhone3GSからiPhone4S
  • iPhone5用armv7s

1つのアーキテクチャ用に構築する基本スクリプト

次のスクリプトは、pseudogreenを応用したもので、単一のアーキテクチャのソースコードをコンパイルするトリックを実行します。

このコードをコピーしてテキストエディタに貼り付け、拡張子が.shのファイル(例:build_gdal_ios.sh)として保存します。

これを使用するには、gdalソースコードをダウンロードしたディレクトリにスクリプトをコピーして、次のように実行します。

  • シミュレータ用のライブラリを構築するには:

    `sh build_gdal_ios.sh -p "location where you want to save the resulting files" simulator`
    
  • デバイス用にビルドするには:

    `sh build_gdal_ios.sh -p "location where you want to save the resulting files" -a "architecture" device`
    

入力してヘルプを表示することもできsh build_gdal_ios.sh -hます。

    #!/bin/bash
    ################################################################################
    #
    # Copyright (c) 2008-2009 Christopher J. Stawarz
    #
    # Permission is hereby granted, free of charge, to any person
    # obtaining a copy of this software and associated documentation files
    # (the "Software"), to deal in the Software without restriction,
    # including without limitation the rights to use, copy, modify, merge,
    # publish, distribute, sublicense, and/or sell copies of the Software,
    # and to permit persons to whom the Software is furnished to do so,
    # subject to the following conditions:
    #
    # The above copyright notice and this permission notice shall be
    # included in all copies or substantial portions of the Software.
    #
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    # NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
    # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
    # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    # SOFTWARE.
    #
    ################################################################################



    # Disallow undefined variables
    set -u


    default_gcc_version=4.2
    default_iphoneos_version=6.0
    default_macos_version=10.8
    default_architecture=armv7
    default_prefix="${HOME}/Documents/iOS_GDAL"

    GCC_VERSION="${GCC_VERSION:-$default_gcc_version}"
    export IPHONEOS_DEPLOYMENT_TARGET="${IPHONEOS_DEPLOYMENT_TARGET:-$default_iphoneos_version}"
    export MACOSX_DEPLOYMENT_TARGET="${MACOSX_DEPLOYMENT_TARGET:-$default_macos_version}"
    DEFAULT_ARCHITECTURE="${DEFAULT_ARCHITECTURE:-$default_architecture}"
    DEFAULT_PREFIX="${HOME}/Documents/iOS_GDAL"

    echo Default architecture: $DEFAULT_ARCHITECTURE

    usage ()
    {
        cat >&2 << EOF
    Usage: ${0##*/} [-ht] [-p prefix] [-a arch] target [configure_args]
        -h  Print help message
        -p  Installation prefix (default: \$HOME/Documents/iOS_GDAL...)
        -t  Use 16-bit Thumb instruction set (instead of 32-bit ARM)
        -a  Architecture target for compilation (default: armv7)

    The target must be "device" or "simulator".  Any additional arguments
    are passed to configure.

    The following environment variables affect the build process:

        GCC_VERSION (default: $default_gcc_version)
        IPHONEOS_DEPLOYMENT_TARGET  (default: $default_iphoneos_version)
        MACOSX_DEPLOYMENT_TARGET    (default: $default_macos_version)
        DEFAULT_PREFIX  (default: $default_prefix)
    EOF
    }

    prefix="${DEFAULT_PREFIX}"

    echo Prefix: $prefix

    while getopts ":hp:a:t" opt; do
        case $opt in
        h  ) usage ; exit 0 ;;
        p  ) prefix="$OPTARG" ;;
        t  ) thumb_opt=thumb ;;
        a  ) DEFAULT_ARCHITECTURE="$OPTARG" ;;
        \? ) usage ; exit 2 ;;
        esac
    done
    shift $(( $OPTIND - 1 ))

    if (( $# < 1 )); then
        usage
        exit 2
    fi

    target=$1
    shift

    case $target in

        device )
        arch="${DEFAULT_ARCHITECTURE}"
        platform=iPhoneOS
        extra_cflags="-m${thumb_opt:-no-thumb} -mthumb-interwork"
        ;;

        simulator )
        arch=i386
        platform=iPhoneSimulator
        extra_cflags="-D__IPHONE_OS_VERSION_MIN_REQUIRED=${IPHONEOS_DEPLOYMENT_TARGET%%.*}0000"
        ;;

        * )
        echo No target found!!!
        usage
        exit 2

    esac


    platform_dir="/Applications/Xcode.app/Contents/Developer/Platforms/${platform}.platform/Developer"
    platform_bin_dir="${platform_dir}/usr/llvm-gcc-${GCC_VERSION}/bin"
    platform_sdk_dir="${platform_dir}/SDKs/${platform}${IPHONEOS_DEPLOYMENT_TARGET}.sdk"
    prefix="${prefix}/${arch}/${platform}.platform/${platform}${IPHONEOS_DEPLOYMENT_TARGET}.sdk"

    echo library will be exported to $prefix

    export CC="${platform_bin_dir}/llvm-gcc-${GCC_VERSION}"
    export CFLAGS="-arch ${arch} -pipe -Os -gdwarf-2 -isysroot ${platform_sdk_dir} ${extra_cflags}"
    export LDFLAGS="-arch ${arch} -isysroot ${platform_sdk_dir}"
    export CXX="${platform_bin_dir}/llvm-g++-${GCC_VERSION}"
    export CXXFLAGS="${CFLAGS}"
    export CPP="${platform_bin_dir}/llvm-cpp-${GCC_VERSION}"
    export CXXCPP="${CPP}"


    ./configure \
        --prefix="${prefix}" \
        --host="${arch}-apple-darwin" \
        --disable-shared \
        --enable-static \
        --with-unix-stdio-64=no \
        "$@" || exit

    make install || exit

    cat >&2 << EOF

    Build succeeded!  Files were installed in

      $prefix


   EOF

このスクリプトにはいくつかのデフォルトパラメータがあり、SDKまたはLLVMAppleコンパイラでの設定や変更を反映するように変更できることに注意してください。

  • default_gcc_version = 4.2
  • default_iphoneos_version = 6.0
  • default_macos_version = 10.8
  • default_architecture = armv7
  • default_prefix = "$ {HOME} / Documents / GDALLibrary"

そして今、複数のアーキテクチャのために構築しています

上記のスクリプト(build_gdal_ios.sh)を使用すると、一度に1つのアーキテクチャを構築できます... 3用にコンパイルしてから、これらすべてのライブラリを1つの静的ライブラリファイルにまとめる必要があります。

次のスクリプトはそれを可能にします(build_gdal_all_ios.shなどの別の名前に保存します):

#!/bin/bash
make clean
./build_gdal_ios.sh -p ${HOME}/Documents/GDALLibrary -a armv7 device
make clean
./build_gdal_ios.sh -p ${HOME}/Documents/GDALLibrary -a armv7s device
make clean
./build_gdal_ios.sh -p ${HOME}/Documents/GDALLibrary simulator

このスクリプトを実行すると、ライブラリがサブフォルダの$ {HOME} / Documents/GDALLibraryディレクトリに保存されます。

  • $ {HOME} /Documents/GDALLibrary/i386/iPhoneSimulator.platform/iPhoneSimulator6.0.sdk/lib
  • $ {HOME} /Documents/GDALLibrary/armv7/iPhoneOS.platform/iPhoneSimulator6.0.sdk/lib
  • $ {HOME} /Documents/GDALLibrary/armv7s/iPhoneOS.platform/iPhoneSimulator6.0.sdk/lib

これで、実行可能リポ(脂肪吸引用)を使用して、次のように3つのライブラリを1つのライブラリに結合できます。

lipo ${HOME}/Documents/GDALLibrary/i386/iPhoneSimulator.platform/iPhoneSimulator6.0.sdk/lib/libgdal.a ${HOME}/Documents/GDALLibrary/armv7/iPhoneOS.platform/iPhoneSimulator6.0.sdk/lib/libgdal.a ${HOME}/Documents/GDALLibrary/armv7s/iPhoneOS.platform/iPhoneSimulator6.0.sdk/lib/libgdal.a -output ${HOME}/Documents/GDALLibrary/libgdal.a -create

...そしてあなたは終わりました...

XCodeプロジェクトに静的ライブラリを追加します

この手順はかなり簡単です。

  1. Xcode(4.5)で新しいプロジェクトを作成するか、GDALを追加するプロジェクトを開きます
  2. ファイルエクスプローラーで右クリックし、[プロジェクトにファイルを追加]を選択します
  3. 上記で作成したlibgdal.aを、インクルードディレクトリの1つにあるインクルードファイルとともに選択します(3つのディレクトリには同じファイルが含まれています)
  4. 次のライブラリを(プロジェクトフレームワークリストから)XCodeプロジェクトに追加します。
    • libstdc++。6.0.9.dylib
    • libz.dylib
    • libiconv.dylib
    • libsqlite3.dylib
    • libxml2.dylib(アーキテクチャarmv7の未定義のシンボルの場合: "_ xmlCatalogResolveSystem"など)

コードを作成します。すべて問題なくコンパイルできるはずです。

コーディングを開始する

ここにトリックがあります:Objective-C環境でC ++ライブラリ(およびヘッダーファイル)を使用しています。GDALヘッダーファイルの1つを.mファイルにインクルードすると、XCodeはC++構文について文句を言います。

ここに2つの解決策があります:

  1. すべてのGDALコードを.mmファイル内に記述します。XcodeはこれをObjective-C++ファイルとして認識し、コンパイルします。
  2. PhilJordanが優れた記事MixingObjective-C++ and C ++で説明しているように、Objective-Cファイルでクラス拡張を使用します。

ある時点で、いくつかのGDALコードサンプルを投稿します...しかし後で...

于 2012-09-28T16:29:45.360 に答える
0

lutraconsulting / input-sdkリポジトリを使用することもできます。このリポジトリでは、OSGeoライブラリを使用してビルド済みのiosバイナリをダウンロードまたはビルドできます。

于 2020-09-15T07:54:08.190 に答える