diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index e31268c0f..01cc9375b 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -1,7 +1,10 @@ -name: Android +name: Android Build on: push: paths: + - 'vcpkg/**' + - 'vcpkg.json' + - 'VCPKG_BASELINE' - 'app/**' - 'core/**' - 'scripts/**' @@ -21,31 +24,35 @@ concurrency: jobs: android_build: if: ( github.repository == 'MerginMaps/mobile' ) && (!contains(github.event.head_commit.message, 'Translate ')) + strategy: + fail-fast: false + matrix: + include: + - TRIPLET: 'arm-android' + ANDROID_ABI: 'armeabi-v7a' + - TRIPLET: 'arm64-android' + ANDROID_ABI: 'arm64-v8a' + runs-on: macos-15 env: - QT_VERSION: '6.8.3' # use scripts/update_qt_version.bash to change - NDK_VERSION: 'r26' # '26.1.10909125' - NDK_VERSION_FULL: r26b + NDK_VERSION: 'r27' # '27.2.12479018' + NDK_VERSION_FULL: r27c JDK_VERSION: 17 - SDK_PLATFORM: android-34 + SDK_PLATFORM: android-35 + ANDROIDAPI: 24 + VCPKG_BINARY_SOURCES: 'clear;nuget,GitHub,readwrite' SDK_BUILD_TOOLS: 34.0.0 - INPUT_SDK_VERSION_ARM: arm-android-20250326-241 - INPUT_SDK_VERSION_ARM64: arm64-android-20250326-241 - CCACHE_DIR: /Users/runner/work/ccache - GITHUB_TOKEN: ${{ secrets.INPUTAPP_BOT_GITHUB_TOKEN }} - CACHE_VERSION: 0 - CMAKE_VERSION: '3.29.0' + CMAKE_VERSION: '3.31.6' QT_ANDROID_KEYSTORE_ALIAS: input QT_ANDROID_KEYSTORE_KEY_PASS: ${{ secrets.INPUTKEYSTORE_STOREPASS }} QT_ANDROID_KEYSTORE_STORE_PASS: ${{ secrets.INPUTKEYSTORE_STOREPASS }} XC_VERSION: ${{ '16.2' }} + VCPKG_ROOT: "${{ github.workspace }}/vcpkg" steps: - uses: actions/checkout@v4 - - - name: Disk space before cleanup - run: | - df -h . + with: + path: mm # # Free up space by removing unused XCode versions @@ -58,51 +65,14 @@ jobs: run: | find /Applications/Xcode_* -maxdepth 0 -type d ! -name 'Xcode_${{ env.XC_VERSION }}.app' -exec rm -rf {} \; - - name: Disk space after cleanup - run: | - df -h . - - # CCache - - name: Prepare build cache for pull request - uses: pat-s/always-upload-cache@v3.0.11 - if: github.event_name == 'pull_request' - with: - path: ${{ env.CCACHE_DIR }} - key: build-android-ccache-${{ github.actor }}-${{ github.head_ref }}-${{ github.sha }} - # The head_ref or source branch of the pull request in a workflow run. - # The base_ref or target branch of the pull request in a workflow run. - restore-keys: | - build-android-ccache-${{ github.actor }}-${{ github.head_ref }}- - build-android-ccache-refs/heads/${{ github.base_ref }}- - build-android-ccache-refs/heads/master- - - - name: Prepare build cache for branch/tag - # use a fork of actions/cache@v2 to upload cache even when the build or test failed - uses: pat-s/always-upload-cache@v3.0.11 - if: github.event_name != 'pull_request' - with: - path: ${{ env.CCACHE_DIR }} - # The branch or tag ref that triggered the workflow run. For branches this in the format refs/heads/, and for tags it is refs/tags/ - key: build-android-ccache-${{ github.ref }}-${{ github.sha }} - restore-keys: | - build-android-ccache-${{ github.ref }}- - build-android-ccache-refs/heads/master- - - - name: Install ccache - run: | - mkdir -p ${CCACHE_DIR} - brew install ccache - ccache --set-config=max_size=2.0G - ccache -s - - name: Install Build Dependencies run: | - brew update - + brew uninstall cmake brew install gnupg - brew install openssl - brew install ninja - brew install aqtinstall + brew install automake bison flex gnu-sed autoconf-archive libtool gettext lcov openssl mono + echo $(brew --prefix bison)/bin >> $GITHUB_PATH + echo $(brew --prefix flex)/bin >> $GITHUB_PATH + echo $(brew --prefix gettext)/bin >> $GITHUB_PATH if [[ ${{ github.ref }} == refs/tags/* ]] then @@ -117,43 +87,34 @@ jobs: echo "GIT_TAG=$GIT_TAG" >> $GITHUB_ENV echo "GIT_BRANCH=$GIT_BRANCH" >> $GITHUB_ENV - - name: Install CMake and Ninja uses: lukka/get-cmake@latest with: cmakeVersion: ${{ env.CMAKE_VERSION }} - - name: Setup compiler - uses: maxim-lobanov/setup-xcode@v1 + - name: Setup XCode + uses: maxim-lobanov/setup-xcode@v1.6.0 with: xcode-version: ${{ env.XC_VERSION }} - - name: Cache Qt - id: cache-qt - uses: pat-s/always-upload-cache@v3.0.11 - with: - path: ${{ github.workspace }}/Qt - key: ${{ runner.os }}-QtCache-v6-${{ env.QT_VERSION }}-android - - - name: Install Qt - if: steps.cache-qt.outputs.cache-hit != 'true' + - name: Extract Mergin API_KEY + env: + MERGINSECRETS_DECRYPT_KEY: ${{ secrets.MERGINSECRETS_DECRYPT_KEY }} run: | - aqt install-qt \ - mac android ${{ env.QT_VERSION }} android_arm64_v8a \ - -m qtsensors qtconnectivity qt5compat qtmultimedia qtpositioning qtshadertools qtnetworkauth \ - -O ${{ github.workspace }}/Qt - - aqt install-qt \ - mac android ${{ env.QT_VERSION }} android_armv7 \ - -m qtsensors qtconnectivity qt5compat qtmultimedia qtpositioning qtshadertools qtnetworkauth \ - -O ${{ github.workspace }}/Qt - - aqt install-qt \ - mac desktop ${{ env.QT_VERSION }} \ - -m qtsensors qtconnectivity qt5compat qtmultimedia qtpositioning qtshadertools qtnetworkauth \ - -O ${{ github.workspace }}/Qt - - # Android SDK & NDK + cd mm/core/ + $HOMEBREW_PREFIX/bin/openssl \ + aes-256-cbc -d \ + -in merginsecrets.cpp.enc \ + -out merginsecrets.cpp \ + -k "$MERGINSECRETS_DECRYPT_KEY" \ + -md md5 + + - name: ccache + uses: hendrikmuhs/ccache-action@v1.2 + with: + key: ccache-${{ env.TRIPLET }} + max-size: 200M + - uses: nttld/setup-ndk@v1 id: setup-ndk with: @@ -173,112 +134,98 @@ jobs: run: | sdkmanager --verbose "platforms;${SDK_PLATFORM}" "build-tools;${SDK_BUILD_TOOLS}" tools platform-tools - # Input SDK - - name: Cache Input-SDK - id: cache-input-sdk - uses: pat-s/always-upload-cache@v3.0.11 - with: - path: ${{ github.workspace }}/input-sdk - key: ${{ runner.os }}-input-sdk-v0-${{ env.INPUT_SDK_VERSION_ARM }}-${{ env.CACHE_VERSION }} - - - name: Install Input-SDK - if: steps.cache-input-sdk.outputs.cache-hit != 'true' - run: | - # download - wget -O \ - input-sdk-arm-android.tar.gz \ - https://github.com/MerginMaps/mobile-sdk/releases/download/${{ env.INPUT_SDK_VERSION_ARM }}/mergin-maps-input-sdk-qt-${{ env.QT_VERSION }}-${{ env.INPUT_SDK_VERSION_ARM }}.tar.gz - - wget -O \ - input-sdk-arm64-android.tar.gz \ - https://github.com/MerginMaps/mobile-sdk/releases/download/${{ env.INPUT_SDK_VERSION_ARM64 }}/mergin-maps-input-sdk-qt-${{ env.QT_VERSION }}-${{ env.INPUT_SDK_VERSION_ARM64 }}.tar.gz - - # unpack - mkdir -p ${{ github.workspace }}/input-sdk/arm-android - cd ${{ github.workspace }}/input-sdk/arm-android - tar -xvzf ${{ github.workspace }}/input-sdk-arm-android.tar.gz - - mkdir -p ${{ github.workspace }}/input-sdk/arm64-android - cd ${{ github.workspace }}/input-sdk/arm64-android - tar -xvzf ${{ github.workspace }}/input-sdk-arm64-android.tar.gz - - # check - ls ${{ github.workspace }}/input-sdk - - - name: Extract Mergin API_KEY - env: - MERGINSECRETS_DECRYPT_KEY: ${{ secrets.MERGINSECRETS_DECRYPT_KEY }} - run: | - cd core/ - /opt/homebrew/bin/openssl \ - aes-256-cbc -d \ - -in merginsecrets.cpp.enc \ - -out merginsecrets.cpp \ - -k "$MERGINSECRETS_DECRYPT_KEY" \ - -md md5 - - name: Extract GPS keystore env: INPUTKEYSTORE_DECRYPT_KEY: ${{ secrets.INPUTKEYSTORE_DECRYPT_KEY }} run: | - /opt/homebrew/bin/openssl \ + $HOMEBREW_PREFIX/bin/openssl \ aes-256-cbc -d \ - -in Input_keystore.keystore.enc \ - -out Input_keystore.keystore \ + -in mm/Input_keystore.keystore.enc \ + -out mm/Input_keystore.keystore \ -k $INPUTKEYSTORE_DECRYPT_KEY \ -md md5 - PATH_TO_KEYSTORE=`pwd`/Input_keystore.keystore + PATH_TO_KEYSTORE=`pwd`/mm/Input_keystore.keystore echo "path to keystore $PATH_TO_KEYSTORE" echo "QT_ANDROID_KEYSTORE_PATH=$PATH_TO_KEYSTORE" >> $GITHUB_ENV - # Build Input App + - name: Install vcpkg + shell: bash + run: | + mkdir -p "${{ env.VCPKG_ROOT }}" + cd "${{ env.VCPKG_ROOT }}" + git init + git remote add origin https://github.com/microsoft/vcpkg.git + git pull origin master + VCPKG_TAG=`cat ${{ github.workspace }}/mm/VCPKG_BASELINE` + git checkout ${VCPKG_TAG} + cd "${{ env.VCPKG_ROOT }}" + chmod +x ./bootstrap-vcpkg.sh + ./bootstrap-vcpkg.sh + + - name: Setup NuGet Credentials + shell: bash + run: | + mono `${{ env.VCPKG_ROOT }}/vcpkg fetch nuget | tail -n 1` \ + sources add \ + -source "https://nuget.pkg.github.com/merginmaps/index.json" \ + -storepasswordincleartext \ + -name "GitHub" \ + -username "mergin-maps-bot" \ + -password "${{ secrets.MERGIN_MAPS_BOT_GITHUB_TOKEN }}" + + mono `${{ env.VCPKG_ROOT }}/vcpkg fetch nuget | tail -n 1` \ + setapikey "${{ secrets.MERGIN_MAPS_BOT_GITHUB_TOKEN }}" \ + -source "https://nuget.pkg.github.com/merginmaps/index.json" + - name: Calculate build number env: OFFFSET: 10 # offset for build number - due to previous builds ~ new builds must always have a higher number run: | BUILD_NUM=$GITHUB_RUN_NUMBER$((GITHUB_RUN_ATTEMPT + OFFFSET)) - echo "INPUT_VERSION_CODE=${BUILD_NUM}" >> $GITHUB_ENV + echo "MM_VERSION_CODE=${BUILD_NUM}" >> $GITHUB_ENV echo "Version code: ${BUILD_NUM}" # add build number to summary echo ":rocket: Build number: ${BUILD_NUM}" >> $GITHUB_STEP_SUMMARY - - name: Configure Input + - name: Configure app env: - ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} - ANDROID_NDK_HOST: darwin-x86_64 - QT_BASE: ${{ github.workspace }}/Qt/${{ env.QT_VERSION }} - INPUT_SDK_ANDROID_BASE: ${{ github.workspace }}/input-sdk - + ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} run: | - mkdir -p ${{ github.workspace }}/build-Input - cd ${{ github.workspace }}/build-Input + mkdir -p ${{ github.workspace }}/build-mm + cd ${{ github.workspace }}/build-mm + + export PATH=${{ env.VCPKG_ROOT }}:$PATH + export ANDROID_ABI=${{ matrix.ANDROID_ABI }} cmake \ -DCMAKE_BUILD_TYPE=Release \ - -DQT_ANDROID_ABIS="arm64-v8a;armeabi-v7a" \ - -DQT_HOST_PATH=$QT_BASE/macos \ + -DANDROID_SDK_ROOT=${ANDROID_SDK_ROOT} \ + -DANDROID_NDK_VERSION="${ANDROID_NDK_VERSION}" \ + -DANDROID_BUILD_TOOLS_VERSION="${ANDROID_BUILD_TOOLS_VERSION}" \ + -DVCPKG_HOST_TRIPLET=arm64-osx \ + -DVCPKG_TARGET_TRIPLET="${{ matrix.triplet }}" \ + -DVCPKG_INSTALL_OPTIONS="--allow-unsupported" \ + -DANDROID_ABI=${{ matrix.ANDROID_ABI }} \ + -DQT_ANDROID_ABIS=${{ matrix.ANDROID_ABI }} \ -DQT_ANDROID_SIGN_APK=Yes \ -DQT_ANDROID_SIGN_AAB=Yes \ -DUSE_MM_SERVER_API_KEY=Yes \ -DUSE_KEYCHAIN=No \ - -DCMAKE_TOOLCHAIN_FILE=$QT_BASE/android_arm64_v8a/lib/cmake/Qt6/qt.toolchain.cmake \ + -DCMAKE_TOOLCHAIN_FILE:PATH="${{ env.VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake" \ -GNinja \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ - -S ../ \ + -S ../mm \ -B ./ - name: Build APK env: - ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} - ANDROID_NDK_HOST: darwin-x86_64 - QT_BASE: ${{ github.workspace }}/Qt/${{ env.QT_VERSION }} - INPUT_SDK_ANDROID_BASE: ${{ github.workspace }}/input-sdk + ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} run: | - cd ${{ github.workspace }}/build-Input + cd ${{ github.workspace }}/build-mm ninja apk echo "APKs:" @@ -287,24 +234,21 @@ jobs: - name: Rename APK artefacts run: | mv \ - ${{ github.workspace }}/build-Input/app/android-build/build/outputs/apk/release/android-build-release-signed.apk \ - ${{ github.workspace }}/merginmaps-${{ env.INPUT_VERSION_CODE }}.apk + ${{ github.workspace }}/build-mm/app/android-build/build/outputs/apk/release/android-build-release-signed.apk \ + ${{ github.workspace }}/merginmaps-${{ env.MM_VERSION_CODE }}.apk - name: Upload APK to Artifacts uses: actions/upload-artifact@v4 with: - path: ${{ github.workspace }}/merginmaps-${{ env.INPUT_VERSION_CODE }}.apk - name: Mergin Maps ${{ env.INPUT_VERSION_CODE }} APK [v7 + v8a] + path: ${{ github.workspace }}/merginmaps-${{ env.MM_VERSION_CODE }}.apk + name: Mergin Maps ${{ env.MM_VERSION_CODE }} APK [${{ matrix.ANDROID_ABI }}] - name: Build AAB if: ${{ github.ref_name == 'master' || startsWith( github.ref_name, 'dev/' ) || github.ref_type == 'tag' }} env: - ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} - ANDROID_NDK_HOST: darwin-x86_64 - QT_BASE: ${{ github.workspace }}/Qt/${{ env.QT_VERSION }} - INPUT_SDK_ANDROID_BASE: ${{ github.workspace }}/input-sdk + ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} run: | - cd ${{ github.workspace }}/build-Input + cd ${{ github.workspace }}/build-mm ninja aab echo "AAB:" @@ -314,12 +258,12 @@ jobs: if: ${{ github.ref_name == 'master' || startsWith( github.ref_name, 'dev/' ) || github.ref_type == 'tag' }} run: | mv \ - ${{ github.workspace }}/build-Input/app/android-build/build/outputs/bundle/release/android-build-release.aab \ - ${{ github.workspace }}/merginmaps-${{ env.INPUT_VERSION_CODE }}.aab + ${{ github.workspace }}/build-mm/app/android-build/build/outputs/bundle/release/android-build-release.aab \ + ${{ github.workspace }}/merginmaps-${{ env.MM_VERSION_CODE }}.aab - name: Upload AAB to Artifacts if: ${{ github.ref_name == 'master' || startsWith( github.ref_name, 'dev/' ) || github.ref_type == 'tag' }} uses: actions/upload-artifact@v4 with: - path: ${{ github.workspace }}/merginmaps-${{ env.INPUT_VERSION_CODE }}.aab - name: Mergin Maps ${{ env.INPUT_VERSION_CODE }} AAB + path: ${{ github.workspace }}/merginmaps-${{ env.MM_VERSION_CODE }}.aab + name: Mergin Maps ${{ env.MM_VERSION_CODE }} AAB [${{ matrix.ANDROID_ABI }}] diff --git a/.github/workflows/gallery.yml b/.github/workflows/gallery.yml index 764b28075..87fa1b354 100644 --- a/.github/workflows/gallery.yml +++ b/.github/workflows/gallery.yml @@ -3,7 +3,6 @@ on: push: paths: - 'app/qml/**' - - 'app/qmlV2/**' - 'gallery/**' - '.github/workflows/gallery.yml' diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml index 90db9943d..2ad610f45 100644 --- a/.github/workflows/ios.yml +++ b/.github/workflows/ios.yml @@ -1,30 +1,33 @@ name: iOS Build + on: push: paths: - - 'app/**' - - 'core/**' - - 'scripts/**' - - 'cmake/**' - - 'cmake_templates/**' - - 'CMakeLists.txt' - - '.github/workflows/ios.yml' - - '.github/secrets/ios/**' + - 'vcpkg/**' + - 'vcpkg.json' + - 'VCPKG_BASELINE' + - 'app/**' + - 'core/**' + - 'scripts/**' + - 'cmake/**' + - 'cmake_templates/**' + - 'CMakeLists.txt' + - '.github/workflows/ios.yml' + - '.github/secrets/ios/**' release: types: - published -env: - QT_VERSION: '6.8.3' # use scripts/update_qt_version.bash to change +env: + CMAKE_VERSION: '3.31.6' + VCPKG_BINARY_SOURCES: 'clear;nuget,GitHub,readwrite' + VCPKG_ROOT: '${{ github.workspace }}/vcpkg' XC_VERSION: ${{ '16.4' }} - IOS_CMAKE_TOOLCHAIN_VERSION: "4.4.0" - INPUT_SDK_VERSION: arm64-ios-20250326-198 + DEPLOYMENT_TARGET: '14.0' + TRIPLET: arm64-ios IOS_PROVISIONING_PROFILE_UUID: 59aaa8d7-516a-4592-8c58-d7d1c1f81610 KEYCHAIN: ${{ 'inputapp.keychain' }} - CCACHE_DIR: /Users/runner/work/ccache - CMAKE_VERSION: '3.29.0' - CACHE_VERSION: 0 concurrency: group: ci-${{github.ref}}-ios @@ -35,71 +38,70 @@ jobs: if: ( github.repository == 'MerginMaps/mobile' ) && (!contains(github.event.head_commit.message, 'Translate ')) runs-on: macos-15 steps: - - name: Select latest Xcode - run: "sudo xcode-select -s /Applications/Xcode_$XC_VERSION.app" - - - uses: actions/checkout@v4 - - - name: Download ios-cmake toolchain + - name: Checkout uses: actions/checkout@v4 with: - repository: leetal/ios-cmake - ref: ${{ env.IOS_CMAKE_TOOLCHAIN_VERSION }} - path: ios-cmake - - # CCache - - name: Prepare build cache for pull request - uses: pat-s/always-upload-cache@v3.0.11 - if: github.event_name == 'pull_request' - with: - path: ${{ env.CCACHE_DIR }} - key: build-ios-ccache-${{ github.actor }}-${{ github.head_ref }}-${{ github.sha }} - # The head_ref or source branch of the pull request in a workflow run. - # The base_ref or target branch of the pull request in a workflow run. - restore-keys: | - build-ios-ccache-${{ github.actor }}-${{ github.head_ref }}- - build-ios-ccache-refs/heads/${{ github.base_ref }}- - build-ios-ccache-refs/heads/master- - - - name: Prepare build cache for branch/tag - # use a fork of actions/cache@v2 to upload cache even when the build or test failed - uses: pat-s/always-upload-cache@v3.0.11 - if: github.event_name != 'pull_request' - with: - path: ${{ env.CCACHE_DIR }} - # The branch or tag ref that triggered the workflow run. For branches this in the format refs/heads/, and for tags it is refs/tags/ - key: build-ios-ccache-${{ github.ref }}-${{ github.sha }} - restore-keys: | - build-ios-ccache-${{ github.ref }}- - build-ios-ccache-refs/heads/master- + path: mm - name: Install brew deps run: | - brew update - brew install aqtinstall - + brew uninstall cmake + brew install automake bison flex gnu-sed autoconf-archive libtool gettext lcov openssl create-dmg mono brew install gnupg - brew install openssl - brew install ccache - brew install ninja - + echo $(brew --prefix bison)/bin >> $GITHUB_PATH + echo $(brew --prefix flex)/bin >> $GITHUB_PATH + echo $(brew --prefix gettext)/bin >> $GITHUB_PATH - name: Install CMake and Ninja uses: lukka/get-cmake@latest with: cmakeVersion: ${{ env.CMAKE_VERSION }} - - - name: Install ccache + + - name: Setup XCode + uses: maxim-lobanov/setup-xcode@v1.6.0 + with: + xcode-version: ${{ env.XC_VERSION }} + + - name: ccache + uses: hendrikmuhs/ccache-action@v1.2 + with: + key: ccache-${{ env.TRIPLET }} + max-size: 200M + + - name: Install vcpkg + shell: bash run: | - mkdir -p ${CCACHE_DIR} - ccache --set-config=max_size=2.0G - ccache -s + mkdir -p "${{ env.VCPKG_ROOT }}" + cd "${{ env.VCPKG_ROOT }}" + git init + git remote add origin https://github.com/microsoft/vcpkg.git + git pull origin master + VCPKG_TAG=`cat ${{ github.workspace }}/mm/VCPKG_BASELINE` + git checkout ${VCPKG_TAG} + cd "${{ env.VCPKG_ROOT }}" + chmod +x ./bootstrap-vcpkg.sh + ./bootstrap-vcpkg.sh + + - name: Setup NuGet Credentials + shell: bash + run: | + mono `${{ env.VCPKG_ROOT }}/vcpkg fetch nuget | tail -n 1` \ + sources add \ + -source "https://nuget.pkg.github.com/merginmaps/index.json" \ + -storepasswordincleartext \ + -name "GitHub" \ + -username "mergin-maps-bot" \ + -password "${{ secrets.MERGIN_MAPS_BOT_GITHUB_TOKEN }}" + + mono `${{ env.VCPKG_ROOT }}/vcpkg fetch nuget | tail -n 1` \ + setapikey "${{ secrets.MERGIN_MAPS_BOT_GITHUB_TOKEN }}" \ + -source "https://nuget.pkg.github.com/merginmaps/index.json" - name: Extract Mergin API_KEY env: MERGINSECRETS_DECRYPT_KEY: ${{ secrets.MERGINSECRETS_DECRYPT_KEY }} run: | - cd core/ - /opt/homebrew/bin/openssl \ + cd mm/core/ + $HOMEBREW_PREFIX/bin/openssl \ aes-256-cbc -d \ -in merginsecrets.cpp.enc \ -out merginsecrets.cpp \ @@ -120,111 +122,75 @@ jobs: IOS_GPG_KEY: ${{ secrets.IOS_GPG_KEY }} IOS_CERT_KEY: ${{ secrets.IOS_CERT_KEY }} run: | - gpg --quiet --batch --yes --decrypt --passphrase="$IOS_GPG_KEY" --output ./.github/secrets/ios/Certificates_ios_dist.p12 ./.github/secrets/ios/Certificates_ios_dist.p12.gpg - security import "./.github/secrets/ios/Certificates_ios_dist.p12" -k "$KEYCHAIN" -P "$IOS_CERT_KEY" -A + gpg --quiet --batch --yes --decrypt --passphrase="$IOS_GPG_KEY" --output ./mm/.github/secrets/ios/Certificates_ios_dist.p12 ./mm/.github/secrets/ios/Certificates_ios_dist.p12.gpg + security import "./mm/.github/secrets/ios/Certificates_ios_dist.p12" -k "$KEYCHAIN" -P "$IOS_CERT_KEY" -A security set-key-partition-list -S apple-tool:,apple: -s -k "" "$KEYCHAIN" mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles - gpg --quiet --batch --yes --decrypt --passphrase="$IOS_GPG_KEY" --output ./.github/secrets/ios/LutraConsultingLtdInputAppStore.mobileprovision ./.github/secrets/ios/LutraConsultingLtdInputAppStore.mobileprovision.gpg - cp ./.github/secrets/ios/LutraConsultingLtdInputAppStore.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/${IOS_PROVISIONING_PROFILE_UUID}.mobileprovision - - # Input SDK - - name: Cache Input-SDK - id: cache-input-sdk - uses: pat-s/always-upload-cache@v3.0.11 - with: - path: ${{ github.workspace }}/input-sdk - key: ${{ runner.os }}-input-sdk-v0-${{ env.INPUT_SDK_VERSION }}-${{ env.CACHE_VERSION }} - - - name: Install Input-SDK - if: steps.cache-input-sdk.outputs.cache-hit != 'true' - run: | - wget -O \ - ${{ github.workspace }}/input-sdk.tar.gz \ - https://github.com/MerginMaps/mobile-sdk/releases/download/${{ env.INPUT_SDK_VERSION }}/mergin-maps-input-sdk-qt-${{ env.QT_VERSION }}-${{ env.INPUT_SDK_VERSION }}.tar.gz - mkdir -p ${{ github.workspace }}/input-sdk/arm64-ios - cd ${{ github.workspace }}/input-sdk/arm64-ios - tar -xvzf ${{ github.workspace }}/input-sdk.tar.gz - - # Qt - - name: Cache Qt - id: cache-qt - uses: pat-s/always-upload-cache@v3.0.11 - with: - path: ${{ github.workspace }}/Qt - key: ${{ runner.os }}-QtCache-v3-${{ env.QT_VERSION }}-ios - - - name: Install Qt - if: steps.cache-qt.outputs.cache-hit != 'true' - run: | - aqt install-qt \ - mac ios ${{ env.QT_VERSION }} \ - -m qtsensors qtconnectivity qt5compat qtmultimedia qtpositioning qtshadertools qtnetworkauth\ - -O ${{ github.workspace }}/Qt - - aqt install-qt \ - mac desktop ${{ env.QT_VERSION }} \ - -m qtsensors qtconnectivity qt5compat qtmultimedia qtpositioning qtshadertools qtnetworkauth\ - -O ${{ github.workspace }}/Qt + gpg --quiet --batch --yes --decrypt --passphrase="$IOS_GPG_KEY" --output ./mm/.github/secrets/ios/LutraConsultingLtdInputAppStore.mobileprovision ./mm/.github/secrets/ios/LutraConsultingLtdInputAppStore.mobileprovision.gpg + cp ./mm/.github/secrets/ios/LutraConsultingLtdInputAppStore.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/${IOS_PROVISIONING_PROFILE_UUID}.mobileprovision - name: Calculate a build number env: OFFFSET: 10 # offset for build number - due to previous builds ~ new builds must always have a higher number run: | - BUILD_NUM=$GITHUB_RUN_NUMBER$((GITHUB_RUN_ATTEMPT + OFFFSET)) + BUILD_NUM=$GITHUB_RUN_NUMBER$((GITHUB_RUN_ATTEMPT + OFFFSET)) - TIMESTAMP=`date "+%y.%-m"` - CF_BUNDLE_VERSION=${TIMESTAMP}.${BUILD_NUM} + TIMESTAMP=`date "+%y.%-m"` + CF_BUNDLE_VERSION=${TIMESTAMP}.${BUILD_NUM} - echo "INPUT_VERSION_CODE=${CF_BUNDLE_VERSION}" >> $GITHUB_ENV - echo "Build number: ${CF_BUNDLE_VERSION}" + echo "MM_VERSION_CODE=${CF_BUNDLE_VERSION}" >> $GITHUB_ENV + echo "Build number: ${CF_BUNDLE_VERSION}" - # add build number to summary - echo ":rocket: Build number: ${CF_BUNDLE_VERSION}" >> $GITHUB_STEP_SUMMARY + # add build number to summary + echo ":rocket: Build number: ${CF_BUNDLE_VERSION}" >> $GITHUB_STEP_SUMMARY - name: Create build system with cmake run: | - mkdir -p install-Input - mkdir -p build-INPUT - cd build-INPUT - - ls -1 ${{ github.workspace }}/Qt/${{ env.QT_VERSION }} + mkdir -p install-mm + mkdir -p build-mm + cd build-mm # run cmake cmake \ - -DCMAKE_TOOLCHAIN_FILE:PATH="${{ github.workspace }}/ios-cmake/ios.toolchain.cmake" \ - -DCMAKE_PREFIX_PATH=${{ github.workspace }}/Qt/${{ env.QT_VERSION }}/ios \ -DIOS_USE_PRODUCTION_SIGNING=TRUE \ - -DQT_HOST_PATH=${{ github.workspace }}/Qt/${{ env.QT_VERSION }}/macos \ + -DVCPKG_HOST_TRIPLET=arm64-osx \ + -DVCPKG_TARGET_TRIPLET=${{ env.TRIPLET }} \ + -DCMAKE_TOOLCHAIN_FILE=${{ env.VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake \ + -D ENABLE_BITCODE=OFF \ + -D ENABLE_ARC=ON \ + -D CMAKE_CXX_VISIBILITY_PRESET=hidden \ + -D CMAKE_SYSTEM_NAME=iOS \ + -D CMAKE_SYSTEM_PROCESSOR=aarch64 \ + -D CMAKE_OSX_DEPLOYMENT_TARGET=${{ env.DEPLOYMENT_TARGET }} \ -DIOS=TRUE \ -DUSE_MM_SERVER_API_KEY=TRUE \ -DUSE_KEYCHAIN=No \ - -DCMAKE_INSTALL_PREFIX:PATH=../install-Input \ - -DINPUT_SDK_PATH=${{ github.workspace }}/input-sdk/arm64-ios \ + -DCMAKE_INSTALL_PREFIX:PATH=../install-mm \ -G "Xcode" \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ - -S ${{ github.workspace }} \ + -S ${{ github.workspace }}/mm \ -B ./ - - - name: Build Input + + - name: Build app (release) run: | - cd build-INPUT + cd build-mm xcodebuild \ - -project Input.xcodeproj/ \ - -scheme Input \ + -project MerginMaps.xcodeproj/ \ + -scheme MerginMaps \ -sdk iphoneos \ -configuration Release \ - archive -archivePath Input.xcarchive \ + archive -archivePath MerginMaps.xcarchive \ "OTHER_CODE_SIGN_FLAGS=--keychain '$KEYCHAIN'" - - name: Create Input Package + - name: Create package run: | - INPUT_DIR=`pwd` - cd build-INPUT + INPUT_DIR=`pwd`/mm + cd build-mm xcodebuild \ - -archivePath Input.xcarchive \ + -archivePath MerginMaps.xcarchive \ -exportOptionsPlist $INPUT_DIR/scripts/ci/ios/exportOptions.plist \ -exportPath $PWD \ -allowProvisioningUpdates \ @@ -237,6 +203,6 @@ jobs: INPUTAPP_BOT_GITHUB_TOKEN: ${{ secrets.INPUTAPP_BOT_GITHUB_TOKEN }} if: success() run: | - CF_BUNDLE_VERSION=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" build-INPUT/app/CMakeFiles/Input.dir/Info.plist` + CF_BUNDLE_VERSION=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" build-mm/app/CMakeFiles/MerginMaps.dir/Info.plist` echo "Publishing ios ${CF_BUNDLE_VERSION}" - xcrun altool --upload-app -t ios -f build-INPUT/Input.ipa -u "$INPUTAPP_BOT_APPLEID_USER" -p "$INPUTAPP_BOT_APPLEID_PASS" --verbose + xcrun altool --upload-app -t ios -f build-mm/MerginMaps.ipa -u "$INPUTAPP_BOT_APPLEID_USER" -p "$INPUTAPP_BOT_APPLEID_PASS" --verbose diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 8defae042..7679bc02a 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -1,7 +1,11 @@ name: linux Build + on: push: paths: + - 'vcpkg/**' + - 'vcpkg.json' + - 'VCPKG_BASELINE' - 'app/**' - 'core/**' - 'scripts/**' @@ -16,12 +20,11 @@ on: - published env: - CCACHE_DIR: ~/.ccache - INPUT_SDK_VERSION: x64-linux-20250327-197 - QT_VERSION: '6.8.3' # use scripts/update_qt_version.bash to change - CMAKE_VERSION: '3.29.0' - CACHE_VERSION: 0 - + CMAKE_VERSION: '3.31.6' + VCPKG_BINARY_SOURCES: 'clear;nuget,GitHub,readwrite' + VCPKG_ROOT: "${{ github.workspace }}/vcpkg" + TRIPLET: x64-linux + concurrency: group: ci-${{github.ref}}-linux cancel-in-progress: true @@ -31,10 +34,13 @@ jobs: if: ( github.repository == 'MerginMaps/mobile' ) && (!contains(github.event.head_commit.message, 'Translate ')) runs-on: ubuntu-22.04 steps: - - name: Checkout Input - uses: actions/checkout@v3 + - name: Checkout + uses: actions/checkout@v4 with: - path: input + path: mm + + - name: Free Disk Space + uses: jlumbroso/free-disk-space@main - name: Install Build Dependencies run: | @@ -44,28 +50,21 @@ jobs: gperf autopoint '^libxcb.*-dev' libx11-xcb-dev libegl1-mesa libegl1-mesa-dev \ libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev \ autoconf-archive libgstreamer-gl1.0-0 libgstreamer-plugins-base1.0-0 libfuse2 \ - bison flex ccache lcov + bison flex lcov nasm libxrandr-dev xvfb + + # Required to run unit tests on linux + echo "QT_QPA_PLATFORM=offscreen" >> $GITHUB_ENV - name: Install CMake and Ninja uses: lukka/get-cmake@latest with: cmakeVersion: ${{ env.CMAKE_VERSION }} - - - name: Install Qt - uses: jurplel/install-qt-action@v3 - with: - version: ${{ env.QT_VERSION }} - setup-python: 'false' - modules: 'qtsensors qtconnectivity qt5compat qtmultimedia qtpositioning qtshadertools qtnetworkauth' - dir: ${{ github.workspace }} - cache: true - cache-key-prefix: ${{ runner.os }}-QtCache-v0-${{ env.QT_VERSION }}-lnx - name: Extract Mergin API_KEY env: MERGINSECRETS_DECRYPT_KEY: ${{ secrets.MERGINSECRETS_DECRYPT_KEY }} run: | - cd input/core/ + cd mm/core/ openssl \ aes-256-cbc -d \ -in merginsecrets.cpp.enc \ @@ -73,84 +72,65 @@ jobs: -k "$MERGINSECRETS_DECRYPT_KEY" \ -md md5 - # CCache - - name: Prepare build cache for pull request - uses: pat-s/always-upload-cache@v3.0.11 - if: github.event_name == 'pull_request' - with: - path: ${{ env.CCACHE_DIR }} - key: build-linux-ccache-${{ github.actor }}-${{ github.head_ref }}-${{ github.sha }} - # The head_ref or source branch of the pull request in a workflow run. - # The base_ref or target branch of the pull request in a workflow run. - restore-keys: | - build-linux-ccache-${{ github.actor }}-${{ github.head_ref }}- - build-linux-ccache-refs/heads/${{ github.base_ref }}- - build-linux-ccache-refs/heads/master- - - - name: Prepare build cache for branch/tag - # use a fork of actions/cache@v2 to upload cache even when the build or test failed - uses: pat-s/always-upload-cache@v3.0.11 - if: github.event_name != 'pull_request' + - name: ccache + uses: hendrikmuhs/ccache-action@v1.2 with: - path: ${{ env.CCACHE_DIR }} - # The branch or tag ref that triggered the workflow run. For branches this in the format refs/heads/, and for tags it is refs/tags/ - key: build-linux-ccache-${{ github.ref }}-${{ github.sha }} - restore-keys: | - build-linux-ccache-${{ github.ref }}- - build-linux-ccache-refs/heads/master- - - - name: Install ccache - run: | - mkdir -p ${CCACHE_DIR} - ccache --set-config=max_size=2.0G - ccache -s - - # Input SDK - - name: Cache Input-SDK - id: cache-input-sdk - uses: pat-s/always-upload-cache@v3.0.11 - with: - path: ${{ github.workspace }}/input-sdk - key: ${{ runner.os }}-input-sdk-v0-${{ env.INPUT_SDK_VERSION }}-${{ env.CACHE_VERSION }} + key: ccache-${{ env.TRIPLET }} + max-size: 200M - - name: Install Input-SDK - if: steps.cache-input-sdk.outputs.cache-hit != 'true' + - name: Install vcpkg + shell: bash + run: | + mkdir -p "${{ env.VCPKG_ROOT }}" + cd "${{ env.VCPKG_ROOT }}" + git init + git remote add origin https://github.com/microsoft/vcpkg.git + git pull origin master + VCPKG_TAG=`cat ${{ github.workspace }}/mm/VCPKG_BASELINE` + git checkout ${VCPKG_TAG} + cd "${{ env.VCPKG_ROOT }}" + chmod +x ./bootstrap-vcpkg.sh + ./bootstrap-vcpkg.sh + + - name: Setup NuGet Credentials + shell: bash run: | - wget -O \ - ${{ github.workspace }}/input-sdk.tar.gz \ - https://github.com/MerginMaps/mobile-sdk/releases/download/${{ env.INPUT_SDK_VERSION }}/mergin-maps-input-sdk-qt-${{ env.QT_VERSION }}-${{ env.INPUT_SDK_VERSION }}.tar.gz - mkdir -p ${{ github.workspace }}/input-sdk/x64-linux - cd ${{ github.workspace }}/input-sdk/x64-linux - tar -xvzf ${{ github.workspace }}/input-sdk.tar.gz - - # Build Input App + mono `${{ env.VCPKG_ROOT }}/vcpkg fetch nuget | tail -n 1` \ + sources add \ + -source "https://nuget.pkg.github.com/merginmaps/index.json" \ + -storepasswordincleartext \ + -name "GitHub" \ + -username "mergin-maps-bot" \ + -password "${{ secrets.MERGIN_MAPS_BOT_GITHUB_TOKEN }}" + + mono `${{ env.VCPKG_ROOT }}/vcpkg fetch nuget | tail -n 1` \ + setapikey "${{ secrets.MERGIN_MAPS_BOT_GITHUB_TOKEN }}" \ + -source "https://nuget.pkg.github.com/merginmaps/index.json" + - name: Calculate build number run: | BUILD_NUM=$GITHUB_RUN_NUMBER$GITHUB_RUN_ATTEMPT - echo "INPUT_VERSION_CODE=${BUILD_NUM}" >> $GITHUB_ENV + echo "MM_VERSION_CODE=${BUILD_NUM}" >> $GITHUB_ENV echo "Version code: ${BUILD_NUM}" - - # Do Tests - - name: build Input (Debug) + - name: build app (debug) run: | - mkdir -p build-Input-db - cd build-Input-db + mkdir -p build-mm-db + cd build-mm-db cmake \ -DCMAKE_BUILD_TYPE=Debug \ - -DCMAKE_PREFIX_PATH=${{ github.workspace }}/Qt/${{ env.QT_VERSION }}/gcc_64 \ - -DUSE_SERVER_API_KEY=TRUE \ + -DVCPKG_TARGET_TRIPLET=${{ env.TRIPLET }} \ + -DCMAKE_TOOLCHAIN_FILE=${{ env.VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake \ -DUSE_KEYCHAIN=No \ - -DINPUT_SDK_PATH=${{ github.workspace }}/input-sdk/x64-linux \ - -DQGIS_QUICK_DATA_PATH=${{ github.workspace }}/input/app/android/assets/qgis-data \ + -DQGIS_QUICK_DATA_PATH=${{ github.workspace }}/build-mm-db/app/android/assets/qgis-data \ -DUSE_MM_SERVER_API_KEY=TRUE \ -DCOVERAGE=TRUE \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DENABLE_TESTS=TRUE \ -GNinja \ - -S ../input + -S ../mm ninja @@ -161,12 +141,12 @@ jobs: TEST_API_PASSWORD: ${{ secrets.TEST_API_PASSWORD }} QT_QPA_PLATFORM: "offscreen" run: | - cd build-Input-db/ + cd build-mm-db/ xvfb-run --server-args="-screen 0 640x480x24" ctest --output-on-failure - name: build lcov summary run: | - cd build-Input-db + cd build-mm-db lcov --directory . --capture --output-file coverage.info @@ -177,28 +157,28 @@ jobs: uses: coverallsapp/github-action@master with: github-token: ${{ secrets.GITHUB_TOKEN }} - path-to-lcov: build-Input-db/coverage.info + path-to-lcov: build-mm-db/coverage.info - - name: build Input + - name: build app run: | - mkdir -p install-Input - mkdir -p build-Input - cd build-Input + mkdir -p install-mm + mkdir -p build-mm + cd build-mm cmake \ -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_PREFIX_PATH=${{ github.workspace }}/Qt/${{ env.QT_VERSION }}/gcc_64 \ - -DCMAKE_INSTALL_PREFIX:PATH=../install-Input \ - -DINPUT_SDK_PATH=${{ github.workspace }}/input-sdk/x64-linux \ - -DQGIS_QUICK_DATA_PATH=${{ github.workspace }}/input/app/android/assets/qgis-data \ + -DVCPKG_TARGET_TRIPLET=${{ env.TRIPLET }} \ + -DCMAKE_TOOLCHAIN_FILE=${{ env.VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake \ + -DCMAKE_INSTALL_PREFIX:PATH=../install-mm \ + -DQGIS_QUICK_DATA_PATH=${{ github.workspace }}/build-mm/app/android/assets/qgis-data \ -DUSE_MM_SERVER_API_KEY=TRUE \ -DUSE_KEYCHAIN=No \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -GNinja \ - -S ../input + -S ../mm ninja - ninja install + ninja install - name: Get TimeStamp id: time @@ -206,16 +186,16 @@ jobs: with: format: 'YYYYMMDD' - - name: package Input + - name: package app run: | - INPUT_TAR=input-${{ env.INPUT_SDK_VERSION }}-${{ steps.time.outputs.formattedTime }}-${{ github.run_number }}.tar.gz - echo "INPUT_TAR=${INPUT_TAR}" >> $GITHUB_ENV + MM_TAR=input-${{ env.MM_VERSION_CODE }}-${{ steps.time.outputs.formattedTime }}-${{ github.run_number }}.tar.gz + echo "MM_TAR=${MM_TAR}" >> $GITHUB_ENV - cd ${{ github.workspace }}/install-Input + cd ${{ github.workspace }}/install-mm find . - tar -c -z -f ${{ github.workspace }}/${INPUT_TAR} ./ + tar -c -z -f ${{ github.workspace }}/${MM_TAR} ./ - name: Upload Sdk in Artifacts uses: actions/upload-artifact@v4 with: - path: ${{ github.workspace }}/${{ env.INPUT_TAR }} + path: ${{ github.workspace }}/${{ env.MM_TAR }} diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 3056db56b..404f36014 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -2,26 +2,29 @@ name: macOS Build on: push: paths: - - 'app/**' - - 'core/**' - - 'scripts/**' - - 'cmake/**' - - 'cmake_templates/**' - - 'test/**' - - 'CMakeLists.txt' - - '.github/workflows/macos.yml' + - 'vcpkg/**' + - 'vcpkg.json' + - 'VCPKG_BASELINE' + - 'app/**' + - 'core/**' + - 'scripts/**' + - 'cmake/**' + - 'cmake_templates/**' + - 'test/**' + - 'CMakeLists.txt' + - '.github/workflows/macos.yml' release: types: - published env: - QT_VERSION: '6.8.3' # use scripts/update_qt_version.bash to change - INPUT_SDK_VERSION: x64-osx-20250326-218 - CCACHE_DIR: /Users/runner/work/ccache - CACHE_VERSION: 0 - CMAKE_VERSION: '3.29.0' - XC_VERSION: ${{ '15.2' }} + CMAKE_VERSION: '3.31.6' + VCPKG_BINARY_SOURCES: 'clear;nuget,GitHub,readwrite' + VCPKG_ROOT: '${{ github.workspace }}/vcpkg' + XC_VERSION: ${{ '16.4' }} + DEPLOYMENT_TARGET: '11.0' + TRIPLET: arm64-osx concurrency: group: ci-${{github.ref}}-macos @@ -30,125 +33,101 @@ concurrency: jobs: macos_build: if: ( github.repository == 'MerginMaps/mobile' ) && (!contains(github.event.head_commit.message, 'Translate ')) - runs-on: macos-13 + runs-on: macos-15 steps: - - name: Checkout Input - uses: actions/checkout@v3 + - name: Checkout + uses: actions/checkout@v4 with: - path: input + path: mm - - name: Select latest Xcode - run: "sudo xcode-select -s /Applications/Xcode_$XC_VERSION.app" - - - name: install brew deps + - name: Install brew deps run: | - brew install lcov - brew install ccache - brew install ninja + brew uninstall cmake + brew install automake bison flex gnu-sed autoconf-archive libtool gettext lcov openssl create-dmg mono + echo $(brew --prefix bison)/bin >> $GITHUB_PATH + echo $(brew --prefix flex)/bin >> $GITHUB_PATH + echo $(brew --prefix gettext)/bin >> $GITHUB_PATH - name: Install CMake and Ninja uses: lukka/get-cmake@latest with: cmakeVersion: ${{ env.CMAKE_VERSION }} - + + - name: Setup XCode + uses: maxim-lobanov/setup-xcode@v1.6.0 + with: + xcode-version: ${{ env.XC_VERSION }} + - name: Extract Mergin API_KEY env: MERGINSECRETS_DECRYPT_KEY: ${{ secrets.MERGINSECRETS_DECRYPT_KEY }} run: | - cd input/core/ - /usr/local/opt/openssl@1.1/bin/openssl \ + cd mm/core/ + $HOMEBREW_PREFIX/bin/openssl \ aes-256-cbc -d \ -in merginsecrets.cpp.enc \ -out merginsecrets.cpp \ -k "$MERGINSECRETS_DECRYPT_KEY" \ -md md5 - # CCache - - name: Prepare build cache for pull request - uses: pat-s/always-upload-cache@v3.0.11 - if: github.event_name == 'pull_request' - with: - path: ${{ env.CCACHE_DIR }} - key: build-mac-ccache-${{ github.actor }}-${{ github.head_ref }}-${{ github.sha }} - # The head_ref or source branch of the pull request in a workflow run. - # The base_ref or target branch of the pull request in a workflow run. - restore-keys: | - build-mac-ccache-${{ github.actor }}-${{ github.head_ref }}- - build-mac-ccache-refs/heads/${{ github.base_ref }}- - build-mac-ccache-refs/heads/master- - - - name: Prepare build cache for branch/tag - # use a fork of actions/cache@v2 to upload cache even when the build or test failed - uses: pat-s/always-upload-cache@v3.0.11 - if: github.event_name != 'pull_request' - with: - path: ${{ env.CCACHE_DIR }} - # The branch or tag ref that triggered the workflow run. For branches this in the format refs/heads/, and for tags it is refs/tags/ - key: build-mac-ccache-${{ github.ref }}-${{ github.sha }} - restore-keys: | - build-mac-ccache-${{ github.ref }}- - build-mac-ccache-refs/heads/master- - - - name: Install ccache - run: | - mkdir -p ${CCACHE_DIR} - ccache --set-config=max_size=2.0G - ccache -s - - # Qt - - name: Install Qt - uses: jurplel/install-qt-action@v3 - with: - version: ${{ env.QT_VERSION }} - target: desktop - dir: ${{ github.workspace }} - modules: 'qtsensors qtconnectivity qt5compat qtmultimedia qtpositioning qtshadertools qtnetworkauth' - cache: true - cache-key-prefix: ${{ runner.os }}-QtCache-v0-${{ env.QT_VERSION }}-mac - - # Input SDK - - name: Cache Input-SDK - id: cache-input-sdk - uses: pat-s/always-upload-cache@v3.0.11 + - name: ccache + uses: hendrikmuhs/ccache-action@v1.2 with: - path: ${{ github.workspace }}/input-sdk - key: ${{ runner.os }}-input-sdk-v0-${{ env.INPUT_SDK_VERSION }}-${{ env.CACHE_VERSION }} + key: ccache-${{ env.TRIPLET }} + max-size: 200M - - name: Install Input-SDK - if: steps.cache-input-sdk.outputs.cache-hit != 'true' + - name: Install vcpkg + shell: bash run: | - wget -O \ - ${{ github.workspace }}/input-sdk.tar.gz \ - https://github.com/MerginMaps/mobile-sdk/releases/download/${{ env.INPUT_SDK_VERSION }}/mergin-maps-input-sdk-qt-${{ env.QT_VERSION }}-${{ env.INPUT_SDK_VERSION }}.tar.gz - mkdir -p ${{ github.workspace }}/input-sdk/x64-osx - cd ${{ github.workspace }}/input-sdk/x64-osx - tar -xvzf ${{ github.workspace }}/input-sdk.tar.gz - - # Build Input App - - name: Calculate build number + mkdir -p "${{ env.VCPKG_ROOT }}" + cd "${{ env.VCPKG_ROOT }}" + git init + git remote add origin https://github.com/microsoft/vcpkg.git + git pull origin master + VCPKG_TAG=`cat ${{ github.workspace }}/mm/VCPKG_BASELINE` + git checkout ${VCPKG_TAG} + cd "${{ env.VCPKG_ROOT }}" + chmod +x ./bootstrap-vcpkg.sh + ./bootstrap-vcpkg.sh + + - name: Setup NuGet Credentials + shell: bash run: | - BUILD_NUM=$GITHUB_RUN_NUMBER$GITHUB_RUN_ATTEMPT - echo "INPUT_VERSION_CODE=${BUILD_NUM}" >> $GITHUB_ENV - echo "Version code: ${BUILD_NUM}" + mono `${{ env.VCPKG_ROOT }}/vcpkg fetch nuget | tail -n 1` \ + sources add \ + -source "https://nuget.pkg.github.com/merginmaps/index.json" \ + -storepasswordincleartext \ + -name "GitHub" \ + -username "mergin-maps-bot" \ + -password "${{ secrets.MERGIN_MAPS_BOT_GITHUB_TOKEN }}" + + mono `${{ env.VCPKG_ROOT }}/vcpkg fetch nuget | tail -n 1` \ + setapikey "${{ secrets.MERGIN_MAPS_BOT_GITHUB_TOKEN }}" \ + -source "https://nuget.pkg.github.com/merginmaps/index.json" - # Do Tests - - name: build Input (Debug) + - name: Calculate build number run: | - mkdir -p build-Input-db - cd build-Input-db - + BUILD_NUM=$GITHUB_RUN_NUMBER$GITHUB_RUN_ATTEMPT + echo "MM_VERSION_CODE=${BUILD_NUM}" >> $GITHUB_ENV + echo "Version code: ${BUILD_NUM}" + - name: build app (debug) + run: | + mkdir -p build-mm-db + cd build-mm-db + cmake \ -DCMAKE_BUILD_TYPE=Debug \ - -DCMAKE_PREFIX_PATH=${{ github.workspace }}/Qt/${{ env.QT_VERSION }}/macos \ - -DUSE_SERVER_API_KEY=TRUE \ + -DVCPKG_TARGET_TRIPLET=${{ env.TRIPLET }} \ + -DCMAKE_TOOLCHAIN_FILE=${{ env.VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake \ + -DUSE_MM_SERVER_API_KEY=TRUE \ + -DHAVE_BLUETOOTH=FALSE \ -DUSE_KEYCHAIN=No \ - -DINPUT_SDK_PATH=${{ github.workspace }}/input-sdk/x64-osx \ - -DQGIS_QUICK_DATA_PATH=${{ github.workspace }}/input/app/android/assets/qgis-data \ + -DQGIS_QUICK_DATA_PATH=${{ github.workspace }}/build-mm-db/app/android/assets/qgis-data \ -DCOVERAGE=TRUE \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DENABLE_TESTS=TRUE \ -GNinja \ - -S ../input + -S ../mm ninja @@ -158,29 +137,28 @@ jobs: TEST_API_USERNAME: test_mobileapp2 TEST_API_PASSWORD: ${{ secrets.TEST_API_PASSWORD }} run: | - cd build-Input-db/ + cd build-mm-db/ ctest --output-on-failure - # Package - - name: build Input (Release) + - name: build app (release) run: | - mkdir -p install-Input - mkdir -p build-Input-rel - cd build-Input-rel + mkdir -p install-mm + mkdir -p build-mm-rel + cd build-mm-rel cmake \ -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_PREFIX_PATH=${{ github.workspace }}/Qt/${QT_VERSION}/macos \ - -DCMAKE_INSTALL_PREFIX:PATH=../install-Input \ + -DVCPKG_TARGET_TRIPLET=${{ env.TRIPLET }} \ + -DCMAKE_TOOLCHAIN_FILE=${{ env.VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake \ + -DCMAKE_INSTALL_PREFIX:PATH=../install-mm \ -DUSE_SERVER_API_KEY=TRUE \ -DUSE_MM_SERVER_API_KEY=TRUE \ -DUSE_KEYCHAIN=No \ - -DINPUT_SDK_PATH=${{ github.workspace }}/input-sdk/x64-osx \ - -DQGIS_QUICK_DATA_PATH=${{ github.workspace }}/input/app/android/assets/qgis-data \ + -DQGIS_QUICK_DATA_PATH=${{ github.workspace }}/build-mm-rel/app/android/assets/qgis-data \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -GNinja \ - -S ../input - + -S ../mm + ninja ninja install @@ -190,15 +168,26 @@ jobs: with: format: 'YYYYMMDD' - - name: package Input.app + - name: Create dmg run: | - INPUT_TAR=input-${{ env.INPUT_SDK_VERSION }}-${{ steps.time.outputs.formattedTime }}-${{ github.run_number }}.tar.gz - echo "INPUT_TAR=${INPUT_TAR}" >> $GITHUB_ENV - cd ${{ github.workspace }}/install-Input - find . - tar -c -z -f ${{ github.workspace }}/${INPUT_TAR} "./Input.app" - - - name: Upload Sdk in Artifacts + if [[ "${{ github.event_name }}" == "release" && "${{ github.ref }}" == refs/tags/v* ]]; then + echo "${{ secrets.APPLE_DEVELOPER_ID_P12_BASE64 }}" | base64 --decode > cert.p12 + export P12_PATH=cert.p12 + export P12_PASSWORD=${{ secrets.APPLE_DEVELOPER_ID_P12_PASSWORD }} + export API_KEY_ID=${{ secrets.IOS_APPSTORE_KEY_ID }} + export API_KEY_ISSUER_ID=${{ secrets.IOS_APPSTORE_ISSUER_ID }} + echo "${{ secrets.IOS_APPSTORE_PRIVATE_KEY }}" > authkey.p8 + export API_KEY_PATH=authkey.p8 + fi + + export APP_PATH=${{ github.workspace }}/install-mm/MerginMaps.app + export DMG_PATH=merginmaps-${{ steps.time.outputs.formattedTime }}-${{ github.run_number }}.dmg + ./mm/scripts/create_dmg.sh + + - name: Upload dmg uses: actions/upload-artifact@v4 + id: artifact-macos with: - path: ${{ github.workspace }}/${{ env.INPUT_TAR }} + name: merginmaps_app.dmg + path: | + *.dmg diff --git a/.github/workflows/macos_arm64.yml b/.github/workflows/macos_arm64.yml deleted file mode 100644 index b5f2cad28..000000000 --- a/.github/workflows/macos_arm64.yml +++ /dev/null @@ -1,174 +0,0 @@ -name: macOS arm64 Build -on: - push: - paths: - - 'app/**' - - 'core/**' - - 'scripts/**' - - 'cmake/**' - - 'cmake_templates/**' - - 'test/**' - - 'CMakeLists.txt' - - '.github/workflows/macos_arm64.yml' - - release: - types: - - published - -env: - QT_VERSION: '6.8.3' # use scripts/update_qt_version.bash to change - INPUT_SDK_VERSION: arm64-osx-20250326-17 - CCACHE_DIR: /Users/runner/work/ccache - CACHE_VERSION: 0 - CMAKE_VERSION: '3.29.0' - XC_VERSION: ${{ '16.4' }} - -concurrency: - group: ci-${{github.ref}}-macos-arm64 - cancel-in-progress: true - -jobs: - macos_arm64_build: - if: ( github.repository == 'MerginMaps/mobile' ) && (!contains(github.event.head_commit.message, 'Translate ')) - runs-on: macos-15 - steps: - - name: Checkout Input - uses: actions/checkout@v4 - with: - path: input - - - name: Select latest Xcode - run: "sudo xcode-select -s /Applications/Xcode_$XC_VERSION.app" - - - name: install brew deps - run: | - brew install lcov - brew install ccache - brew install ninja - - - name: Install CMake and Ninja - uses: lukka/get-cmake@latest - with: - cmakeVersion: ${{ env.CMAKE_VERSION }} - - - name: Extract Mergin API_KEY - env: - MERGINSECRETS_DECRYPT_KEY: ${{ secrets.MERGINSECRETS_DECRYPT_KEY }} - run: | - cd input/core/ - /opt/homebrew/bin/openssl \ - aes-256-cbc -d \ - -in merginsecrets.cpp.enc \ - -out merginsecrets.cpp \ - -k "$MERGINSECRETS_DECRYPT_KEY" \ - -md md5 - - # CCache - - name: Prepare build cache for pull request - uses: pat-s/always-upload-cache@v3.0.11 - if: github.event_name == 'pull_request' - with: - path: ${{ env.CCACHE_DIR }} - key: build-mac-ccache-${{ github.actor }}-${{ github.head_ref }}-${{ github.sha }} - # The head_ref or source branch of the pull request in a workflow run. - # The base_ref or target branch of the pull request in a workflow run. - restore-keys: | - build-mac-ccache-${{ github.actor }}-${{ github.head_ref }}- - build-mac-ccache-refs/heads/${{ github.base_ref }}- - build-mac-ccache-refs/heads/master- - - - name: Prepare build cache for branch/tag - # use a fork of actions/cache@v2 to upload cache even when the build or test failed - uses: pat-s/always-upload-cache@v3.0.11 - if: github.event_name != 'pull_request' - with: - path: ${{ env.CCACHE_DIR }} - # The branch or tag ref that triggered the workflow run. For branches this in the format refs/heads/, and for tags it is refs/tags/ - key: build-mac-ccache-${{ github.ref }}-${{ github.sha }} - restore-keys: | - build-mac-ccache-${{ github.ref }}- - build-mac-ccache-refs/heads/master- - - - name: Install ccache - run: | - mkdir -p ${CCACHE_DIR} - ccache --set-config=max_size=2.0G - ccache -s - - # Qt - - name: Install Qt - uses: jurplel/install-qt-action@v3 - with: - version: ${{ env.QT_VERSION }} - target: desktop - dir: ${{ github.workspace }} - modules: 'qtsensors qtconnectivity qt5compat qtmultimedia qtpositioning qtshadertools qtnetworkauth' - cache: true - cache-key-prefix: ${{ runner.os }}-QtCache-v0-${{ env.QT_VERSION }}-mac-arm64 - - # Input SDK - - name: Cache Input-SDK - id: cache-input-sdk - uses: pat-s/always-upload-cache@v3.0.11 - with: - path: ${{ github.workspace }}/input-sdk - key: ${{ runner.os }}-input-sdk-v0-${{ env.INPUT_SDK_VERSION }}-${{ env.CACHE_VERSION }} - - - name: Install Input-SDK - if: steps.cache-input-sdk.outputs.cache-hit != 'true' - run: | - wget -O \ - ${{ github.workspace }}/input-sdk.tar.gz \ - https://github.com/MerginMaps/mobile-sdk/releases/download/${{ env.INPUT_SDK_VERSION }}/mergin-maps-input-sdk-qt-${{ env.QT_VERSION }}-${{ env.INPUT_SDK_VERSION }}.tar.gz - mkdir -p ${{ github.workspace }}/input-sdk/arm64-osx - cd ${{ github.workspace }}/input-sdk/arm64-osx - tar -xvzf ${{ github.workspace }}/input-sdk.tar.gz - - # Build Input App - - name: Calculate build number - run: | - BUILD_NUM=$GITHUB_RUN_NUMBER$GITHUB_RUN_ATTEMPT - echo "INPUT_VERSION_CODE=${BUILD_NUM}" >> $GITHUB_ENV - echo "Version code: ${BUILD_NUM}" - - # Package - - name: build Input (Release) - run: | - mkdir -p install-Input - mkdir -p build-Input-rel - cd build-Input-rel - - cmake \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_PREFIX_PATH=${{ github.workspace }}/Qt/${QT_VERSION}/macos \ - -DCMAKE_INSTALL_PREFIX:PATH=../install-Input \ - -DUSE_SERVER_API_KEY=TRUE \ - -DUSE_MM_SERVER_API_KEY=TRUE \ - -DUSE_KEYCHAIN=No \ - -DINPUT_SDK_PATH=${{ github.workspace }}/input-sdk/arm64-osx \ - -DQGIS_QUICK_DATA_PATH=${{ github.workspace }}/input/app/android/assets/qgis-data \ - -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ - -GNinja \ - -S ../input - - ninja - ninja install - - - name: Get TimeStamp - id: time - uses: josStorer/get-current-time@v2.0.2 - with: - format: 'YYYYMMDD' - - - name: package Input.app - run: | - INPUT_TAR=input-${{ env.INPUT_SDK_VERSION }}-${{ steps.time.outputs.formattedTime }}-${{ github.run_number }}.tar.gz - echo "INPUT_TAR=${INPUT_TAR}" >> $GITHUB_ENV - cd ${{ github.workspace }}/install-Input - find . - tar -c -z -f ${{ github.workspace }}/${INPUT_TAR} "./Input.app" - - - name: Upload Sdk in Artifacts - uses: actions/upload-artifact@v4 - with: - path: ${{ github.workspace }}/${{ env.INPUT_TAR }} diff --git a/.github/workflows/win.yml b/.github/workflows/win.yml index 3f63f7733..488580f6f 100644 --- a/.github/workflows/win.yml +++ b/.github/workflows/win.yml @@ -1,8 +1,11 @@ -name: Build win64 +name: win64 Build on: push: paths: + - 'vcpkg/**' + - 'vcpkg.json' + - 'VCPKG_BASELINE' - 'app/**' - 'core/**' - 'scripts/**' @@ -10,34 +13,36 @@ on: - 'cmake_templates/**' - 'CMakeLists.txt' - '.github/workflows/win.yml' - + release: types: - published - + concurrency: group: ci-${{github.ref}}-windows cancel-in-progress: true - + jobs: win64_build: if: ( github.repository == 'MerginMaps/mobile' ) && (!contains(github.event.head_commit.message, 'Translate ')) runs-on: windows-2022 - + env: - QT_VERSION: '6.8.3' # use scripts/update_qt_version.bash to change - INPUT_SDK_VERSION: x64-windows-20250327-248 - CCACHE_DIR: C:/ccache-cache # https://linux.die.net/man/1/ccache - CACHE_VERSION: 0 VS_VERSION: "2022" - CMAKE_VERSION: '3.29.0' - QT_ARCH: "win64_msvc2022_64" - + # we can't reference other variables within, so make sure the year in path is same as VS_VERSION + VCINSTALLDIR: "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/" + CMAKE_VERSION: '3.31.6' + VCPKG_BINARY_SOURCES: 'clear;nuget,GitHub,readwrite' + TRIPLET: x64-windows + CMAKE_GENERATOR: "Visual Studio 17 2022" # see https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md + CMAKE_ARCH: "x64" + VCPKG_ROOT: "C:/vcpkg-root" # Looks like there is more space on C: than on D: drive (~14GB) + steps: - - name: Checkout Input - uses: actions/checkout@v3 + - name: Checkout + uses: actions/checkout@v4 with: - path: input + path: mm - name: Prepare vars id: vars @@ -55,137 +60,109 @@ jobs: - name: Install ccache shell: cmd run: | - choco install ccache choco install nsis - where ccache - where openssl - where makensis - + - name: Extract Mergin API_KEY shell: cmd env: MERGINSECRETS_DECRYPT_KEY: ${{ secrets.MERGINSECRETS_DECRYPT_KEY }} run: | - cd input/core/ + cd mm/core/ openssl aes-256-cbc -d -in merginsecrets.cpp.enc -out merginsecrets.cpp -k "%MERGINSECRETS_DECRYPT_KEY%" -md md5 - - name: Prepare build cache for pull request - uses: pat-s/always-upload-cache@v3.0.11 - if: github.event_name == 'pull_request' - with: - path: ${{ env.CCACHE_DIR }} - key: build-win64-ccache-${{ github.actor }}-${{ github.head_ref }}-${{ github.sha }} - # The head_ref or source branch of the pull request in a workflow run. - # The base_ref or target branch of the pull request in a workflow run. - restore-keys: | - build-win64-ccache-${{ github.actor }}-${{ github.head_ref }}- - build-win64-ccache-refs/heads/${{ github.base_ref }}- - build-win64-ccache-refs/heads/master- - - - name: Prepare build cache for branch/tag - # use a fork of actions/cache@v2 to upload cache even when the build or test failed - uses: pat-s/always-upload-cache@v3.0.11 - if: github.event_name != 'pull_request' - with: - path: ${{ env.CCACHE_DIR }} - # The branch or tag ref that triggered the workflow run. For branches this in the format refs/heads/, and for tags it is refs/tags/ - key: build-win64-ccache-${{ github.ref }}-${{ github.sha }} - restore-keys: | - build-win64-ccache-${{ github.ref }}- - build-win64-ccache-refs/heads/master- - - - name: Install Qt - uses: jurplel/install-qt-action@v4 + - name: ccache + uses: hendrikmuhs/ccache-action@v1.2 with: - version: ${{ env.QT_VERSION }} - target: desktop - arch: ${{ env.QT_ARCH }} - dir: ${{ github.workspace }} - modules: 'qtsensors qtconnectivity qt5compat qtmultimedia qtpositioning qtshadertools qtnetworkauth' - cache: true - cache-key-prefix: ${{ runner.os }}-QtCache-v0-${{ env.QT_VERSION }}-win - - # Input SDK - - name: Cache Input-SDK - id: cache-input-sdk - uses: pat-s/always-upload-cache@v3.0.11 - with: - path: ${{ github.workspace }}/input-sdk - key: ${{ runner.os }}-input-sdk-v1-${{ env.INPUT_SDK_VERSION }}-${{ env.CACHE_VERSION }} + key: ccache-${{ env.TRIPLET }} + max-size: 200M - - name: Install Input-SDK + - name: Get vcpkg shell: bash - if: steps.cache-input-sdk.outputs.cache-hit != 'true' run: | - URL="https://github.com/MerginMaps/mobile-sdk/releases/download/${{ env.INPUT_SDK_VERSION }}/mergin-maps-input-sdk-qt-${{ env.QT_VERSION }}-${{ env.INPUT_SDK_VERSION }}.zip" - echo "downloading: $URL" - curl -fsSL --connect-timeout 60 -o \ - input-sdk.tar.gz \ - ${URL} - - mkdir -p input-sdk/x64-windows - cd input-sdk/x64-windows - unzip ${{ steps.vars.outputs.WORKSPACE_DIR }}/input-sdk.tar.gz -d . + mkdir -p "${{ env.VCPKG_ROOT }}" + cd "${{ env.VCPKG_ROOT }}" + git init + git remote add origin https://github.com/microsoft/vcpkg.git + git pull origin master + VCPKG_TAG=`cat ${{ steps.vars.outputs.WORKSPACE_DIR }}/mm/VCPKG_BASELINE` + echo "using VCPKG_TAG ${VCPKG_TAG}" + git checkout ${VCPKG_TAG} + + - name: Install vcpkg + shell: cmd + run: | + CALL "C:\vcpkg-root\bootstrap-vcpkg.bat" + + - name: Setup NuGet Credentials + shell: pwsh + run: | + .$(${{ env.VCPKG_ROOT }}/vcpkg fetch nuget) ` + sources add ` + -Source "https://nuget.pkg.github.com/merginmaps/index.json" ` + -StorePasswordInClearText ` + -Name GitHub ` + -UserName "mergin-maps-bot" ` + -Password "${{ secrets.MERGIN_MAPS_BOT_GITHUB_TOKEN }}" + .$(${{ env.VCPKG_ROOT }}/vcpkg fetch nuget) ` + setapikey "${{ secrets.MERGIN_MAPS_BOT_GITHUB_TOKEN }}" ` + -Source "https://nuget.pkg.github.com/merginmaps/index.json" - # Build Input App - name: Calculate build number shell: bash run: | BUILD_NUM=$GITHUB_RUN_NUMBER$GITHUB_RUN_ATTEMPT - echo "INPUT_VERSION_CODE=${BUILD_NUM}" >> $GITHUB_ENV + echo "MM_VERSION_CODE=${BUILD_NUM}" >> $GITHUB_ENV echo "Version code: ${BUILD_NUM}" - - name: Developer Command Prompt for Microsoft Visual C++ - uses: ilammy/msvc-dev-cmd@v1 - with: - vsversion: ${{ env.VS_VERSION }} - - - name: Configure Input + - name: Setup compiler shell: cmd run: | - mkdir install-Input -ea 0 - mkdir build-Input -ea 0 - cd build-Input - + CALL "C:\Program Files\Microsoft Visual Studio\${{ env.VS_VERSION }}\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=${{ env.CMAKE_ARCH }} + + - name: Configure app + shell: cmd + run: | + mkdir install-mm -ea 0 + mkdir build-mm -ea 0 + cd build-mm + + set PATH=${{ env.VCPKG_ROOT }};%PATH% + cmake ^ -DCMAKE_BUILD_TYPE=Release ^ - -DCMAKE_PREFIX_PATH:PATH=${{ env.Qt6_Dir }} ^ - -DCMAKE_INSTALL_PREFIX:PATH=${{ steps.vars.outputs.WORKSPACE_DIR }}/install-Input ^ - -DINPUT_SDK_PATH:PATH=${{ steps.vars.outputs.WORKSPACE_DIR }}/input-sdk/x64-windows ^ + -DCMAKE_INSTALL_PREFIX:PATH=${{ steps.vars.outputs.WORKSPACE_DIR }}/install-mm ^ + -DCMAKE_TOOLCHAIN_FILE:PATH="${{ env.VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake" ^ + -G "${{ env.CMAKE_GENERATOR }}" ^ + -A ${{ env.CMAKE_ARCH }} ^ + -DVCPKG_TARGET_TRIPLET=${{ env.TRIPLET }} ^ + -DVCPKG_INSTALL_OPTIONS="--x-buildtrees-root=C:/src" ^ -DUSE_MM_SERVER_API_KEY=TRUE ^ -DUSE_KEYCHAIN=No ^ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ^ - -G "NMake Makefiles" ^ - -S ${{ steps.vars.outputs.WORKSPACE_DIR }}/input ^ + -S ${{ steps.vars.outputs.WORKSPACE_DIR }}/mm ^ -B . - - name: Build Input + - name: Build app shell: cmd run: | - cd build-Input - nmake + cd build-mm + + set PATH=${{ env.VCPKG_ROOT }};%PATH% + + cmake --build ${{ github.workspace }}\build-mm --config Release --verbose - IF NOT EXIST Input.exe (echo err_INPUT_BUILD & exit /b 1) + IF NOT EXIST Release\MerginMaps.exe (echo err_MERGINMAPS_BUILD & exit /b 1) - - name: Install Input + - name: Install app shell: cmd run: | - cd build-Input - nmake install + cd build-mm + cmake --install ${{ github.workspace }}\build-mm --config Release --verbose - mkdir C:\input-package - mkdir C:\input-package\stage - robocopy ${{ steps.vars.outputs.WORKSPACE_DIR }}/install-Input C:\input-package\stage /E /NFL - dir C:\input-package\stage - - - name: Downloading redist - shell: bash - run: | - URL="https://aka.ms/vs/17/release/vc_redist.x64.exe" - echo "downloading: $URL" - curl -fsSL --connect-timeout 60 -o \ - /c/input-package/stage/vc_redist.x64.exe \ - ${URL} + mkdir C:\mm-package + mkdir C:\mm-package\stage + robocopy ${{ steps.vars.outputs.WORKSPACE_DIR }}/install-mm C:\mm-package\stage /E /NFL + dir C:\mm-package\stage - name: Get TimeStamp id: time @@ -193,11 +170,11 @@ jobs: with: format: 'YYYYMMDD' - - name: create package + - name: Create package shell: cmd run: | - makensis.exe input\scripts\input_win.nsi - xcopy C:\input-package\inputapp-win-x86_64.exe mergin-maps-mobile-win64-${{ steps.time.outputs.formattedTime }}-${{ github.run_number }}.exe* /Y + makensis.exe mm\scripts\MM_win.nsi + xcopy C:\mm-package\merginmaps-app-win-x86_64.exe mergin-maps-mobile-win64-${{ steps.time.outputs.formattedTime }}-${{ github.run_number }}.exe* /Y - name: Upload Sdk in Artifacts uses: actions/upload-artifact@v4 diff --git a/.gitignore b/.gitignore index fc8720a45..c4b695b88 100644 --- a/.gitignore +++ b/.gitignore @@ -11,15 +11,12 @@ core/merginsecrets.cpp test/temp_projects/ test/temp_extra_projects/ input.pro.user* -app/android/assets/qgis-data/proj_custom/ -app/android/assets/qgis-data/projects/ -app/android/assets/projects/ +app/android/assets app/android/AndroidManifest.xml +app/android/build.gradle +app/android/.gradle *.gpkg-wal *.gpkg-shm Input_keystore.keystore CMakeLists.txt.user -app/android/build.gradle -app/android/.gradle/* -app/android/.gradle .github/secrets/ios/LutraConsulting*.mobileprovision diff --git a/.zenodo.json b/.zenodo.json index c04734b10..22d39916a 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -2,7 +2,7 @@ "description": "

Mergin Maps mobile app is a QGIS powered app for Android and iOS devices.

", "license": "GPLv3", "title": "Mergin Maps mobile app", - "version": "2025.6.0", + "version": "2025.7.0", "upload_type": "software", "publication_date": "2022-02-24", "creators": [ @@ -39,7 +39,7 @@ "related_identifiers": [ { "scheme": "url", - "identifier": "https://github.com/MerginMaps/mobile/tree/2025.6.0", + "identifier": "https://github.com/MerginMaps/mobile/tree/2025.7.0", "relation": "isSupplementTo" }, { diff --git a/CITATION.cff b/CITATION.cff index f128a7c6d..9b3fedd36 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,4 +1,4 @@ -cff-version: 2025.6.0 +cff-version: 2025.7.0 message: "If you use this software, please cite it as below." authors: - family-names: "Martin" diff --git a/CMakeLists.txt b/CMakeLists.txt index 6145e35be..427d6abfb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,30 +4,43 @@ cmake_minimum_required(VERSION 3.22) # GLOBAL SETTINGS (call before "project()") # ######################################################################################## -# TODO automatically change with the scripts/update version script +# Note: To update version use script/update_all_versions.bash set(MM_VERSION_MAJOR "2025") -set(MM_VERSION_MINOR "6") +set(MM_VERSION_MINOR "7") set(MM_VERSION_PATCH "0") -set(QT_VERSION_DEFAULT "6.8.3") + +if (VCPKG_TARGET_TRIPLET MATCHES ".*ios.*") + set(IOS TRUE) +endif () # Note: we cannot set this for non-android build, since CMake will start looking for # Qt6AndroidMacros.cmake -if (DEFINED ENV{INPUT_SDK_ANDROID_BASE}) +if (ANDROID_ABI) # Workaround for bug https://bugreports.qt.io/browse/QTBUG-112885 in Qt6.5.0 - set(QT_NO_COLLECT_IMPORTED_TARGET_APK_DEPS TRUE) + # set(QT_NO_COLLECT_IMPORTED_TARGET_APK_DEPS TRUE) - set(ANDROIDAPI "28") - set(ANDROID_PLATFORM "android-${ANDROIDAPI}") - set(ANDROID_NDK_PLATFORM "android-${ANDROIDAPI}") - set(ANDROID_STL "c++_shared") + set(ANDROIDAPI "28") # when changed change VCPKG_CMAKE_SYSTEM_VERSION in triplets + # *-android.cmake - # Target/Minimum API levels for Android, used as Input target properties - set(INPUT_ANDROID_TARGET_SDK_VERSION "34") - set(INPUT_ANDROID_MIN_SDK_VERSION "${ANDROIDAPI}") - set(INPUT_ANDROID_NDK_PATH "$ENV{ANDROID_NDK_ROOT}") - if (NOT INPUT_ANDROID_NDK_PATH) - message(FATAL_ERROR "Set required environment variable ANDROID_NDK_ROOT.") + set(ANDROID_PLATFORM "android-${ANDROIDAPI}") # when changed change + # VCPKG_CMAKE_SYSTEM_VERSION in triplets + # *-android.cmake + set(ANDROID_NDK_PLATFORM "android-${ANDROIDAPI}") # when changed change + # VCPKG_CMAKE_SYSTEM_VERSION in + # triplets *-android.cmake + set(ANDROID_STL "c++_shared") + set(ANDROID_ARM_NEON ON) + + # Target/Minimum API levels for Android, used as MerginMaps target properties + set(MM_ANDROID_TARGET_SDK_VERSION "35") + set(MM_ANDROID_MIN_SDK_VERSION "${ANDROIDAPI}") + set(MM_ANDROID_NDK_PATH "$ENV{ANDROID_NDK_HOME}") + if (NOT MM_ANDROID_NDK_PATH) + message(FATAL_ERROR "Set required environment variable ANDROID_NDK_HOME.") endif () + set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE + "${MM_ANDROID_NDK_PATH}/build/cmake/android.toolchain.cmake" + ) endif () if (IOS) @@ -36,31 +49,26 @@ if (IOS) set(PLATFORM "OS") set(ENABLE_ARC FALSE) set(ENABLE_BITCODE FALSE) - set(DEPLOYMENT_TARGET "16.0") + set(CMAKE_OSX_DEPLOYMENT_TARGET "16.0") # when changed change triplets arm64-ios.cmake endif () -if (APPLE - AND NOT IOS - AND NOT DEFINED ENV{INPUT_SDK_ANDROID_BASE} -) - set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15.0") +if (APPLE AND NOT IOS) + set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0") # when changed change also triplets *-osx.cmake endif () # ######################################################################################## # PROJECT SETUP # ######################################################################################## set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) -set(INPUT_CMAKE_TEMPLATES_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake_templates) -set(INPUT_SCRIPTS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/scripts) include(VersionDetect) include(PlatformDetect) mm_detect_platform() project( - Input + MerginMaps VERSION ${MM_VERSION_MAJOR}.${MM_VERSION_MINOR}.${MM_VERSION_PATCH} - DESCRIPTION "The easiest way to take your QGIS projects into the field" + DESCRIPTION "Collect. Share. Publish." HOMEPAGE_URL "https://merginmaps.com" LANGUAGES CXX ) @@ -81,30 +89,15 @@ else () set(HAVE_BLUETOOTH_DEFAULT TRUE) endif () -# on android in multi-ABI build, command line variables are NOT passed to -# ExternalProject_Add called by QT. Therefore we need to pass the variables through ENV -if (ANDROID) - if (NOT DEFINED ENV{INPUT_SDK_ANDROID_BASE}) - message( - FATAL_ERROR - "On Android, you need to define INPUT_SDK_ANDROID_BASE as environment variable. Clean build directory and run cmake again!" - ) - else () - set(INPUT_SDK_PATH_DEFAULT $ENV{INPUT_SDK_ANDROID_BASE}) - endif () -else () - set(INPUT_SDK_PATH_DEFAULT "") -endif () - -if (DEFINED ENV{INPUT_VERSION_CODE}) - set(INPUT_VERSION_CODE_DEFAULT "$ENV{INPUT_VERSION_CODE}") +if (DEFINED ENV{MM_VERSION_CODE}) + set(MM_VERSION_CODE_DEFAULT "$ENV{MM_VERSION_CODE}") else () if (ANDROID) - set(INPUT_VERSION_CODE_DEFAULT "0000000") + set(MM_VERSION_CODE_DEFAULT "0000000") elseif (IOS) - set(INPUT_VERSION_CODE_DEFAULT "00.00.000000") + set(MM_VERSION_CODE_DEFAULT "00.00.000000") else () - set(INPUT_VERSION_CODE_DEFAULT "000000") + set(MM_VERSION_CODE_DEFAULT "000000") endif () endif () @@ -128,12 +121,7 @@ set(IOS_USE_PRODUCTION_SIGNING BOOL "Whether to sign the ios build with production certificate. Used in CI, leave false when building locally to automatically manage signing" ) -set(INPUT_SDK_PATH - ${INPUT_SDK_PATH_DEFAULT} - CACHE - PATH - "Path to the Mergin Maps Mobile-SDK on host machine; on android define ENV variable instead and without the ABI suffix (armeabi-v7a, arm64-v8a)" -) + set(ENABLE_TESTS ${ENABLE_TESTS_DEFAULT} CACHE BOOL "Whether to build tests" @@ -150,13 +138,8 @@ set(USE_KEYCHAIN "Whether to use keychains/wallets to store credentials. If false, we use QSettings" ) -set(QT6_VERSION - ${QT_VERSION_DEFAULT} - CACHE STRING "QT6 version to use" -) - -set(INPUT_VERSION_CODE - "${INPUT_VERSION_CODE_DEFAULT}" +set(MM_VERSION_CODE + "${MM_VERSION_CODE_DEFAULT}" CACHE STRING "Build version (for stores)" ) @@ -167,29 +150,8 @@ message(STATUS "Mergin Maps Mobile ${version_desc} - ${platform_desc}") # FIND PACKAGES # ######################################################################################## -if (ANDROID) - set(INPUT_SDK_PATH_ANDROID_ABI_armeabi-v7a ${INPUT_SDK_PATH}/arm-android) - - if (NOT EXISTS ${INPUT_SDK_PATH_ANDROID_ABI_armeabi-v7a}) - message(WARNING "INPUT_SDK_PATH arm-android directory does not exist!") - endif () - - set(INPUT_SDK_PATH_ANDROID_ABI_arm64-v8a ${INPUT_SDK_PATH}/arm64-android) - if (NOT EXISTS ${INPUT_SDK_PATH_ANDROID_ABI_arm64-v8a}) - message(WARNING "INPUT_SDK_PATH arm64-android directory does not exist!") - endif () - - set(INPUT_SDK_PATH_MULTI ${INPUT_SDK_PATH_ANDROID_ABI_${ANDROID_ABI}}) - # allow libraries outside of SDK/NDK directory - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) - set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH) -else () - set(INPUT_SDK_PATH_MULTI ${INPUT_SDK_PATH}) -endif () - find_package( - Qt6 ${QT6_VERSION} + Qt6 COMPONENTS Quick Qml Xml @@ -203,61 +165,76 @@ find_package( Sql Core Core5Compat - REQUIRED -) -find_package( - Qt6 ${QT6_VERSION} - COMPONENTS Multimedia Widgets + Multimedia + Widgets REQUIRED ) +# Qt by default assumes that cmake files live in `lib/cmake`. Point to `share` instead. +# See +# https://github.com/qt/qtbase/blob/39290c508e2c7fa816c6f79b3eb284adc0cad3c0/src/corelib/Qt6AndroidMacros.cmake#L1016C16-L1026 +if (ANDROID) + get_filename_component( + QT_ANDROID_PATH_CMAKE_DIR_${ANDROID_ABI} "${Qt6_DIR}/.." ABSOLUTE + ) + message( + STATUS + "QT_ANDROID_PATH_CMAKE_DIR_${ANDROID_ABI}: ${QT_ANDROID_PATH_CMAKE_DIR_${ANDROID_ABI}}" + ) +endif () + if (NOT IOS) # https://doc.qt.io/qt-6/qtprintsupport-index.html Qt Print Support is not available on - # iOS. + # iOS find_package( - Qt6 ${QT6_VERSION} + Qt6 COMPONENTS PrintSupport REQUIRED ) endif () if (NOT LNX) - find_package(Charset REQUIRED) + # find_package(Charset CONFIG REQUIRED) find_package(Iconv REQUIRED) endif () find_package(ZLIB REQUIRED) -find_package(Bz2 REQUIRED) -find_package(Curl REQUIRED) -find_package(Inih REQUIRED) -find_package(Exiv2 REQUIRED) -find_package(Expat REQUIRED) -find_package(Freexl REQUIRED) -find_package(Gdal REQUIRED) -find_package(Geodiff REQUIRED) -find_package(Geos REQUIRED) -find_package(Jpeg REQUIRED) -find_package(Pq REQUIRED) -find_package(Proj REQUIRED) +# find_package(Bz2 CONFIG REQUIRED) find_package(bzip2 CONFIG REQUIRED) +find_package(CURL CONFIG REQUIRED) +# find_package(Inih CONFIG REQUIRED) +find_package(exiv2 CONFIG REQUIRED) +find_package(expat CONFIG REQUIRED) +# find_package(freexl CONFIG REQUIRED) +find_package(GDAL CONFIG REQUIRED) +find_package(Geodiff CONFIG REQUIRED) +find_package(GEOS CONFIG REQUIRED) +# find_package(Jpeg CONFIG REQUIRED) +find_package(PostgreSQL REQUIRED) +find_package(PROJ CONFIG REQUIRED) find_package(Protobuf REQUIRED) find_package(QGIS REQUIRED) -find_package(Qca REQUIRED) -find_package(Qtkeychain REQUIRED) +find_package(Qca CONFIG REQUIRED) +find_package(Qt6Keychain CONFIG REQUIRED) find_package(Spatialindex REQUIRED) find_package(Spatialite REQUIRED) -find_package(Sqlite3 REQUIRED) -find_package(Tiff REQUIRED) -find_package(WebP REQUIRED) -find_package(Xml2 REQUIRED) -find_package(ZXing REQUIRED) -find_package(Zip REQUIRED) -find_package(OpenSSL REQUIRED) -find_package(Geotiff REQUIRED) -find_package(Lzma REQUIRED) -find_package(Zstd REQUIRED) -find_package(MiniZip REQUIRED) -find_package(Utf8 REQUIRED) -find_package(Absl REQUIRED QUIET) +find_package(unofficial-sqlite3 CONFIG REQUIRED) +# find_package(Tiff CONFIG REQUIRED) +find_package(WebP CONFIG REQUIRED) +# find_package(Xml2 CONFIG REQUIRED) +find_package(ZXing CONFIG REQUIRED) +find_package(libzip CONFIG REQUIRED) +find_package(OpenSSL CONFIG REQUIRED) +find_package(GeoTIFF CONFIG REQUIRED) +# find_package(Lzma CONFIG REQUIRED) find_package(Zstd CONFIG REQUIRED) +find_package(unofficial-minizip CONFIG REQUIRED) +# find_package(Utf8 CONFIG REQUIRED) find_package(Absl CONFIG REQUIRED) +find_package(poly2tri CONFIG) +find_package(meshoptimizer CONFIG REQUIRED) + +if (WIN) + find_package(FFmpeg REQUIRED) + find_package(WinLibraries REQUIRED) +endif () if (IOS OR MACOS) find_package(AppleFrameworks REQUIRED) @@ -266,7 +243,7 @@ endif () if (HAVE_BLUETOOTH) find_package( - Qt6 ${QT6_VERSION} + Qt6 COMPONENTS Bluetooth REQUIRED ) @@ -274,7 +251,7 @@ endif () if (ENABLE_TESTS) find_package( - Qt6 ${QT6_VERSION} + Qt6 COMPONENTS Test REQUIRED ) @@ -323,22 +300,24 @@ if (IOS) add_compile_definitions(QT_NO_PRINTER) endif () -# This is for QGIS defined, do not move to inputconfig.h +# This is for QGIS defined, do not move to mmconfig.h add_compile_definitions(HAVE_WIDGETS) # QGIS defines # add_compile_definitions("$<$:QGIS_PREFIX_PATH=${QGIS_PREFIX_PATH}>") add_compile_definitions("$<$:QGIS_QUICK_EXPAND_TEST_DATA>") -# Generate inputconfig.h if (ENABLE_TESTS) - set(INPUT_TEST TRUE) + set(MM_TEST TRUE) file(COPY test/test_data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/test/) set(TEST_DATA_DIR "${CMAKE_CURRENT_BINARY_DIR}/test/test_data") endif () +set(MM_FORMATS_PATH "${CMAKE_CURRENT_SOURCE_DIR}/docs/supported_formats.txt") + +# Generate mmconfig.h configure_file( - ${CMAKE_SOURCE_DIR}/cmake_templates/inputconfig.h.in ${CMAKE_BINARY_DIR}/inputconfig.h + ${CMAKE_SOURCE_DIR}/cmake_templates/mmconfig.h.in ${CMAKE_BINARY_DIR}/mmconfig.h ) include_directories(${CMAKE_BINARY_DIR}) @@ -375,6 +354,54 @@ if (IOS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-shorten-64-to-32") endif () +if (ANDROID) + if (VCPKG_TARGET_TRIPLET STREQUAL "arm-android") + set(CMAKE_C_FLAGS + "${CMAKE_C_FLAGS} -fPIC -fstack-protector-strong -lunwind -Wl,--exclude-libs=libunwind.a" + ) + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -fPIC -fstack-protector-strong -lunwind -Wl,--exclude-libs=libunwind.a" + ) + else () + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -fstack-protector-strong") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -fstack-protector-strong") + endif () + + link_libraries("-ljnigraphics") + + # Make sure the generator for android_deployment_settings.json can figure out the + # architecture + list(APPEND CMAKE_FIND_ROOT_PATH /) + + # set(ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_BINARY_DIR}/android-template) +endif () + +# ######################################################################################## +# RESOURCES +# ######################################################################################## +message(STATUS "Copying proj and qgis resources to android/assets/qgis-data") + +# On android we need to copy the resources into the source tree and then Qt will copy it +# to the android build directory with QT_ANDROID_PACKAGE_SOURCE_DIR +if (ANDROID) + set(ASSETS_DIR_PATH ${CMAKE_CURRENT_SOURCE_DIR}) +else () + set(ASSETS_DIR_PATH ${CMAKE_BINARY_DIR}) +endif () + +file(MAKE_DIRECTORY ${ASSETS_DIR_PATH}/app/android/assets/qgis-data/resources) +file(COPY ${QGIS_RESOURCE_DIR}/qgis.db + DESTINATION ${ASSETS_DIR_PATH}/app/android/assets/qgis-data/resources/ +) +file(COPY ${QGIS_RESOURCE_DIR}/srs.db + DESTINATION ${ASSETS_DIR_PATH}/app/android/assets/qgis-data/resources/ +) +file( + COPY ${PROJ_DIR} + DESTINATION ${ASSETS_DIR_PATH}/app/android/assets/qgis-data/ + PATTERN "*.cmake" EXCLUDE + PATTERN "vcpkg*" EXCLUDE +) # ######################################################################################## # SUBDIRECTORIES # ######################################################################################## @@ -393,7 +420,7 @@ if (WIN OR LNX OR MACOS ) - # qt_add_executable on Android automatically creates target for apk/aab on IOS we use - # xcodebuild to build ipa + # qt_add_executable - on Android automatically creates target for apk/aab - on IOS we + # use xcodebuild to build ipa include(InstallStep) endif () diff --git a/INSTALL.md b/INSTALL.md index 617067b15..eda6b3fa9 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -6,7 +6,6 @@ - [2. Overview](#2-overview) - [2.1 Secrets](#21-secrets) - [2.2 Code formatting](#22-code-formatting) - - [2.3 Required Qt packages](#23-required-qt-packages) - [3. Building GNU/Linux](#3-building-gnulinux) - [4. Building Android (on Linux/macOS/Windows)](#4-building-android-on-linuxmacoswindows) - [4.1. Android on Ubuntu](#41-android-on-ubuntu) @@ -42,18 +41,15 @@ place for describing build procedures. Please do not remove this notice. # 2. Overview -Mobile app, like a number of major projects (e.g., KDE 4.0), +Mobile app, like a number of major projects (e.g., KDE), uses [CMake](https://www.cmake.org) for building from source. It is C++ application build on top of [Qt](https://www.qt.io), [QGIS](https://www.qgis.org/en/site/) and many other FOSS libraries. -All required libraries (in release configuration) are packaged in the [Mobile-SDK](https://github.com/MerginMaps/mobile-sdk). -If you need to debug some error in the library, you need to compile Mobile-SDK in debug yourself locally. Otherwise, -it is suggested to download required libraries from [Mobile-SDK tags](https://github.com/MerginMaps/mobile-sdk/tags). -Mobile-SDK uses vcpkg packaging system, so if the SDK for your target system/architecture you can build it yourself. +All required libraries are build with [vcpkg](https://vcpkg.io/en/) C/C++ package manager as part of the CMake's configure step. -Generally, for building setup, you need the same versions of libraries/SDKs/NDKs/compilers as used in the official +Generally, for building setup, we recommend to use the same versions of libraries/SDKs/NDKs/compilers as used in the official [GitHub Actions](https://github.com/MerginMaps/mobile/tree/master/.github/workflows). Open workflow file for your platform/target and see the version of libraries used and replicate it in your setup. @@ -66,7 +62,7 @@ As a developer, if you want to develop against local Mergin Maps server, it is O work with public or dev server, you need to manually decrypt the file. Decrypted file is never pushed to git! -The password for decryption is in our password manager. +The password for decryption is in Lutra's password manager. if you want to change the secrets, decrypt, change and encrypt the file with [openssl](http://stackoverflow.com/questions/16056135/ddg#16056298), also @@ -88,77 +84,108 @@ openssl aes-256-cbc -d -in merginsecrets.cpp.enc -out merginsecrets.cpp -md md5 ## 2.2 Code formatting We use `astyle` to format CPP and Objective-C files. Format is similar to what QGIS has. -For more details about code conventions, please read [our code conventions doc](./docs/code_convention.md). +We use `cmake-format` to format CMake files. -We also use software [pre-commit](https://pre-commit.com/) to automatically check format when doing a commit. -You need to install it via `brew`/`pip`, see [installation details](https://pre-commit.com/#installation). +All the scripts are located in `scripts/format_*` and you can check +[GitHub Actions](https://github.com/MerginMaps/mobile/tree/master/.github/workflows/code_style.yml) to see +their usage -In order to start using the `pre-commit`, run `pre-commit install` in the repository root folder. +For more details about code conventions, please read our [code conventions doc](./docs/code_convention.md). -To manually run the style check, run `pre-commit run --all-files` or optionally run script `format_cpp.sh` (we use this one in CI currently). +## 2.3 Qt packages -In case you want to skip execution of pre-commit hooks, add additional flag `--no-verify` to your commit command, e.g.: `git commit -m "nit" --no-verify` +Mergin Maps Mobile app is built with Qt. Qt is build with vcpkg as part of the configure step, but it is recommended +to install QtCreator and Qt on your host to be able to release translations. -## 2.3 Required Qt packages +## 2.4 Vcpkg -Mergin Maps Mobile app is built with Qt. If you are using Qt's `Maintenance tool`, make sure to install these packages: - - `Android` -> when building for Android - - `iOS` -> when building for iOS - - `macOS` -> or other desktop platform based on your host machine - - `Qt 5 Compatibility Module` - - `Qt Shader Tools` - - `Additional libraries:` - - `Qt Connectivity` -> used for Bluetooth - - `Qt Network Auth` - - `Qt Multimedia` - - `Qt Positioning` - - `Qt Sensors` +Dependencies are build with vcpkg. To fix the version of libraries, you need to download vcpkg and checkout to git commit specified +in the file `VCPKG_BASELINE` in the repository. + ``` + mkdir -p vcpkg + cd vcpkg + git init + git remote add origin https://github.com/microsoft/vcpkg.git + git pull origin master + VCPKG_TAG=`cat VCPKG_BASELINE` + git checkout ${VCPKG_TAG} + cd "${{ env.VCPKG_ROOT }}" + chmod +x ./bootstrap-vcpkg.sh + ./bootstrap-vcpkg.sh + ``` + +## 2.4 ccache + +Install and configure ccache for development. It speeds up the development significantly. + # 3. Building GNU/Linux -This guide is tested with Ubuntu 22.04, on other distros some steps may need some adjustments. +## 3.1 Ubuntu 22.04 Steps to build and run mobile app: 1. Install some dependencies, critically bison and flex. See "Install Build Dependencies" step in `.github/workflows/linux.yml` -2. Get Mobile-SDK - it contains pre-built dependencies of libraries used by mobile app - - - Check what SDK version is currently in use - look for `INPUT_SDK_VERSION` in `.github/workflows/linux.yml` - - Download Mobile-SDK for Linux - go to https://github.com/merginmaps/mobile-sdk/releases and download the built SDK. - - Unpack the downloaded .tar.gz to `~/mobile-sdk/x64-linux` - -3. Get Qt libraries - currently Mobile-SDK does not include Qt SDK. - - - Ubuntu's system libraries are too old, and we recommend to use Qt's online installer - - Check what Qt version is currently in use - look for `QT_VERSION` in `.github/workflows/linux.yml` - - Download Qt online installer from https://www.qt.io/download-open-source - - Use the online installer to install Qt to `~/Qt` - - Fedora and any more recent distribution can probably use the system packages - - Check what Qt version is currently in use - look for `QT_VERSION` in `.github/workflows/linux.yml` - - If the system package version is same or higher use it - -4. Build mobile app (update CMake command with the correct Qt version) - - If you are using system packages drop `-DCMAKE_PREFIX_PATH=~/Qt//gcc_64` from the command + ``` + sudo apt-get install -y \ + gperf autopoint '^libxcb.*-dev' libx11-xcb-dev libegl1-mesa libegl1-mesa-dev \ + libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev \ + autoconf-archive libgstreamer-gl1.0-0 libgstreamer-plugins-base1.0-0 libfuse2 \ + bison flex lcov nasm libxrandr-dev xvfb + ``` + + Also install CMake 3.x, Ninja and ccache +2. Install vcpkg and checkout to correct version from file `VCPKG_BASELINE` + Read [vcpkg](#vcpkg) section. + + +3. Configure mobile app + We assume the structure on the system: ``` - mkdir build + mm1/ + build/ + vcpkg/ + mobile/ + ``` + + This is command line to setup build system. As part of the cmake configure step it will compile all the deps (Qt, GDAL, QGIS), so it + can take considerable time (e.g. an hour). Subsequent runs will be faster as the libraries without change will be taken from local + binary vcpkg cache. + + Alternatively you can open QtCreator and add cmake defines to the QtCreator Project setup table and configure from QtCreator (recommended for + development and debugging) + + To use USE_MM_SERVER_API_KEY read [Secrets](#Secrets) section. + + ``` + mkdir -p build cd build - cmake -G Ninja \ - -DCMAKE_PREFIX_PATH=~/Qt//gcc_64 \ - -DINPUT_SDK_PATH=~/mobile-sdk/x64-linux \ - -DQGIS_QUICK_DATA_PATH=../app/android/assets/qgis-data \ - -DUSE_MM_SERVER_API_KEY=FALSE \ - .. + cmake \ + -DCMAKE_BUILD_TYPE=Debug \ + -DVCPKG_TARGET_TRIPLET=x64-linux \ + -DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake \ + -DQGIS_QUICK_DATA_PATH=/build/app/android/assets/qgis-data \ + -DUSE_MM_SERVER_API_KEY=FALSE \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DENABLE_TESTS=TRUE \ + -GNinja \ + -S ../mobile + ``` +4. Build application + + ``` ninja ``` - + 5. Run mobile app ``` ./app/Input ``` - + + For testing read [Auto Testing](#AutoTesting) section. # 4. Building Android (on Linux/macOS/Windows) @@ -174,114 +201,182 @@ For building ABIs see https://www.qt.io/blog/android-multi-abi-builds-are-back - See current versions of build tools (`SDK_BUILD_TOOLS`), ndk (`NDK_VERSION`) and platform (`SDK_PLATFORM`) in `.github/workflows/android.yml` - `./cmdline-tools/bin/sdkmanager --sdk_root=./ "build-tools;" "ndk;" "platforms;" platform-tools tools` - flex and bison + - set up your own developer keystore. Creating the key(store) can be done either with Android studio or on command line + with `keytool -genkeypair`. -2. Get Mobile-SDK - it contains pre-built dependencies of libraries used by mobile app +2. Build mobile app (update CMake command with the correct Qt and Android NDK versions) - - Check what SDK version is currently in use - look for `INPUT_SDK_VERSION` in `.github/workflows/android.yml` - - Download **TWO** Mobile-SDKs for android - go to https://github.com/merginmaps/mobile-sdk/releases and download the built SDK. - - Unpack the downloaded .tar.gz to `~/mobile-sdk/arm-android` and `~/mobile-sdk/arm64-android` - - WARNING!! It is super important to have both SDKs in same subfolder (e.g. `~/mobile-sdk`) and have folder name `arm64-android` and `arm-android` + We recommended to have **RelWithDebInfo** builds, which requires signing the APK with your key. -3. Get Qt libraries - currently Mobile-SDK does not include Qt SDK. - - - Ubuntu's system libraries are too old, and usually system packages don't contain android Qt packages - - Either use online installer: - - You need both linux and android Qt installed! - - Check what Qt version is currently in use - look for `QT_VERSION` in `.github/workflows/android.yml` - - Download Qt online installer from https://www.qt.io/download-open-source - - Use the online installer to install Qt to `~/Qt` - - Or cross-compile Qt for android - -4. Build mobile app (update CMake command with the correct Qt and Android NDK versions) -``` - mkdir build - cd build + We assume the structure on the system: - export ANDROID_SDK_ROOT=~/android; - export ANDROID_NDK_ROOT=~/android/ndk/; - export QT_BASE=~/Qt/; - export INPUT_SDK_ANDROID_BASE=~/mobile-sdk; + ``` + mm1/ + build/ + vcpkg/ + mobile/ + ``` + + This is command line to setup build system. As part of the cmake configure step it will compile all the deps (Qt, GDAL, QGIS), so it + can take considerable time (e.g. an hour). Subsequent runs will be faster as the libraries without change will be taken from local + binary vcpkg cache. + + ``` + export ANDROID_NDK_HOME=/home//android/ndk/ + export ANDROID_SDK_ROOT=/home//android + export QT_ANDROID_KEYSTORE_ALIAS= + export QT_ANDROID_KEYSTORE_KEY_PASS= + export QT_ANDROID_KEYSTORE_STORE_PASS= + export QT_ANDROID_KEYSTORE_PATH= + + cmake \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DANDROID_ABI=arm64-v8a \ + -DQT_ANDROID_ABIS=arm64-v8a \ + -DVCPKG_HOST_TRIPLET=x64-linux \ + -DVCPKG_TARGET_TRIPLET=arm64-android \ + -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake \ + -DVCPKG_INSTALL_OPTIONS="--allow-unsupported" \ + -DUSE_MM_SERVER_API_KEY=TRUE \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DANDROID_SDK_ROOT=/home//android \ + -DQT_ANDROID_SIGN_APK=Yes + -GNinja \ + -S ../mobile \ + -B ./ + ``` + + Alternatively you can open QtCreator and add cmake defines to the QtCreator Project setup table and configure from QtCreator (recommended for + development and debugging) + + + Add this to build env. + + ``` + PATH=+/Users//Projects/quick/build/vcpkg + ANDROID_NDK_HOME=/Users//android/ndk/ + ANDROID_SDK_ROOT=/Users//android + QT_ANDROID_KEYSTORE_ALIAS= + QT_ANDROID_KEYSTORE_KEY_PASS= + QT_ANDROID_KEYSTORE_STORE_PASS= + QT_ANDROID_KEYSTORE_PATH= + ``` + And this to cmake options + + ``` + ANDROID_ABI=arm64-v8a + QT_ANDROID_ABIS=arm64-v8a + VCPKG_HOST_TRIPLET=x64-linux + VCPKG_TARGET_TRIPLET=arm64-android + CMAKE_TOOLCHAIN_FILE="../vcpkg/scripts/buildsystems/vcpkg.cmake" + VCPKG_INSTALL_OPTIONS="--allow-unsupported" + CMAKE_CXX_COMPILER_LAUNCHER=ccache + ANDROID_SDK_ROOT=/Users//android + QT_ANDROID_SIGN_APK=Yes + ``` - cmake \ - -DCMAKE_BUILD_TYPE=Debug \ - -DQT_ANDROID_ABIS="arm64-v8a" \ - -DQT_HOST_PATH=$QT_BASE/gcc_64 \ - -DCMAKE_TOOLCHAIN_FILE=$QT_BASE/android_arm64_v8a/lib/cmake/Qt6/qt.toolchain.cmake \ - -DUSE_MM_SERVER_API_KEY=FALSE \ - -GNinja \ - ../input/ - ninja apk -``` + To use USE_MM_SERVER_API_KEY read [Secrets](#Secrets) section. -## 4.2. Android on macOS -1. Get Qt libraries - - - You need both macOS and android Qt installed! - - Check what Qt version is currently in use - look for `QT_VERSION` in `.github/workflows/android.yml` - - Download Qt online installer from https://www.qt.io/download-open-source - - Use the online installer to install Qt to `~/Qt` - - Needed packages can be found in the [section 2.3](#23-required-qt-packages) - -2. Install Java +## 4.2. Android on macOS +1. Install Java - `brew install openjdk@17`, then make this java version default ``export JAVA_HOME=`usr/libexec/java_home -v 17` ``. Check if it's default by executing `java --version` -3. Setup Android SDK & NDK [Automatic, via QtCreator] +2. Setup Android SDK & NDK - This step can now be performed via QtCreator, if it for some reason fails/does not work, skip this step and continue with manual setup - Open QtCreator and navigate to `settings -> devices -> Android`, here: - - JDK location: Add Path to Java version, e.g. `/opt/homebrew/Cellar/openjdk@17/17.0.11/libexec/openjdk.jdk/Contents/Home` + - JDK location: Add Path to Java version, e.g. `/opt/homebrew/Cellar/openjdk@17/17.0.11/libexec/openjdk.jdk/Contents/Home` (or /opt/homebrew/Cellar/openjdk@17/17.0.15/libexec/openjdk.jdk/Contents/Home/) - Android SDK location: set path to some empty writeable directory, e.g. `~/android` - Hit `Set up SDK` and install the current SDK version (find the correct version in `.github/workflows/android.yml`) - Let QtCreator install NDK - Let QtCreator install openssl - QtCreator should now say `Android settings are OK.` -4. Setup Android SDK & NDK [Manual, via sdkmanager] - - Proceed with this step only if the previous automatic step did not work for you or you do not want to use QtCreator + - If the previous automatic step did not work for you or you do not want to use QtCreator + - Get Android `sdkmanager` by following these steps https://developer.android.com/tools/sdkmanager + - See current versions of build tools (`SDK_BUILD_TOOLS`), ndk (`NDK_VERSION`) and platform (`SDK_PLATFORM`) in `.github/workflows/android.yml` + - Now perform `./cmdline-tools/bin/sdkmanager --sdk_root=./ "build-tools;" "ndk;" "platforms;" platform-tools tools` to install all needed Android tools, make sure to double-check if the version numbers are correct - - Get Android `sdkmanager` by following these steps https://developer.android.com/tools/sdkmanager - - See current versions of build tools (`SDK_BUILD_TOOLS`), ndk (`NDK_VERSION`) and platform (`SDK_PLATFORM`) in `.github/workflows/android.yml` - - Now perform `./cmdline-tools/bin/sdkmanager --sdk_root=./ "build-tools;" "ndk;" "platforms;" platform-tools tools` to install all needed Android tools, make sure to double-check if the version numbers are correct - -5. Get Mobile-SDK - it contains pre-built dependencies of used libraries (QGIS, etc..) - - - Check what SDK version is currently in use - look for `INPUT_SDK_VERSION` in `.github/workflows/android.yml` - - Download **TWO** SDKs for android (arm and arm64) - go to https://github.com/merginmaps/mobile-sdk/releases and download the built SDK. - - Unpack the downloaded .tar.gz to `~/mobile-sdk/arm-android` and `~/mobile-sdk/arm64-android` - - WARNING!! It is super important to have both SDKs in same subfolder (e.g. `~/mobile-sdk`) and have folder name `arm64-android` and `arm-android` +3. Configure + + We recommended to have **RelWithDebInfo** builds -6. Build (update CMake command with the correct Qt and SDK versions) + We assume the structure on the system: + + ``` + mm1/ + build/ + vcpkg/ + mobile/ + ``` + + This is command line to setup build system. As part of the cmake configure step it will compile all the deps (Qt, GDAL, QGIS), so it + can take considerable time (e.g. an hour). Subsequent runs will be faster as the libraries without change will be taken from local + binary vcpkg cache. + + ``` + export ANDROID_NDK_HOME=/Users//android/ndk/ + export ANDROID_SDK_ROOT=/Users//android + export QT_ANDROID_KEYSTORE_ALIAS= + export QT_ANDROID_KEYSTORE_KEY_PASS= + export QT_ANDROID_KEYSTORE_STORE_PASS= + export QT_ANDROID_KEYSTORE_PATH= + + cmake \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DANDROID_ABI=arm64-v8a \ + -DQT_ANDROID_ABIS=arm64-v8a \ + -DVCPKG_HOST_TRIPLET=arm64-osx \ + -DVCPKG_TARGET_TRIPLET=arm64-android \ + -DCMAKE_TOOLCHAIN_FILE="../vcpkg/scripts/buildsystems/vcpkg.cmake" \ + -DVCPKG_INSTALL_OPTIONS="--allow-unsupported" \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DANDROID_SDK_ROOT=/Users//android \ + -DQT_ANDROID_SIGN_APK=Yes \ + -GNinja \ + -S ../mobile \ + -B ./ + ``` + + Alternatively you can open QtCreator and add cmake defines to the QtCreator Project setup table and configure from QtCreator (recommended for + development and debugging) + -``` - # Needed Android variables - export ANDROID_SDK_ROOT=~/android; - export ANDROID_NDK_ROOT=~/android/ndk/; - - # INPUT_SDK_ANDROID_BASE is a path where you stored the two SDKs from the mobile-sdk repo - export INPUT_SDK_ANDROID_BASE=~/mobile-sdk; - - # (optional, not needed often) add Java to PATH if you need to use other Java version than your default one - export PATH=/opt/homebrew/Cellar/openjdk@17/17.0.11/libexec/openjdk.jdk/Contents/Home/bin:$PATH; - - cmake \ - -DCMAKE_BUILD_TYPE=Debug \ - -DQT_ANDROID_ABIS=arm64-v8a \ - -DQT_HOST_PATH=/opt/Qt//macos \ - -DCMAKE_TOOLCHAIN_FILE=/opt/Qt//android_arm64_v8a/lib/cmake/Qt6/qt.toolchain.cmake \ - -DUSE_MM_SERVER_API_KEY=FALSE \ - -GNinja \ - ../input/ - - # If you need to build both ABIS, use -DQT_ANDROID_ABIS="arm64-v8a;armeabi-v7a" -``` + Add this to build env. + ``` + PATH=+/opt/homebrew/bin + PATH=+/opt/homebrew/Cellar/flex/2.6.4_2/bin + PATH=+/opt/homebrew/Cellar/bison/3.8.2/bin + PATH=+/Users//Projects/quick/build/vcpkg + ANDROID_NDK_HOME=/Users//android/ndk/ + ANDROID_SDK_ROOT=/Users//android + QT_ANDROID_KEYSTORE_ALIAS= + QT_ANDROID_KEYSTORE_KEY_PASS= + QT_ANDROID_KEYSTORE_STORE_PASS= + QT_ANDROID_KEYSTORE_PATH= + ``` + And this to cmake options + ``` + ANDROID_ABI=arm64-v8a + QT_ANDROID_ABIS=arm64-v8a + VCPKG_HOST_TRIPLET=arm64-osx + VCPKG_TARGET_TRIPLET=arm64-android + CMAKE_TOOLCHAIN_FILE="../vcpkg/scripts/buildsystems/vcpkg.cmake" + VCPKG_INSTALL_OPTIONS="--allow-unsupported" + CMAKE_CXX_COMPILER_LAUNCHER=ccache + ANDROID_SDK_ROOT=/Users//android + QT_ANDROID_SIGN_APK=Yes + ``` + + + To use USE_MM_SERVER_API_KEY read [Secrets](#Secrets) section. + ## 4.3. Android on Windows -**Note to document writers:**: This section needs a proper rewrite - Even technically it should be possible, we haven't tried this setup yet. If you managed to compile mobile app for Android on Windows, please help us to update this section. @@ -292,135 +387,204 @@ mobile app for Android on Windows, please help us to update this section. 1. Setup development environment - XCode - - build tools, see requirements in `.github/workflows/ios.yml` + - install deps, see requirements in `.github/workflows/ios.yml`. Most specifically cmake 3.x, ninja, bison and flex (on PATH) - if you want to build for production, you need development certificates. These are not needed for local development, signing is handled automatically (see IOS_USE_PRODUCTION_SIGNING cmake variable for more info). You can get the certificates by following: - Get device UDID: either iTunes or about this mac->system report->USB->find iPAD (Serial Number) - Create dev iOS certificate for development - Create provisioning profile for mobile app + your certificate + your device (for this ask Lutra Apple development team) - - ios-toolchain - - download ios.toolchain.cmake from https://github.com/leetal/ios-cmake to `~/mobile-sdk/ios.toolchain.cmake` - - version from `.github/workflows/ios.yml` - -2. Get Mobile-SDK - it contains pre-built dependencies of libraries used by mobile app - - Check what SDK version is currently in use - look for `INPUT_SDK_VERSION` in `.github/workflows/ios.yml` - - Download Mobile-SDKs for ios - go to https://github.com/merginmaps/mobile-sdk/releases and download the built SDK. - - Unpack the downloaded .tar.gz to `~/mobile-sdk/arm64-ios` - -3. Get Qt libraries +2. Install vcpkg and checkout to correct version from file `VCPKG_BASELINE` + Read [vcpkg](#vcpkg) section. - - You need both macOS and ios Qt installed! - - Check what Qt version is currently in use - look for `QT_VERSION` in `.github/workflows/ios.yml` - - Download Qt online installer from https://www.qt.io/download-open-source - - Use the online installer to install Qt to `/opt/Qt` +3. Configure mobile app + We assume the structure on the system: + + ``` + mm1/ + build/ + vcpkg/ + mobile/ + ``` + + This is command line to setup build system. As part of the cmake configure step it will compile all the deps (Qt, GDAL, QGIS), so it can take considerable time (e.g. an hour). Subsequent runs will be faster as the libraries without change will be taken from local binary vcpkg cache. + + Alternatively you can open QtCreator and add cmake defines to the QtCreator Project setup table and configure from QtCreator (recommended for development and debugging) + + To use USE_MM_SERVER_API_KEY read [Secrets](#Secrets) section. + + Note: make sure you adjust VCPKG_HOST_TRIPLET and CMAKE_SYSTEM_PROCESSOR if you use x64-osx host machine. + + ``` + cd build + + export PATH=$(brew --prefix flex)/bin:$(brew --prefix bison)/bin:$(brew --prefix gettext)/bin:$PATH;\ + export PATH=${PWD}/../vcpkg:$PATH;\ + PATH=/Applications/CMake.app/Contents/bin/:$PATH + + cmake \ + -DVCPKG_HOST_TRIPLET=arm64-osx \ + -DCMAKE_SYSTEM_PROCESSOR=aarch64 \ + -DVCPKG_TARGET_TRIPLET=arm64-ios \ + -DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake \ + -D ENABLE_BITCODE=OFF \ + -D ENABLE_ARC=ON \ + -D CMAKE_CXX_VISIBILITY_PRESET=hidden \ + -D CMAKE_SYSTEM_NAME=iOS \ + -DIOS=TRUE \ + -DUSE_MM_SERVER_API_KEY=FALSE \ + -G "Xcode" \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -S ../mobile \ + -B ./ + ``` -4. Build mobile app (update CMake command with the correct Qt and Mobile-SDK versions) +4. Build mobile app Now you can create a build (either on command line or by setting these variables in Qt Creator) ``` - mkdir build - mkdir install cd build - cmake \ - -DIOS=TRUE \ - -DCMAKE_PREFIX_PATH=/opt/Qt//ios \ - -DQT_HOST_PATH=/opt/Qt//macos \ - -DCMAKE_TOOLCHAIN_FILE:PATH="~/mobile-sdk/ios.toolchain.cmake" \ - -DCMAKE_INSTALL_PREFIX:PATH="../install" \ - -DUSE_SERVER_API_KEY=FALSE \ - -DINPUT_SDK_PATH=~/mobile-sdk/arm64-ios \ - -G "Xcode" \ - ../input + xcodebuild \ + -project Input.xcodeproj/ \ + -scheme Input \ + -sdk iphoneos \ + -configuration Release \ + archive -archivePath Input.xcarchive ``` # 6. Building macOS 1. Install some dependencies, critically XCode, bison and flex. See "Install Build Dependencies" step in `.github/workflows/macos.yml` - -2. Get Mobile-SDK - it contains pre-built dependencies of used libraries - - - Check what SDK version is currently in use - look for `INPUT_SDK_VERSION` in `.github/workflows/macos.yml` - - Download Mobile-SDK for `osx` - go to https://github.com/merginmaps/mobile-sdk/releases and download the built SDK. - - Unpack the downloaded .tar.gz to `~/mobile-sdk/x64-osx` or `~/mobile-sdk/arm64-osx` - -3. Get Qt libraries - Mobile-SDK does not include Qt SDK - - - Check what Qt version is currently in use - look for `QT_VERSION` in `.github/workflows/macos.yml` - - Download Qt online installer from https://www.qt.io/download-open-source - - Use the online installer to install Qt to `/opt/Qt` - -4. Build (update CMake command with the correct Qt and paths) - - ``` - mkdir build-desktop - cd build-desktop +``` + brew install cmake automake bison flex gnu-sed autoconf-archive libtool ninja pkg-config +``` + install cmake 3.x + + Note: + - cmake 4.0.1 is broken (empty -isysroot) + - TODO test with cmake 4.0.3 which is today's + +2. Install vcpkg and checkout to correct version from file `VCPKG_BASELINE` + Read [vcpkg](#vcpkg) section. + +3. Configure mobile app + We assume the structure on the system: + + ``` + mm1/ + build/ + vcpkg/ + mobile/ + ``` + + This is command line to setup build system. As part of the cmake configure step it will compile all the deps (Qt, GDAL, QGIS), so it can take considerable time (e.g. an hour). Subsequent runs will be faster as the libraries without change will be taken from local binary vcpkg cache. + + Alternatively you can open QtCreator and add cmake defines to the QtCreator Project setup table and configure from QtCreator (recommended for development and debugging) + + To use USE_MM_SERVER_API_KEY read [Secrets](#Secrets) section. - cmake \ + Note: for x64-osx (intel laptops) build use VCPKG_TARGET_TRIPLET instead of arm64-osx (Mx laptops) + + ``` + cd build + + export PATH=$(brew --prefix flex)/bin:$(brew --prefix bison)/bin:$(brew --prefix gettext)/bin:$PATH;\ + export PATH=${PWD}/../vcpkg:$PATH;\ + PATH=/Applications/CMake.app/Contents/bin/:$PATH + + cmake \ -DCMAKE_BUILD_TYPE=Debug \ - -DCMAKE_PREFIX_PATH=/opt/Qt//macos \ - -DINPUT_SDK_PATH= \ - -DQGIS_QUICK_DATA_PATH=/app/android/assets/qgis-data \ + -DVCPKG_TARGET_TRIPLET=arm64-osx \ + -DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake \ + -DUSE_MM_SERVER_API_KEY=FALSE \ + -DQGIS_QUICK_DATA_PATH=app/android/assets/qgis-data \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DENABLE_TESTS=TRUE \ -GNinja \ - .. - - ninja - ``` + -DCMAKE_MAKE_PROGRAM=ninja \ + -S ../mobile + ``` + +4. Build application + + ``` + ninja + ``` 5. Run the mobile app - ``` - ./app/Input.app/Contents/MacOS/Input - ``` + ``` + ./app/Input.app/Contents/MacOS/Input + ``` # 7. Building Windows -For version of the tools used, see `.github/workflows/win.yml` +1. Install some dependencies. See `.github/workflows/win.yml` + Critically Visual Studio, cmake, bison and flex. Setup build VS environment (adjust to your version) + ``` + "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=x64 + ``` -- download Mobile-SDK for win, extract to C:\projects\mobile-sdk\win-sdk -- download and install Qt -- download and install QtCreator for debugging executable -- download and install Visual Studio, SDK, Python, Cmake -- (optional) install ccache and add to PATH -- open cmd -- setup build environment -``` -set ROOT_DIR=C:\Users\\Projects -set Qt6_DIR=C:\Qt\\msvc2019_64 -set PATH=%QT_ROOT%\bin;C:\Program Files\CMake\bin\;%PATH% -"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\VsDevCmd.bat" -arch=x64 -``` +2. Install vcpkg and checkout to correct version from file `VCPKG_BASELINE` + Read [vcpkg](#vcpkg) section. -- configure -``` -cd %ROOT_DIR%\build\input - -cmake ^ - -DCMAKE_BUILD_TYPE=Release ^ - -DCMAKE_PREFIX_PATH:PATH=%Qt6_Dir%^ - -DCMAKE_INSTALL_PREFIX:PATH=%ROOT_DIR%\install\input ^ - -DINPUT_SDK_PATH:PATH=%ROOT_DIR%\mobile-sdk\x64-windows ^ - -G "NMake Makefiles" ^ - -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ^ - -S %ROOT_DIR%\input ^ - -B . -``` +3. Configure mobile app + We assume the structure on the system: + + ``` + mm1/ + build/ + vcpkg/ + mobile/ + ``` + + This is command line to setup build system. As part of the cmake configure step it will compile all the deps (Qt, GDAL, QGIS), so it + can take considerable time (e.g. an hour). Subsequent runs will be faster as the libraries without change will be taken from local + binary vcpkg cache. + + Alternatively you can open QtCreator and add cmake defines to the QtCreator Project setup table and configure from QtCreator (recommended for + development and debugging) + + To use USE_MM_SERVER_API_KEY read [Secrets](#Secrets) section. + + ``` + mkdir build + cd build -- build -``` -set CL=/MP -nmake -``` + cmake ^ + -DCMAKE_BUILD_TYPE=Debug ^ + -DCMAKE_TOOLCHAIN_FILE:PATH="../vcpkg/scripts/buildsystems/vcpkg.cmake" ^ + -G "Visual Studio 17 2022" ^ + -A x64 ^ + -DVCPKG_TARGET_TRIPLET=x64-windows ^ + -DUSE_MM_SERVER_API_KEY=FALSE ^ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ^ + -S ../mobile ^ + -B . + ``` + +4. Build application + + ``` + cd build + cmake --build . --config Release --verbose + ``` + +5. Run the mobile app + ``` + ./app/input.exe + ``` # 8. Common problems - If you have "error: undefined reference to 'stdout'" or so, make sure that in BUILD ENV you have ANDROID_NDK_PLATFORM=android-24 or later! - ![image](https://user-images.githubusercontent.com/22449698/166630970-a776576f-c505-4265-b4c8-ffbe212c6745.png) - If for all projects the OSM layer fails to load the `QGIS_QUICK_DATA_PATH` is probably wrong - Check where the projects are getting created - - Either change the path to point to `app/android/assets/qgis-data` of the project directory or copy the `proj` directory - from project directory to the same directory in the build directory + - And change the path to point to `app/android/assets/qgis-data` of the build directory +- If images in feature forms are not getting loaded it's again probably problem with `QGIS_QUICK_DATA_PATH` + - Use absolute path instead of relative path + - Make sure it's targeting **build** directory # 9. Auto Testing @@ -438,4 +602,4 @@ TEST_API_PASSWORD= ``` Build binary, and you can run tests either with `ctest` or you can run individual tests by adding `--test` -e.g. ` ./input --testMerginApi` +e.g. ` ./input --testMerginApi` \ No newline at end of file diff --git a/README.md b/README.md index edaed7372..628702ef4 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,6 @@ Platform builds: [![iOS Build](https://github.com/MerginMaps/mobile/workflows/iOS%20Build/badge.svg)](https://github.com/MerginMaps/mobile/actions?query=workflow%3A%22iOS+Build%22) [![win64 Build](https://github.com/MerginMaps/mobile/actions/workflows/win.yml/badge.svg)](https://github.com/MerginMaps/mobile/actions/workflows/win.yml) [![macOS Build](https://github.com/MerginMaps/mobile/actions/workflows/macos.yml/badge.svg)](https://github.com/MerginMaps/mobile/actions/workflows/macos.yml) -[![macOS (arm64) Build](https://github.com/MerginMaps/mobile/actions/workflows/macos_arm64.yml/badge.svg)](https://github.com/MerginMaps/mobile/actions/workflows/macos_arm64.yml) [![linux Build](https://github.com/MerginMaps/mobile/actions/workflows/linux.yml/badge.svg)](https://github.com/MerginMaps/mobile/actions/workflows/linux.yml) Other Checks: diff --git a/VCPKG_BASELINE b/VCPKG_BASELINE new file mode 100644 index 000000000..6e42e8238 --- /dev/null +++ b/VCPKG_BASELINE @@ -0,0 +1 @@ +d6995a0cf3cafda5e9e52749fad075dd62bfd90c \ No newline at end of file diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 4d63c7b2d..e057f2baf 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -300,15 +300,16 @@ qt_add_resources( # ######################################################################################## qt_add_executable( - Input + MerginMaps ${MM_SRCS} ${MM_HDRS} - $ main.cpp ) +set_target_properties(MerginMaps PROPERTIES WIN32_EXECUTABLE TRUE) + target_include_directories( - Input + MerginMaps PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/ ${CMAKE_CURRENT_SOURCE_DIR}/attributes ${CMAKE_CURRENT_SOURCE_DIR}/map @@ -324,7 +325,7 @@ if (ANDROID) file(REMOVE ${CMAKE_CURRENT_SOURCE_DIR}/android/AndroidManifest.xml) endif () configure_file( - ${INPUT_CMAKE_TEMPLATES_PATH}/AndroidManifest.xml.in + ${CMAKE_SOURCE_DIR}/cmake_templates/AndroidManifest.xml.in ${CMAKE_CURRENT_SOURCE_DIR}/android/AndroidManifest.xml @ONLY ) @@ -332,28 +333,29 @@ if (ANDROID) file(REMOVE ${CMAKE_CURRENT_SOURCE_DIR}/android/build.gradle) endif () configure_file( - ${INPUT_CMAKE_TEMPLATES_PATH}/build.gradle.in + ${CMAKE_SOURCE_DIR}/cmake_templates/build.gradle.in ${CMAKE_CURRENT_SOURCE_DIR}/android/build.gradle @ONLY ) set_target_properties( - Input + MerginMaps PROPERTIES QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android - QT_ANDROID_TARGET_SDK_VERSION ${INPUT_ANDROID_TARGET_SDK_VERSION} - QT_ANDROID_MIN_SDK_VERSION ${INPUT_ANDROID_MIN_SDK_VERSION} - QT_ANDROID_VERSION_CODE ${INPUT_VERSION_CODE} - QT_ANDROID_VERSION_NAME ${INPUT_VERSION} + QT_ANDROID_TARGET_SDK_VERSION ${MM_ANDROID_TARGET_SDK_VERSION} + QT_ANDROID_MIN_SDK_VERSION ${MM_ANDROID_MIN_SDK_VERSION} + QT_ANDROID_VERSION_CODE ${MM_VERSION_CODE} + QT_ANDROID_VERSION_NAME ${MM_VERSION} ) endif () if (MACOS) set_target_properties( - Input + MerginMaps PROPERTIES MACOSX_BUNDLE TRUE MACOSX_RPATH TRUE MACOSX_BUNDLE_GUI_IDENTIFIER LutraConsultingLtd.Input - MACOSX_BUNDLE_INFO_PLIST ${INPUT_CMAKE_TEMPLATES_PATH}/macOsInfo.plist.in - MACOSX_BUNDLE_SHORT_VERSION_STRING ${INPUT_VERSION_CODE} + MACOSX_BUNDLE_INFO_PLIST + ${CMAKE_SOURCE_DIR}/cmake_templates/macOsInfo.plist.in + MACOSX_BUNDLE_SHORT_VERSION_STRING ${MM_VERSION_CODE} XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@loader_path/Libraries" XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME TRUE ) @@ -361,40 +363,40 @@ endif () if (IOS) # qgis resources - set(IOS_CRS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android/assets/qgis-data/resources) - target_sources(Input PRIVATE ${IOS_CRS_DIR}) + set(IOS_CRS_DIR ${CMAKE_CURRENT_BINARY_DIR}/android/assets/qgis-data/resources) + target_sources(MerginMaps PRIVATE ${IOS_CRS_DIR}) set_source_files_properties( ${IOS_CRS_DIR} PROPERTIES MACOSX_PACKAGE_LOCATION Resources/qgis-data ) # proj - set(IOS_PROJ_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android/assets/qgis-data/proj) - target_sources(Input PRIVATE ${IOS_PROJ_DIR}) + set(IOS_PROJ_DIR ${CMAKE_CURRENT_BINARY_DIR}/android/assets/qgis-data/proj) + target_sources(MerginMaps PRIVATE ${IOS_PROJ_DIR}) set_source_files_properties( ${IOS_PROJ_DIR} PROPERTIES MACOSX_PACKAGE_LOCATION Resources/qgis-data ) # app icon set(IOS_ASSET_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ios/Images.xcassets) - target_sources(Input PRIVATE ${IOS_ASSET_DIR}) + target_sources(MerginMaps PRIVATE ${IOS_ASSET_DIR}) set_source_files_properties( ${IOS_ASSET_DIR} PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) # launch screen set_target_properties( - Input + MerginMaps PROPERTIES QT_IOS_LAUNCH_SCREEN ${CMAKE_CURRENT_SOURCE_DIR}/ios/launchscreen/MMLaunchScreen.storyboard ) # entitlements file - set(ENTITLEMENTS_FILE ${INPUT_CMAKE_TEMPLATES_PATH}/mm.entitlements) + set(ENTITLEMENTS_FILE ${CMAKE_SOURCE_DIR}/cmake_templates/mm.entitlements) configure_file( ${ENTITLEMENTS_FILE} ${CMAKE_CURRENT_BINARY_DIR}/mm.entitlements COPYONLY ) set(ENTITLEMENTS_FILE_IN_BUILD ${CMAKE_CURRENT_BINARY_DIR}/mm.entitlements) - target_sources(Input PRIVATE ${ENTITLEMENTS_FILE}) + target_sources(MerginMaps PRIVATE ${ENTITLEMENTS_FILE}) set_source_files_properties( ${ENTITLEMENTS_FILE} PROPERTIES XCODE_LAST_KNOWN_FILE_TYPE "text.plist.entitlements" ) @@ -402,12 +404,13 @@ if (IOS) message(STATUS "iOS signing entitlements file: ${ENTITLEMENTS_FILE_IN_BUILD}") set_target_properties( - Input + MerginMaps PROPERTIES MACOSX_BUNDLE TRUE - MACOSX_BUNDLE_INFO_PLIST ${INPUT_CMAKE_TEMPLATES_PATH}/iOSInfo.plist.in + MACOSX_BUNDLE_INFO_PLIST + ${CMAKE_SOURCE_DIR}/cmake_templates/iOSInfo.plist.in MACOSX_BUNDLE_GUI_IDENTIFIER "LutraConsultingLtd.Input" - MACOSX_BUNDLE_SHORT_VERSION_STRING ${INPUT_VERSION} - MACOSX_BUNDLE_BUNDLE_VERSION ${INPUT_VERSION_CODE} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${MM_VERSION} + MACOSX_BUNDLE_BUNDLE_VERSION ${MM_VERSION_CODE} XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "79QMH2QRAH" XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon" XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${ENTITLEMENTS_FILE_IN_BUILD}" @@ -417,7 +420,7 @@ if (IOS) # use production signing profile set_target_properties( - Input + MerginMaps PROPERTIES XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "LutraConsultingLtd.Input.AppStore" XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY @@ -429,7 +432,9 @@ if (IOS) else () # use development profiles - automatically manage signing - set_target_properties(Input PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_STYLE "Automatic") + set_target_properties( + MerginMaps PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_STYLE "Automatic" + ) message(STATUS "Using automatic code sign") endif () endif () @@ -438,14 +443,16 @@ endif () # LINKING Mergin Maps Target # ######################################################################################## +target_link_libraries(MerginMaps PUBLIC mm_core) + # at least on Linux qgis_core needs to be linked before Qt libs, otherwise one gets "DSO # missing from command line" linker error about missing symbol from qt6::core5compat # library - probably if our code does not use anything from that library, it is not added # (linking order matters) -target_link_libraries(Input PUBLIC QGIS::Core) +target_link_libraries(MerginMaps PUBLIC QGIS::Core) target_link_libraries( - Input + MerginMaps PUBLIC Qt6::Quick Qt6::Qml Qt6::Xml @@ -462,28 +469,28 @@ target_link_libraries( ) if (HAVE_BLUETOOTH) - target_link_libraries(Input PUBLIC Qt6::Bluetooth) + target_link_libraries(MerginMaps PUBLIC Qt6::Bluetooth) endif () -target_link_libraries(Input PUBLIC Qt6::Multimedia Qt6::Widgets) +target_link_libraries(MerginMaps PUBLIC Qt6::Multimedia Qt6::Widgets) if (NOT IOS) - target_link_libraries(Input PUBLIC Qt6::PrintSupport) + target_link_libraries(MerginMaps PUBLIC Qt6::PrintSupport) endif () if (ANDROID) - target_link_libraries(Input PUBLIC Qt6::CorePrivate) + target_link_libraries(MerginMaps PUBLIC Qt6::CorePrivate) endif () target_link_libraries( - Input - PUBLIC mm_core - Geodiff::Geodiff - Proj::Proj + MerginMaps + PUBLIC Geodiff::Geodiff + PROJ::proj + ZXing::Core ZXing::ZXing ) target_link_libraries( - Input + MerginMaps PUBLIC QGIS::authmethod_basic QGIS::authmethod_esritoken QGIS::authmethod_identcert @@ -504,83 +511,84 @@ target_link_libraries( if (LNX) # needs to be added again because of the cycling dependencies between qgis_core and # providers and auth methods - target_link_libraries(Input PUBLIC QGIS::Core) + target_link_libraries(MerginMaps PUBLIC QGIS::Core) endif () target_link_libraries( - Input - PUBLIC Qtkeychain::Qtkeychain - Qca::Qca - Gdal::Gdal - Pq::Pq - Pq::Pgcommon - Pq::Pgport + MerginMaps + PUBLIC Qt6Keychain::Qt6Keychain + qca + GDAL::GDAL + PostgreSQL::PostgreSQL Spatialite::Spatialite ) -if (NOT LNX) - target_link_libraries(Input PUBLIC Charset::Charset Iconv::Iconv) -endif () +# if (NOT LNX) target_link_libraries(Input PUBLIC Charset::Charset Iconv::Iconv) endif () -target_link_libraries(Input PUBLIC Xml2::Xml2) +# target_link_libraries(Input PUBLIC Xml2::Xml2) target_link_libraries( - Input + MerginMaps PUBLIC Spatialindex::Spatialindex - Geos::Geos-c - Geos::Geos - Protobuf::Protobuf-lite - Utf8::utf8_range - Utf8::utf8_validity - Expat::Expat - Freexl::Freexl - Exiv2::Exiv2 - Inih::Inireader - Inih::Inih - Tiff::Tiff - Sqlite3::Sqlite3 - MiniZip::MiniZip + GEOS::geos_c + # Geos::Geos + protobuf::libprotobuf-lite + # Utf8::utf8_range Utf8::utf8_validity Expat::Expat Freexl::Freexl + Exiv2::exiv2lib + # Inih::Inireader Inih::Inih Tiff::Tiff + unofficial::sqlite3::sqlite3 + unofficial::minizip::minizip ZLIB::ZLIB - Zip::Zip - WebP::WebP - WebP::Sharpyuv - Curl::Curl - Jpeg::Jpeg - Geotiff::Geotiff - Lzma::Lzma - Zstd::Zstd - Bz2::Bz2 - Absl::Absl + libzip::zip + # WebP::WebP WebP::Sharpyuv Curl::Curl Jpeg::Jpeg Geotiff::Geotiff Lzma::Lzma + # Zstd::Zstd Bz2::Bz2 Absl::Absl + poly2tri::poly2tri + meshoptimizer::meshoptimizer ) if (IOS OR MACOS) - target_link_libraries(Input PUBLIC Tasn1::Tasn1) + target_link_libraries(MerginMaps PUBLIC Tasn1::Tasn1) endif () -target_link_libraries(Input PUBLIC OpenSSL::OpenSSL OpenSSL::Crypto) +# target_link_libraries(Input PUBLIC OpenSSL::OpenSSL OpenSSL::Crypto) if (ANDROID) set_property( - TARGET Input PROPERTY QT_ANDROID_EXTRA_LIBS ${KDAB_OpenSSL_CRYPTO_LIBRARY} - ${KDAB_OpenSSL_LIBRARY} + TARGET MerginMaps PROPERTY QT_ANDROID_EXTRA_LIBS ${KDAB_OpenSSL_CRYPTO_LIBRARY} + ${KDAB_OpenSSL_LIBRARY} ) endif () if (MACOS OR IOS) target_link_libraries( - Input PUBLIC AppleFrameworks::Security AppleFrameworks::CoreFoundation - AppleFrameworks::SystemConfiguration + MerginMaps PUBLIC AppleFrameworks::Security AppleFrameworks::CoreFoundation + AppleFrameworks::SystemConfiguration ) endif () if (IOS) target_link_libraries( - Input PUBLIC AppleFrameworks::CoreLocation AppleFrameworks::CoreHaptics + MerginMaps PUBLIC AppleFrameworks::CoreLocation AppleFrameworks::CoreHaptics ) - qt_add_ios_ffmpeg_libraries(Input) # Qt Multimedia + # TODO is this needed? qt_add_ios_ffmpeg_libraries(Input) # Qt Multimedia +endif () + +if (WIN) + target_link_libraries( + MerginMaps + PUBLIC WinLibraries::avcodec + WinLibraries::avdevice + WinLibraries::avformat + WinLibraries::avutil + WinLibraries::swresample + WinLibraries::swscale + WinLibraries::openh264 + ) + + target_link_libraries(MerginMaps PUBLIC expat::expat) endif () if (ENABLE_TESTS) - target_link_libraries(Input PUBLIC Qt6::Test) + target_link_libraries(MerginMaps PUBLIC Qt6::Test) endif () # ######################################################################################## @@ -588,7 +596,7 @@ endif () # ######################################################################################## target_compile_definitions( - Input PRIVATE $<$,$>:QT_QML_DEBUG> + MerginMaps PRIVATE $<$,$>:QT_QML_DEBUG> ) add_subdirectory(qml) @@ -604,7 +612,7 @@ endforeach () # For some reason, this call cannot be in qml/CMakeLists.txt qt_add_qml_module( - Input + MerginMaps URI MMInput VERSION 1.0 QML_FILES ${MM_QML_SRCS} diff --git a/app/activelayer.h b/app/activelayer.h index 40047932b..9c7cbf658 100644 --- a/app/activelayer.h +++ b/app/activelayer.h @@ -13,7 +13,6 @@ #include -#include "inputconfig.h" #include "qgsmaplayer.h" #include "qgsvectorlayer.h" diff --git a/app/activeproject.h b/app/activeproject.h index e4c3cc843..ead92dd23 100644 --- a/app/activeproject.h +++ b/app/activeproject.h @@ -15,7 +15,6 @@ #include "qgsproject.h" -#include "inputconfig.h" #include "appsettings.h" #include "activelayer.h" #include "recordinglayersproxymodel.h" diff --git a/app/android/assets/qgis-data/.directory b/app/android/assets/qgis-data/.directory deleted file mode 100644 index 2bb42ec61..000000000 --- a/app/android/assets/qgis-data/.directory +++ /dev/null @@ -1,4 +0,0 @@ -[Dolphin] -PreviewsShown=true -Timestamp=2017,11,22,13,1,25 -Version=3 diff --git a/app/android/assets/qgis-data/keepme b/app/android/assets/qgis-data/keepme deleted file mode 100644 index 40cf708a8..000000000 --- a/app/android/assets/qgis-data/keepme +++ /dev/null @@ -1,3 +0,0 @@ -Do not delete this file - it is here to have at least one file in the folder -in order to work around a Qt6 bug related to support of Android assets: -https://bugreports.qt.io/browse/QTBUG-107627 diff --git a/app/android/assets/qgis-data/proj/CH b/app/android/assets/qgis-data/proj/CH deleted file mode 100644 index 725328f40..000000000 --- a/app/android/assets/qgis-data/proj/CH +++ /dev/null @@ -1,22 +0,0 @@ -# This init file provides definitions for CH1903 and CH1903/LV03 -# projections using the distortion grids developed by Swisstopo. -# See: https://shop.swisstopo.admin.ch/en/products/geo_software/GIS_info -# -# You'll need to download the grids separately and put in a directory -# scanned by libproj. -# -# Note that an independent effort was made to derive an usable grid -# from the CH1903->CH1903+ grid initially available from the Swisstopo -# website. You can read about this other effort here: -# http://lists.maptools.org/pipermail/proj/2012-February/006093.html -# It may be of interest because the latter was by some reported as being -# more accurate than the former: -# http://lists.maptools.org/pipermail/proj/2012-February/006119.html -# -# This init file uses the official one -# - +origin=Swisstopo +lastupdate=2012-02-27 -# CH1903/LV03 -<1903_LV03> +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=600000 +y_0=200000 +ellps=bessel +units=m +nadgrids=CHENyx06_ETRS.gsb +no_defs -# CH1903 -<1903> +proj=longlat +ellps=bessel +nadgrids=CHENyx06_ETRS.gsb +no_defs <> diff --git a/app/android/assets/qgis-data/proj/GL27 b/app/android/assets/qgis-data/proj/GL27 deleted file mode 100644 index 73fa9754a..000000000 --- a/app/android/assets/qgis-data/proj/GL27 +++ /dev/null @@ -1,23 +0,0 @@ -# SCCSID @(#)GL27 1.1 93/08/25 GIE REL -# Great Lakes Grids - +lastupdate=1993-08-25 - # Lake Erie, Ontario and St. Lawrence River. - proj=omerc ellps=clrk66 k_0=0.9999 - lonc=78d00'W lat_0=44d00'N alpha=55d40' - x_0=-3950000 y_0=-3430000 - no_defs <> - # Lake Huron - proj=omerc ellps=clrk66 k_0=0.9999 - lonc=82d00'W lat_0=43d00'N alpha=350d37' - x_0=1200000 y_0=-3500000 - no_defs <> - # Lake Michigan - proj=omerc ellps=clrk66 k_0=0.9999 - lonc=87d00'W lat_0=44d00'N alpha=15d00' - x_0=-1000000 y_0=-4300000 - no_defs <> - # Lake Superior, Lake of the Woods - proj=omerc ellps=clrk66 k_0=0.9999 - lonc=88d50'0.256"W lat_0=47d12'21.554"N alpha=285d41'42.593" - x_0=9000000 y_0=-1600000 - no_defs <> diff --git a/app/android/assets/qgis-data/proj/ITRF2000 b/app/android/assets/qgis-data/proj/ITRF2000 deleted file mode 100644 index 439d19702..000000000 --- a/app/android/assets/qgis-data/proj/ITRF2000 +++ /dev/null @@ -1,24 +0,0 @@ -# ITRF2000 params are in cm/year, PJ_helmert uses m/year - +version=1.0.0 +origin=ftp://itrf.ensg.ign.fr/pub/itrf/ITRF.TP +lastupdate=2017-07-25 - -# ITRF2000 -> ITRF2005 is only defined the opposite way, so we flip the sign on all -# parameters to get the opposite transformation. Parameters from http://itrf.ign.fr/ITRF_solutions/2005/tp_05-00.php - +proj=helmert +x=-0.0001 +y=0.0008 +z=0.0058 +s=-0.0004 +dx=0.0002 +dy=-0.0001 +dz=0.0018 +ds=-0.00008 +t_epoch=2000.0 +convention=position_vector - - +proj=helmert +x=0.0067 +y=0.0061 +z=-0.0185 +s=0.00155 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1997.0 +convention=position_vector - - +proj=helmert +x=0.0067 +y=0.0061 +z=-0.0185 +s=0.00155 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1997.0 +convention=position_vector - - +proj=helmert +x=0.0067 +y=0.0061 +z=-0.0185 +s=0.00155 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1997.0 +convention=position_vector - - +proj=helmert +x=0.0127 +y=0.0065 +z=-0.0209 +s=0.00195 +rx=-0.00039 +ry=0.00080 +rz=-0.00114 +dx=-0.0029 +dy=-0.0002 +dz=-0.0006 +ds=0.00001 +drx=-0.00011 +dry=-0.00019 +drz=0.00007 +t_epoch=1988.0 +convention=position_vector - - +proj=helmert +x=0.0147 +y=0.0135 +z=-0.0139 +s=0.00075 +rz=-0.00018 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1988.0 +convention=position_vector - - +proj=helmert +x=0.0267 +y=0.0275 +z=-0.0199 +s=0.00215 +rz=-0.00018 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1988.0 +convention=position_vector - - +proj=helmert +x=0.0247 +y=0.0235 +z=-0.0359 +s=0.00245 +rz=-0.00018 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1988.0 +convention=position_vector - - +proj=helmert +x=0.0297 +y=0.0475 +z=-0.0739 +s=0.00585 +rz=-0.00018 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1988.0 +convention=position_vector - - +proj=helmert +x=0.0247 +y=0.0115 +z=-0.0979 +s=0.00895 +rx=0.0001 +rz=-0.00018 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1988.0 +convention=position_vector diff --git a/app/android/assets/qgis-data/proj/ITRF2008 b/app/android/assets/qgis-data/proj/ITRF2008 deleted file mode 100644 index bd5f7cee5..000000000 --- a/app/android/assets/qgis-data/proj/ITRF2008 +++ /dev/null @@ -1,94 +0,0 @@ -# ITRF2008 params are in mm/year, PJ_helmert uses m/year - +version=1.0.0 +origin=http://itrf.ign.fr/doc_ITRF/Transfo-ITRF2008_ITRFs.txt +lastupdate=2017-07-26 - - +proj=helmert +x=-0.002 +y=-0.0009 +z=-0.0047 +s=0.00094 +dx=0.0003 +t_epoch=2000.0 +convention=position_vector - - +proj=helmert +x=-0.0019 +y=-0.0017 +z=-0.0105 +s=0.00134 +dx=0.0001 +dy=0.0001 +dz=-0.0018 +ds=0.00008 +t_epoch=2000.0 +convention=position_vector - - +proj=helmert +x=0.0048 +y=0.0026 +z=-0.0332 +s=0.00292 +rz=0.00006 +dx=0.0001 +dy=-0.0005 +dz=-0.0032 +ds=0.00009 +drz=0.00002 +t_epoch=2000.0 +convention=position_vector - - +proj=helmert +x=0.0048 +y=0.0026 +z=-0.0332 +s=0.00292 +rz=0.00006 +dx=0.0001 +dy=-0.0005 +dz=-0.0032 +ds=0.00009 +drz=0.00002 +t_epoch=2000.0 +convention=position_vector - - +proj=helmert +x=0.0048 +y=0.0026 +z=-0.0332 +s=0.00292 +rz=0.00006 +dx=0.0001 +dy=-0.0005 +dz=-0.0032 +ds=0.00009 +drz=0.00002 +t_epoch=2000.0 +convention=position_vector - - +proj=helmert +x=-0.024 +y=0.0024 +z=-0.00386 +s=0.00341 +rx=-0.00171 +ry=-0.00148 +rz=-0.0003 +dx=-0.0028 +dy=-0.0001 +dz=-0.0024 +ds=0.00009 +drx=-0.00011 +dry=-0.00019 +drz=0.00007 +t_epoch=2000.0 +convention=position_vector - - +proj=helmert +x=0.0128 +y=0.0046 +z=-0.0412 +s=0.00221 +rz=0.00006 +dx=0.0001 +dy=-0.0005 +dz=-0.0032 +ds=0.00009 +drz=0.00002 +t_epoch=2000.0 +convention=position_vector - - +proj=helmert +x=0.0248 +y=0.0186 +z=-0.0472 +s=0.00361 +rz=0.00006 +dx=0.0001 +dy=-0.0005 +dz=-0.0032 +ds=0.00009 +drz=0.00002 +t_epoch=2000.0 +convention=position_vector - - +proj=helmert +x=0.0228 +y=0.0146 +z=-0.0632 +s=0.00391 +rz=0.00006 +dx=0.0001 +dy=-0.0005 +dz=-0.0032 +ds=0.00009 +drz=0.00002 +t_epoch=2000.0 +convention=position_vector - - +proj=helmert +x=0.0278 +y=0.0386 +z=-0.1012 +s=0.00731 +rz=0.00006 +dx=0.0001 +dy=-0.0005 +dz=-0.0032 +ds=0.00009 +drz=0.00002 +t_epoch=2000.0 +convention=position_vector - - +proj=helmert +x=0.0228 +y=0.0026 +z=-0.1252 +s=0.01041 +rz=0.00006 +dx=0.0001 +dy=-0.0005 +dz=-0.0032 +ds=0.00009 +drz=0.00002 +t_epoch=2000.0 +convention=position_vector - - -# ITRF2008 Plate Motion Model parameters -# -# As described in -# -# Altamimi, Z., L. Métivier, and X. Collilieux (2012), ITRF2008 plate motion model, -# J. Geophys. Res., 117, B07402, doi:10.1029/2011JB008930. - - - +proj=helmert +drx=-0.000190 +dry=-0.000442 +drz=0.000915 +convention=position_vector - - +proj=helmert +drx=-0.000252 +dry=-0.000302 +drz=0.000643 +convention=position_vector - - +proj=helmert +drx=0.001202 +dry=-0.000054 +drz=0.001485 +convention=position_vector - - +proj=helmert +drx=0.001504 +dry=0.001172 +drz=0.001228 +convention=position_vector - - +proj=helmert +drx=0.000049 +dry=-0.001088 +drz=0.000664 +convention=position_vector - - +proj=helmert +drx=-0.000083 +dry=-0.000534 +drz=0.000750 +convention=position_vector - - +proj=helmert +drx=0.001232 +dry=0.000303 +drz=0.001540 +convention=position_vector - - +proj=helmert +drx=-0.000330 +dry=-0.001551 +drz=0.001625 +convention=position_vector - - +proj=helmert +drx=0.000035 +dry=-0.000662 +drz=-0.0001 +convention=position_vector - - +proj=helmert +drx=0.000095 +dry=-0.000598 +drz=0.000723 +convention=position_vector - - +proj=helmert +drx=-0.000411 +dry=0.001036 +drz=-0.002166 +convention=position_vector - - +proj=helmert +drx=-0.000243 +dry=-0.000311 +drz=-0.000154 +convention=position_vector - - +proj=helmert +drx=-0.000080 +dry=-0.000745 +drz=0.000897 +convention=position_vector - - +proj=helmert +drx=0.000047 +dry=-0.001 +drz=0.000975 +convention=position_vector - - -# Plate names suffixed by _T (for Translation) that includes the translation -# rates +dx=0.00041 +dy=0.00022 +dz=0.00041 given by Table 2 of the ITRF2008 plate motion model -# paper - - +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=-0.000190 +dry=-0.000442 +drz=0.000915 +convention=position_vector - - +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=-0.000252 +dry=-0.000302 +drz=0.000643 +convention=position_vector - - +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=0.001202 +dry=-0.000054 +drz=0.001485 +convention=position_vector - - +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=0.001504 +dry=0.001172 +drz=0.001228 +convention=position_vector - - +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=0.000049 +dry=-0.001088 +drz=0.000664 +convention=position_vector - - +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=-0.000083 +dry=-0.000534 +drz=0.000750 +convention=position_vector - - +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=0.001232 +dry=0.000303 +drz=0.001540 +convention=position_vector - - +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=-0.000330 +dry=-0.001551 +drz=0.001625 +convention=position_vector - - +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=0.000035 +dry=-0.000662 +drz=-0.0001 +convention=position_vector - - +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=0.000095 +dry=-0.000598 +drz=0.000723 +convention=position_vector - - +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=-0.000411 +dry=0.001036 +drz=-0.002166 +convention=position_vector - - +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=-0.000243 +dry=-0.000311 +drz=-0.000154 +convention=position_vector - - +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=-0.000080 +dry=-0.000745 +drz=0.000897 +convention=position_vector - - +proj=helmert +dx=0.00041 +dy=0.00022 +dz=0.00041 +drx=0.000047 +dry=-0.001 +drz=0.000975 +convention=position_vector diff --git a/app/android/assets/qgis-data/proj/ITRF2014 b/app/android/assets/qgis-data/proj/ITRF2014 deleted file mode 100644 index e16fb88cf..000000000 --- a/app/android/assets/qgis-data/proj/ITRF2014 +++ /dev/null @@ -1,55 +0,0 @@ -# ITRF2014 params are in mm/year, PJ_helmert uses m/year - +version=1.0.0 +origin=http://itrf.ign.fr/doc_ITRF/Transfo-ITRF2014_ITRFs.txt +lastupdate=2017-07-26 - - +proj=helmert +x=0.0016 +y=0.0019 +z=0.0024 +s=-0.00002 +dz=-0.0001 +ds=0.00003 +t_epoch=2010.0 +convention=position_vector - - +proj=helmert +x=0.0026 +y=0.001 +z=-0.0023 +s=0.00092 +dx=0.0003 +dz=-0.0001 +ds=0.00003 +t_epoch=2010.0 +convention=position_vector - - +proj=helmert +x=0.0007 +y=0.0012 +z=-0.0261 +s=0.00212 +dx=0.0001 +dy=0.0001 +dz=-0.0019 +ds=0.00011 +t_epoch=2010.0 +convention=position_vector - - +proj=helmert +x=0.0074 +y=-0.0005 +z=-0.0628 +d=0.0038 +rz=0.00026 +dx0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector - - +proj=helmert +x=0.0074 +y=-0.0005 +z=-0.0628 +s=0.0038 +rz=0.00026 +dx=0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector - - +proj=helmert +x=0.0074 +y=-0.0005 +z=-0.0628 +s=0.0038 +rz=0.00026 +dx=0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector - - +proj=helmert +x=-0.0504 +y=0.0033 +z=-0.0602 +s=0.00429 +rx=-0.00281 +ry=-0.00338 +rz=0.0004 +dx=-0.0028 +dy=-0.0001 +dz=-0.0025 +ds=0.00012 +drx=-0.00011 +dry=-0.00019 +drz=0.00007 +t_epoch=2010.0 +convention=position_vector - - +proj=helmert +x=0.0154 +y=0.0015 +z=-0.0708 +s=0.00309 +rz=0.00026 +dx=0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector - - +proj=helmert +x=0.0274 +y=0.0155 +z=-0.0768 +s=0.00449 +rz=0.00026 +dx=0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector - - +proj=helmert +x=0.0254 +y=0.0115 +z=-0.0928 +s=0.00479 +rz=0.00026 +dx=0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector - - +proj=helmert +x=0.0304 +y=0.0355 +z=-0.1308 +s=0.00819 +rz=0.00026 +dx=0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector - - +proj=helmert +x=0.0254 +y=-0.0005 +z=-0.1548 +s=0.01129 +rx=0.0001 +rz=0.00026 +dx=0.0001 +dy=-0.0005 +dz=-0.0033 +ds=0.00012 +drz=0.00002 +t_epoch=2010.0 +convention=position_vector - -# ITRF2014 Plate Motion Model parameters -# -# As described in -# -# Z. Altamimi et al, 2017, ITRF2014 plate motion model, -# doi: 10.1093/gji/ggx136 - - +proj=helmert +drx=-0.000248 +dry=-0.000324 +drz=0.000675 +convention=position_vector - - +proj=helmert +drx=0.001154 +dry=-0.000136 +drz=0.001444 +convention=position_vector - - +proj=helmert +drx=0.001510 +dry=0.001182 +drz=0.001215 +convention=position_vector - - +proj=helmert +drx=-0.000085 +dry=-0.000531 +drz=0.000770 +convention=position_vector - - +proj=helmert +drx=0.001154 +dry=-0.000005 +drz=0.001454 +convention=position_vector - - +proj=helmert +drx=-0.000333 +dry=-0.001544 +drz=0.001623 +convention=position_vector - - +proj=helmert +drx=0.000024 +dry=-0.000694 +drz=-0.000063 +convention=position_vector - - +proj=helmert +drx=0.000099 +dry=-0.000614 +drz=0.000733 +convention=position_vector - - +proj=helmert +drx=-0.000409 +dry=0.001047 +drz=-0.002169 +convention=position_vector - - +proj=helmert +drx=-0.000270 +dry=-0.000301 +drz=-0.000140 +convention=position_vector - - +proj=helmert +drx=-0.000121 +dry=-0.000794 +drz=0.000884 +convention=position_vector diff --git a/app/android/assets/qgis-data/proj/ITRF2020 b/app/android/assets/qgis-data/proj/ITRF2020 deleted file mode 100644 index 45aaa5687..000000000 --- a/app/android/assets/qgis-data/proj/ITRF2020 +++ /dev/null @@ -1,91 +0,0 @@ -# ITRF2020 params are in mm/year, PJ_helmert uses m/year - -# Generated with generate_itrf2020.py from EPSG database - - +proj=helmert +x=-0.0014 +y=-0.0009 +z=0.0014 +s=-0.00042 +dy=-0.0001 +dz=0.0002 +t_epoch=2015 +convention=position_vector - - +proj=helmert +x=0.0002 +y=0.001 +z=0.0033 +s=-0.00029 +dy=-0.0001 +dz=0.0001 +ds=3e-05 +t_epoch=2015 +convention=position_vector - - +proj=helmert +x=0.0027 +y=0.0001 +z=-0.0014 +s=0.00065 +dx=0.0003 +dy=-0.0001 +dz=0.0001 +ds=3e-05 +t_epoch=2015 +convention=position_vector - - +proj=helmert +x=-0.0002 +y=0.0008 +z=-0.0342 +s=0.00225 +dx=0.0001 +dz=-0.0017 +ds=0.00011 +t_epoch=2015 +convention=position_vector - - +proj=helmert +x=0.0065 +y=-0.0039 +z=-0.0779 +rz=0.00036 +s=0.00398 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector - - +proj=helmert +x=0.0065 +y=-0.0039 +z=-0.0779 +rz=0.00036 +s=0.00398 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector - - +proj=helmert +x=0.0065 +y=-0.0039 +z=-0.0779 +rz=0.00036 +s=0.00398 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector - - +proj=helmert +x=-0.0658 +y=0.0019 +z=-0.0713 +rx=-0.00336 +ry=-0.00433 +rz=0.00075 +s=0.00447 +dx=-0.0028 +dy=-0.0002 +dz=-0.0023 +drx=-0.00011 +dry=-0.00019 +drz=7e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector - - +proj=helmert +x=0.0145 +y=-0.0019 +z=-0.0859 +rz=0.00036 +s=0.00327 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector - - +proj=helmert +x=0.0265 +y=0.0121 +z=-0.0919 +rz=0.00036 +s=0.00467 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector - - +proj=helmert +x=0.0245 +y=0.0081 +z=-0.1079 +rz=0.00036 +s=0.00497 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector - - +proj=helmert +x=0.0295 +y=0.0321 +z=-0.1459 +rz=0.00036 +s=0.00837 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector - - +proj=helmert +x=0.0245 +y=-0.0039 +z=-0.1699 +rx=0.0001 +rz=0.00036 +s=0.01147 +dx=0.0001 +dy=-0.0006 +dz=-0.0031 +drz=2e-05 +ds=0.00012 +t_epoch=2015 +convention=position_vector - -# ITRF2020 Plate Motion Model parameters -# -# As described in https://agupubs.onlinelibrary.wiley.com/doi/full/10.1029/2023GL106373 -# (and also in https://itrf.ign.fr/docs/solutions/itrf2020/ITRF2020-PMM.dat, but with -# different units) - - +proj=helmert +drx=-0.000131 +dry=-0.000551 +drz=0.000837 +convention=position_vector - - +proj=helmert +drx=-0.000269 +dry=-0.000312 +drz=0.000678 +convention=position_vector - - +proj=helmert +drx=0.001129 +dry=-0.000146 +drz=0.001438 +convention=position_vector - - +proj=helmert +drx=0.001487 +dry=0.001175 +drz=0.001223 +convention=position_vector - - +proj=helmert +drx=0.000207 +dry=-0.001422 +drz=0.000726 +convention=position_vector - - +proj=helmert +drx=-0.000085 +dry=-0.000519 +drz=0.000753 +convention=position_vector - - +proj=helmert +drx=0.001137 +dry=0.000013 +drz=0.001444 +convention=position_vector - - +proj=helmert +drx=-0.000327 +dry=-0.001561 +drz=0.001605 +convention=position_vector - - +proj=helmert +drx=0.000045 +dry=-0.000666 +drz=-0.000098 +convention=position_vector - - +proj=helmert +drx=0.000090 +dry=-0.000585 +drz=0.000717 +convention=position_vector - - +proj=helmert +drx=-0.000404 +dry=0.001021 +drz=-0.002154 +convention=position_vector - - +proj=helmert +drx=-0.000261 +dry=-0.000282 +drz=-0.000157 +convention=position_vector - - +proj=helmert +drx=-0.000081 +dry=-0.000719 +drz=0.000864 +convention=position_vector - -# Plate names suffixed by _T (for Translation) that includes the translation -# rates +dx=0.00037 +dy=0.00035 +dz=0.00074 given by Table 2 of the ITRF2020 plate motion model -# paper - - +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=-0.000131 +dry=-0.000551 +drz=0.000837 +convention=position_vector - - +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=-0.000269 +dry=-0.000312 +drz=0.000678 +convention=position_vector - - +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=0.001129 +dry=-0.000146 +drz=0.001438 +convention=position_vector - - +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=0.001487 +dry=0.001175 +drz=0.001223 +convention=position_vector - - +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=0.000207 +dry=-0.001422 +drz=0.000726 +convention=position_vector - - +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=-0.000085 +dry=-0.000519 +drz=0.000753 +convention=position_vector - - +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=0.001137 +dry=0.000013 +drz=0.001444 +convention=position_vector - - +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=-0.000327 +dry=-0.001561 +drz=0.001605 +convention=position_vector - - +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=0.000045 +dry=-0.000666 +drz=-0.000098 +convention=position_vector - - +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=0.000090 +dry=-0.000585 +drz=0.000717 +convention=position_vector - - +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=-0.000404 +dry=0.001021 +drz=-0.002154 +convention=position_vector - - +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=-0.000261 +dry=-0.000282 +drz=-0.000157 +convention=position_vector - - +proj=helmert +dx=0.00037 +dy=0.00035 +dz=0.00074 +drx=-0.000081 +dry=-0.000719 +drz=0.000864 +convention=position_vector diff --git a/app/android/assets/qgis-data/proj/deformation_model.schema.json b/app/android/assets/qgis-data/proj/deformation_model.schema.json deleted file mode 100644 index d7a6d162c..000000000 --- a/app/android/assets/qgis-data/proj/deformation_model.schema.json +++ /dev/null @@ -1,582 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "description": "Schema for deformation models", - "type": "object", - "properties": { - "file_type": { - "type": "string", - "enum": [ - "deformation_model_master_file" - ], - "description": "File type. Always \"deformation_model_master_file\"" - }, - "format_version": { - "type": "string", - "enum": [ - "1.0" - ] - }, - "name": { - "type": "string", - "description": "A brief descriptive name of the deformation model" - }, - "version": { - "type": "string", - "description": "A string identifying the version of the deformation model. The format for specifying version will be defined by the agency responsible for the deformation model" - }, - "publication_date": { - "$ref": "#/definitions/datetime", - "description": "The date on which this version of the deformation model was published (or possibly the date on which it takes effect?)" - }, - "license": { - "type": "string", - "description": "License under which the model is published" - }, - "description": { - "type": "string", - "description": "A text description of the model" - }, - "authority": { - "type": "object", - "description": "Basic information about the agency responsible for the data set", - "properties": { - "name": { - "type": "string", - "description": "The name of the agency" - }, - "url": { - "type": "string", - "description": "The url of the agency website", - "format": "uri" - }, - "address": { - "type": "string", - "description": "The postal address of the agency" - }, - "email": { - "type": "string", - "description": "An email contact address for the agency", - "format": "email" - } - }, - "required": [ - "name" - ], - "additionalProperties": false - }, - "links": { - "type": "array", - "description": "Links to related information", - "items": { - "type": "object", - "properties": { - "href": { - "type": "string", - "description": "The URL holding the information", - "format": "uri" - }, - "rel": { - "type": "string", - "description": "The relationship to the dataset. Proposed relationships are:\n- \"about\": a web page for human consumption describing the model\n- \"source\": the authoritative source data from which the deformation model is built.\n- \"metadata\": ISO 19115 XML metadata regarding the deformation model." - }, - "type": { - "type": "string", - "description": "MIME type" - }, - "title": { - "type": "string", - "description": "Description of the link" - } - }, - "required": [ - "href" - ], - "additionalProperties": false - } - }, - "source_crs": { - "$ref": "#/definitions/crs", - "description": "The coordinate reference system to which the deformation model applies" - }, - "target_crs": { - "$ref": "#/definitions/crs", - "description": "For a time dependent coordinate transformation the coordinate reference system resulting from applying the deformation" - }, - "definition_crs": { - "$ref": "#/definitions/crs", - "description": "The coordinate reference system used to define the component spatial models. This proposal only supports using the same value for the source and definition coordinate reference system." - }, - "reference_epoch": { - "$ref": "#/definitions/datetime", - "description": "A nominal reference epoch of the deformation model. This is not necessarily used to calculate the deformation model - each component defines its own time function." - }, - "uncertainty_reference_epoch": { - "$ref": "#/definitions/datetime", - "description": "The uncertainties of the deformation model are calculated in terms of this epoch. This is described below in the Time functions section." - }, - "horizontal_offset_unit": { - "type": "string", - "enum": [ - "metre", - "degree" - ] - }, - "vertical_offset_unit": { - "type": "string", - "enum": [ - "metre" - ] - }, - "horizontal_uncertainty_type": { - "type": "string", - "enum": [ - "circular 95% confidence limit" - ] - }, - "horizontal_uncertainty_unit": { - "type": "string", - "enum": [ - "metre" - ] - }, - "vertical_uncertainty_type": { - "type": "string", - "enum": [ - "95% confidence limit" - ] - }, - "vertical_uncertainty_unit": { - "type": "string", - "enum": [ - "metre" - ] - }, - "horizontal_offset_method": { - "type": "string", - "description": "Defines how the horizontal offsets are applied to geographic coordinates", - "enum": [ - "addition", - "geocentric" - ] - }, - "extent": { - "$ref": "#/definitions/extent", - "description": "Defines the region within which the deformation model is defined. It cannot be calculated outside this region. The region is specified by a type and value. This proposal only supports using a bounding box as an array of [west,south,east,north] coordinate values" - }, - "time_extent": { - "type": "object", - "description": "Defines the range of times for which the model is valid, specified by a first and a last value. The deformation model is undefined for dates outside this range.", - "properties": { - "first": { - "$ref": "#/definitions/datetime" - }, - "last": { - "$ref": "#/definitions/datetime" - } - }, - "required": [ - "first", - "last" - ], - "additionalProperties": false - }, - "components": { - "type": "array", - "items": { - "$ref": "#/definitions/component" - } - } - }, - "required": [ - "file_type", - "format_version", - "source_crs", - "target_crs", - "definition_crs", - "extent", - "time_extent", - "components" - ], - "additionalProperties": false, - "definitions": { - "component": { - "type": "object", - "definition": "A component describes an aspect of the deformation, such as glacial isostatic adjustment, secular deformation, earthquakes, etc.", - "properties": { - "description": { - "type": "string", - "description": "A text description of this component of the model" - }, - "extent": { - "$ref": "#/definitions/extent", - "description": "The region within the component is defined. Outside this region the component evaluates to 0. The region is specified by a type and value. This proposal only supports using a bounding box as an array of [west,south,east,north] coordinate values" - }, - "displacement_type": { - "type": "string", - "description": "The displacement parameters defined by the model. The \"none\" option allows for a component which defines uncertainty with different grids to those defining displacement", - "enum": [ - "none", - "horizontal", - "vertical", - "3d" - ] - }, - "uncertainty_type": { - "type": "string", - "description": "The uncertainty parameters defined by the model", - "enum": [ - "none", - "horizontal", - "vertical", - "3d" - ] - }, - "horizontal_uncertainty": { - "type": "number", - "description": "The horizontal uncertainty to use if it is not defined explicitly in the spatial model" - }, - "vertical_uncertainty": { - "type": "number", - "description": "The vertical uncertainty to use if it is not defined explicitly in the spatial model" - }, - "spatial_model": { - "type": "object", - "description": "Defines the spatial model", - "properties": { - "type": { - "type": "string", - "description": "Specifies the type of the spatial model data file. Initially it is proposed that only GeoTIFF is supported", - "enum": [ - "GeoTIFF" - ] - }, - "interpolation_method": { - "type": "string", - "description": "Interpolation method", - "enum": [ - "bilinear", - "geocentric_bilinear" - ] - }, - "filename": { - "type": "string", - "description": "Specifies location of the spatial model GeoTIFF file relative to this JSON file" - }, - "md5_checksum": { - "type": "string", - "description": "A hex encoded MD5 checksum of the grid file that can be used to validate that it is the correct version of the file" - } - }, - "required": [ - "type", - "interpolation_method", - "filename" - ], - "additionalProperties": false - }, - "time_function": { - "$ref": "#/definitions/time_function" - } - }, - "required": [ - "description", - "extent", - "displacement_type", - "spatial_model", - "time_function" - ], - "additionalProperties": false - }, - "crs": { - "type": "string", - "pattern": "^[a-zA-Z]+:[a-zA-Z0-9]+$" - }, - "datetime": { - "type": "string", - "format": "date-time", - "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$" - }, - "extent": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "bbox" - ] - }, - "parameters": { - "type": "object", - "properties": { - "bbox": { - "type": "array", - "minItems": 4, - "maxItems": 4, - "items": { - "type": "number" - } - } - } - } - }, - "required": [ - "type", - "parameters" - ], - "additionalProperties": false - }, - "time_function": { - "description": "Function describing a multiplicative factor to apply to the spatial_model depending on the time", - "oneOf": [ - { - "$ref": "#/definitions/time_function_constant" - }, - { - "$ref": "#/definitions/time_function_velocity" - }, - { - "$ref": "#/definitions/time_function_step" - }, - { - "$ref": "#/definitions/time_function_reverse_step" - }, - { - "$ref": "#/definitions/time_function_piecewise" - }, - { - "$ref": "#/definitions/time_function_exponential" - } - ] - }, - "time_function_constant": { - "description": "The valuation of this function is 1 at any epoch", - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "constant" - ] - }, - "parameters": { - "type": "object", - "properties": { - }, - "additionalProperties": false - } - }, - "required": [ - "type" - ], - "additionalProperties": false - }, - "time_function_velocity": { - "description": "The valuation of this function is 0 at reference_epoch, and proportional to the time difference to it at other times", - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "velocity" - ] - }, - "parameters": { - "type": "object", - "properties": { - "reference_epoch": { - "$ref": "#/definitions/datetime" - } - }, - "required": [ - "reference_epoch" - ], - "additionalProperties": false - } - }, - "required": [ - "type", - "parameters" - ], - "additionalProperties": false - }, - "time_function_step": { - "description": "The valuation of this function is 0 before step_epoch, and 1 starting from it", - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "step" - ] - }, - "parameters": { - "type": "object", - "properties": { - "step_epoch": { - "$ref": "#/definitions/datetime" - } - }, - "required": [ - "step_epoch" - ], - "additionalProperties": false - } - }, - "required": [ - "type", - "parameters" - ], - "additionalProperties": false - }, - "time_function_reverse_step": { - "description": "The valuation of this function is 1 before step_epoch, and 0 starting from it", - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "reverse_step" - ] - }, - "parameters": { - "type": "object", - "properties": { - "step_epoch": { - "$ref": "#/definitions/datetime" - } - }, - "required": [ - "step_epoch" - ], - "additionalProperties": false - } - }, - "required": [ - "type", - "parameters" - ], - "additionalProperties": false - }, - "time_function_piecewise": { - "description": "Piecewise time function", - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "piecewise" - ] - }, - "parameters": { - "type": "object", - "properties": { - "before_first": { - "type": "string", - "description": "Defines the behaviour of the function before the first defined epoch", - "enum": [ - "zero", - "constant", - "linear" - ] - }, - "after_last": { - "type": "string", - "description": "Defines the behaviour of the function after the last defined epoch", - "enum": [ - "zero", - "constant", - "linear" - ] - }, - "model": { - "type": "array", - "description": "A sorted array data points each defined by two elements, \"epoch\" defines the date/time of the data point, and \"scale_factor\" is the corresponding function value. The array is sorted in order of increasing epoch. Note: where the time function includes a step it is represented by two consecutive data points with the same epoch. The first defines the scale factor that applies before the epoch and the second the scale factor that applies after the epoch", - "items": { - "type": "object", - "properties": { - "epoch": { - "$ref": "#/definitions/datetime" - }, - "scale_factor": { - "type": "number" - } - }, - "required": [ - "epoch", - "scale_factor" - ], - "additionalProperties": false - }, - "minItems": 2 - } - }, - "required": [ - "before_first", - "after_last", - "model" - ], - "additionalProperties": false - } - }, - "required": [ - "type", - "parameters" - ], - "additionalProperties": false - }, - "time_function_exponential": { - "description": "The valuation of this function is an exponential function with a time-based relaxation constant", - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "exponential" - ] - }, - "parameters": { - "type": "object", - "properties": { - "reference_epoch": { - "$ref": "#/definitions/datetime", - "description": "The date/time at which the exponential decay starts" - }, - "end_epoch": { - "$ref": "#/definitions/datetime", - "description": "The date/time at which the exponential decay ends (optional)" - }, - "relaxation_constant": { - "type": "number", - "description": "Relaxation constant in years" - }, - "before_scale_factor": { - "type": "number", - "description": "The scale factor that applies before the reference epoch" - }, - "initial_scale_factor": { - "type": "number", - "description": "The initial scale factor" - }, - "final_scale_factor": { - "type": "number", - "description": "The scale factor the exponential function approaches" - } - }, - "required": [ - "reference_epoch", - "relaxation_constant", - "before_scale_factor", - "initial_scale_factor", - "final_scale_factor" - ], - "additionalProperties": false - } - }, - "required": [ - "type", - "parameters" - ], - "additionalProperties": false - } - } -} \ No newline at end of file diff --git a/app/android/assets/qgis-data/proj/nad.lst b/app/android/assets/qgis-data/proj/nad.lst deleted file mode 100644 index cc4277220..000000000 --- a/app/android/assets/qgis-data/proj/nad.lst +++ /dev/null @@ -1,142 +0,0 @@ - Listing of State Plane North American Datum Zones - - NGS zone number - State and zone 1927 1983 - -Alabama east .................. 101 101 -Alabama west .................. 102 102 -Alaska zone no. 1 ............. 5001 5001 -Alaska zone no. 2 ............. 5002 5002 -Alaska zone no. 3 ............. 5003 5003 -Alaska zone no. 4 ............. 5004 5004 -Alaska zone no. 5 ............. 5005 5005 -Alaska zone no. 6 ............. 5006 5006 -Alaska zone no. 7 ............. 5007 5007 -Alaska zone no. 8 ............. 5008 5008 -Alaska zone no. 9 ............. 5009 5009 -Alaska zone no. 10 ............ 5010 5010 -American Samoa ................ 5300 -Arizona central ............... 202 202 -Arizona east .................. 201 201 -Arizona west .................. 203 203 -Arkansas north ................ 301 301 -Arkansas south ................ 302 302 -California I .................. 401 401 -California II ................. 402 402 -California III ................ 403 403 -California IV ................. 404 404 -California V .................. 405 405 -California VI ................. 406 406 -California VII ................ 407 -Colorado central .............. 502 502 -Colorado north ................ 501 501 -Colorado south ................ 503 503 -Connecticut ................... 600 600 -Delaware ...................... 700 700 -Florida east .................. 901 901 -Florida north ................. 903 903 -Florida west .................. 902 902 -Georgia east .................. 1001 1001 -Georgia west .................. 1002 1002 -Guam Island ................... 5400 -Hawaii 1 ...................... 5101 5101 -Hawaii 2 ...................... 5102 5102 -Hawaii 3 ...................... 5103 5103 -Hawaii 4 ...................... 5104 5104 -Hawaii 5 ...................... 5105 5105 -Idaho central ................. 1102 1102 -Idaho east .................... 1101 1101 -Idaho west .................... 1103 1103 -Illinois east ................. 1201 1201 -Illinois west ................. 1202 1202 -Indiana east .................. 1301 1301 -Indiana west .................. 1302 1302 -Iowa north .................... 1401 1401 -Iowa south .................... 1402 1402 -Kansas north .................. 1501 1501 -Kansas south .................. 1502 1502 -Kentucky north ................ 1601 1601 -Kentucky south ................ 1602 1602 -Louisiana north ............... 1701 1701 -Louisiana offshore ............ 1703 1703 -Louisiana south ............... 1702 1702 -Maine east .................... 1801 1801 -Maine west .................... 1802 1802 -Maryland ...................... 1900 1900 -Massachusetts island .......... 2002 2002 -Massachusetts mainland ........ 2001 2001 -Michigan central/l ............ 2112 2112 current -Michigan central/m ............ 2102 old -Michigan east ................. 2101 old -Michigan north ................ 2111 2111 current -Michigan south ................ 2113 2113 current -Michigan west ................. 2103 old -Minnesota central ............. 2202 2202 -Minnesota north ............... 2201 2201 -Minnesota south ............... 2203 2203 -Mississippi east .............. 2301 2301 -Mississippi west .............. 2302 2302 -Missouri central .............. 2402 2402 -Missouri east ................. 2401 2401 -Missouri west ................. 2403 2403 -Montana ....................... 2500 -Montana central ............... 2502 -Montana north ................. 2501 -Montana south ................. 2503 -Nebraska ...................... 2600 -Nebraska north ................ 2601 -Nebraska south ................ 2602 -Nevada central ................ 2702 2702 -Nevada east ................... 2701 2701 -Nevada west ................... 2703 2703 -New hampshire ................. 2800 2800 -New jersey .................... 2900 2900 -New mexico central ............ 3002 3002 -New mexico east ............... 3001 3001 -New mexico west ............... 3003 3003 -New york central .............. 3102 3102 -New york east ................. 3101 3101 -New york long island .......... 3104 3104 -New york west ................. 3103 3103 -North carolina ................ 3200 3200 -North dakota north ............ 3301 3301 -North dakota south ............ 3302 3302 -Ohio north .................... 3401 3401 -Ohio south .................... 3402 3402 -Oklahoma north ................ 3501 3501 -Oklahoma south ................ 3502 3502 -Oregon north .................. 3601 3601 -Oregon south .................. 3602 3602 -Pennsylvania north ............ 3701 3701 -Pennsylvania south ............ 3702 3702 -Puerto Rico, Virgin Islands ... 5201 5200 -Rhode Island .................. 3800 3800 -South Carolina ................ 3900 -South Carolina north .......... 3901 -South Carolina south .......... 3902 -South Dakota north ............ 4001 4001 -South Dakota south ............ 4002 4002 -Tennessee ..................... 4100 4100 -Texas central ................. 4203 4203 -Texas north ................... 4201 4201 -Texas north central ........... 4202 4202 -Texas south ................... 4205 4205 -Texas south central ........... 4204 4204 -Utah central .................. 4302 4302 -Utah north .................... 4301 4301 -Utah south .................... 4303 4303 -Vermont ....................... 4400 4400 -Virgin Islands, St. Croix ..... 5202 -Virginia north ................ 4501 4501 -Virginia south ................ 4502 4502 -Washington north .............. 4601 4601 -Washington south .............. 4602 4602 -West Virginia north ........... 4701 4701 -West Virginia south ........... 4702 4702 -Wisconsin central ............. 4802 4802 -Wisconsin north ............... 4801 4801 -Wisconsin south ............... 4803 4803 -Wyoming east .................. 4901 4901 -Wyoming east central .......... 4902 4902 -Wyoming west .................. 4904 4904 -Wyoming west central .......... 4903 4903 diff --git a/app/android/assets/qgis-data/proj/nad27 b/app/android/assets/qgis-data/proj/nad27 deleted file mode 100644 index c5e439621..000000000 --- a/app/android/assets/qgis-data/proj/nad27 +++ /dev/null @@ -1,810 +0,0 @@ -# SCCSID @(#)nad27 4.1 92/12/20 GIE -# proj +init files for: -# -# State Plane Coordinate Systems, -# North American Datum 1927 - - +lastupdate=1992-12-20 -# 101: alabama east: nad27 -<101> proj=tmerc datum=NAD27 -lon_0=-85d50 lat_0=30d30 k=.99996 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 102: alabama west: nad27 -<102> proj=tmerc datum=NAD27 -lon_0=-87d30 lat_0=30 k=.9999333333333333 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 5010: alaska zone no. 10: nad27 -<5010> proj=lcc datum=NAD27 -lon_0=-176 lat_1=53d50 lat_2=51d50 lat_0=51 -x_0=914401.8288036576 y_0=0 -no_defs <> - -# 5300: american samoa: nad27 -<5300> proj=lcc datum=NAD27 -lon_0=-170 lat_1=-14d16 lat_2=-14d16 lat_0=-14d16 -x_0=152400.3048006096 y_0=95169.31165862332 -no_defs <> - -# 201: arizona east: nad27 -<201> proj=tmerc datum=NAD27 -lon_0=-110d10 lat_0=31 k=.9999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 202: arizona central: nad27 -<202> proj=tmerc datum=NAD27 -lon_0=-111d55 lat_0=31 k=.9999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 203: arizona west: nad27 -<203> proj=tmerc datum=NAD27 -lon_0=-113d45 lat_0=31 k=.9999333333333333 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 301: arkansas north: nad27 -<301> proj=lcc datum=NAD27 -lon_0=-92 lat_1=36d14 lat_2=34d56 lat_0=34d20 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 302: arkansas south: nad27 -<302> proj=lcc datum=NAD27 -lon_0=-92 lat_1=34d46 lat_2=33d18 lat_0=32d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 401: california i: nad27 -<401> proj=lcc datum=NAD27 -lon_0=-122 lat_1=41d40 lat_2=40 lat_0=39d20 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 402: california ii: nad27 -<402> proj=lcc datum=NAD27 -lon_0=-122 lat_1=39d50 lat_2=38d20 lat_0=37d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 403: california iii: nad27 -<403> proj=lcc datum=NAD27 -lon_0=-120d30 lat_1=38d26 lat_2=37d4 lat_0=36d30 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 404: california iv: nad27 -<404> proj=lcc datum=NAD27 -lon_0=-119 lat_1=37d15 lat_2=36 lat_0=35d20 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 405: california v: nad27 -<405> proj=lcc datum=NAD27 -lon_0=-118 lat_1=35d28 lat_2=34d2 lat_0=33d30 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 406: california vi: nad27 -<406> proj=lcc datum=NAD27 -lon_0=-116d15 lat_1=33d53 lat_2=32d47 lat_0=32d10 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 407: california vii: nad27 -<407> proj=lcc datum=NAD27 -lon_0=-118d20 lat_1=34d25 lat_2=33d52 lat_0=34d8 -x_0=1276106.450596901 y_0=1268253.006858014 -no_defs <> - -# 501: colorado north: nad27 -<501> proj=lcc datum=NAD27 -lon_0=-105d30 lat_1=40d47 lat_2=39d43 lat_0=39d20 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 502: colorado central: nad27 -<502> proj=lcc datum=NAD27 -lon_0=-105d30 lat_1=39d45 lat_2=38d27 lat_0=37d50 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 503: colorado south: nad27 -<503> proj=lcc datum=NAD27 -lon_0=-105d30 lat_1=38d26 lat_2=37d14 lat_0=36d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 600: connecticut ---: nad27 -<600> proj=lcc datum=NAD27 -lon_0=-72d45 lat_1=41d52 lat_2=41d12 lat_0=40d50 -x_0=182880.3657607315 y_0=0 -no_defs <> - -# 700: delaware ---: nad27 -<700> proj=tmerc datum=NAD27 -lon_0=-75d25 lat_0=38 k=.999995 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 901: florida east: nad27 -<901> proj=tmerc datum=NAD27 -lon_0=-81 lat_0=24d20 k=.9999411764705882 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 902: florida west: nad27 -<902> proj=tmerc datum=NAD27 -lon_0=-82 lat_0=24d20 k=.9999411764705882 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 903: florida north: nad27 -<903> proj=lcc datum=NAD27 -lon_0=-84d30 lat_1=30d45 lat_2=29d35 lat_0=29 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 1001: georgia east: nad27 -<1001> proj=tmerc datum=NAD27 -lon_0=-82d10 lat_0=30 k=.9999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 1002: georgia west: nad27 -<1002> proj=tmerc datum=NAD27 -lon_0=-84d10 lat_0=30 k=.9999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 5101: hawaii 1: nad27 -<5101> proj=tmerc datum=NAD27 -lon_0=-155d30 lat_0=18d50 k=.9999666666666667 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 5102: hawaii 2: nad27 -<5102> proj=tmerc datum=NAD27 -lon_0=-156d40 lat_0=20d20 k=.9999666666666667 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 5103: hawaii 3: nad27 -<5103> proj=tmerc datum=NAD27 -lon_0=-158 lat_0=21d10 k=.99999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 5104: hawaii 4: nad27 -<5104> proj=tmerc datum=NAD27 -lon_0=-159d30 lat_0=21d50 k=.99999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 5105: hawaii 5: nad27 -<5105> proj=tmerc datum=NAD27 -lon_0=-160d10 lat_0=21d40 k=1 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 1101: idaho east: nad27 -<1101> proj=tmerc datum=NAD27 -lon_0=-112d10 lat_0=41d40 k=.9999473684210526 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 1102: idaho central: nad27 -<1102> proj=tmerc datum=NAD27 -lon_0=-114 lat_0=41d40 k=.9999473684210526 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 1103: idaho west: nad27 -<1103> proj=tmerc datum=NAD27 -lon_0=-115d45 lat_0=41d40 k=.9999333333333333 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 1201: illinois east: nad27 -<1201> proj=tmerc datum=NAD27 -lon_0=-88d20 lat_0=36d40 k=.999975 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 1202: illinois west: nad27 -<1202> proj=tmerc datum=NAD27 -lon_0=-90d10 lat_0=36d40 k=.9999411764705882 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 1301: indiana east: nad27 -<1301> proj=tmerc datum=NAD27 -lon_0=-85d40 lat_0=37d30 k=.9999666666666667 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 1302: indiana west: nad27 -<1302> proj=tmerc datum=NAD27 -lon_0=-87d5 lat_0=37d30 k=.9999666666666667 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 1401: iowa north: nad27 -<1401> proj=lcc datum=NAD27 -lon_0=-93d30 lat_1=43d16 lat_2=42d4 lat_0=41d30 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 1402: iowa south: nad27 -<1402> proj=lcc datum=NAD27 -lon_0=-93d30 lat_1=41d47 lat_2=40d37 lat_0=40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 1501: kansas north: nad27 -<1501> proj=lcc datum=NAD27 -lon_0=-98 lat_1=39d47 lat_2=38d43 lat_0=38d20 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 1502: kansas south: nad27 -<1502> proj=lcc datum=NAD27 -lon_0=-98d30 lat_1=38d34 lat_2=37d16 lat_0=36d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 1601: kentucky north: nad27 -<1601> proj=lcc datum=NAD27 -lon_0=-84d15 lat_1=38d58 lat_2=37d58 lat_0=37d30 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 1602: kentucky south: nad27 -<1602> proj=lcc datum=NAD27 -lon_0=-85d45 lat_1=37d56 lat_2=36d44 lat_0=36d20 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 1701: louisiana north: nad27 -<1701> proj=lcc datum=NAD27 -lon_0=-92d30 lat_1=32d40 lat_2=31d10 lat_0=30d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 1702: louisiana south: nad27 -<1702> proj=lcc datum=NAD27 -lon_0=-91d20 lat_1=30d42 lat_2=29d18 lat_0=28d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 1703: louisiana offshore: nad27 -<1703> proj=lcc datum=NAD27 -lon_0=-91d20 lat_1=27d50 lat_2=26d10 lat_0=25d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 1801: maine east: nad27 -<1801> proj=tmerc datum=NAD27 -lon_0=-68d30 lat_0=43d50 k=.9999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 1802: maine west: nad27 -<1802> proj=tmerc datum=NAD27 -lon_0=-70d10 lat_0=42d50 k=.9999666666666667 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 1900: maryland ---: nad27 -<1900> proj=lcc datum=NAD27 -lon_0=-77 lat_1=39d27 lat_2=38d18 lat_0=37d50 -x_0=243840.4876809754 y_0=0 -no_defs <> - -# 2001: massachusetts mainland: nad27 -<2001> proj=lcc datum=NAD27 -lon_0=-71d30 lat_1=42d41 lat_2=41d43 lat_0=41 -x_0=182880.3657607315 y_0=0 -no_defs <> - -# 2002: massachusetts island: nad27 -<2002> proj=lcc datum=NAD27 -lon_0=-70d30 lat_1=41d29 lat_2=41d17 lat_0=41 -x_0=60960.12192024384 y_0=0 -no_defs <> - -# 2101: michigan east: nad27 -<2101> proj=tmerc datum=NAD27 -lon_0=-83d40 lat_0=41d30 k=.9999428571428571 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 2102: michigan central/m: nad27 -<2102> proj=tmerc datum=NAD27 -lon_0=-85d45 lat_0=41d30 k=.9999090909090909 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 2103: michigan west: nad27 -<2103> proj=tmerc datum=NAD27 -lon_0=-88d45 lat_0=41d30 k=.9999090909090909 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 2111: michigan north: nad27 -<2111> proj=lcc a=6378450.047 es=.006768657997291094 -lon_0=-87 lat_1=47d5 lat_2=45d29 lat_0=44d47 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 2112: michigan central/l: nad27 -<2112> proj=lcc a=6378450.047 es=.006768657997291094 -lon_0=-84d20 lat_1=45d42 lat_2=44d11 lat_0=43d19 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 2113: michigan south: nad27 -<2113> proj=lcc a=6378450.047 es=.006768657997291094 -lon_0=-84d20 lat_1=43d40 lat_2=42d6 lat_0=41d30 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 2201: minnesota north: nad27 -<2201> proj=lcc datum=NAD27 -lon_0=-93d6 lat_1=48d38 lat_2=47d2 lat_0=46d30 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 2202: minnesota central: nad27 -<2202> proj=lcc datum=NAD27 -lon_0=-94d15 lat_1=47d3 lat_2=45d37 lat_0=45 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 2203: minnesota south: nad27 -<2203> proj=lcc datum=NAD27 -lon_0=-94 lat_1=45d13 lat_2=43d47 lat_0=43 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 2301: mississippi east: nad27 -<2301> proj=tmerc datum=NAD27 -lon_0=-88d50 lat_0=29d40 k=.99996 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 2302: mississippi west: nad27 -<2302> proj=tmerc datum=NAD27 -lon_0=-90d20 lat_0=30d30 k=.9999411764705882 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 2401: missouri east: nad27 -<2401> proj=tmerc datum=NAD27 -lon_0=-90d30 lat_0=35d50 k=.9999333333333333 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 2402: missouri central: nad27 -<2402> proj=tmerc datum=NAD27 -lon_0=-92d30 lat_0=35d50 k=.9999333333333333 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 2403: missouri west: nad27 -<2403> proj=tmerc datum=NAD27 -lon_0=-94d30 lat_0=36d10 k=.9999411764705882 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 2501: montana north: nad27 -<2501> proj=lcc datum=NAD27 -lon_0=-109d30 lat_1=48d43 lat_2=47d51 lat_0=47 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 2502: montana central: nad27 -<2502> proj=lcc datum=NAD27 -lon_0=-109d30 lat_1=47d53 lat_2=46d27 lat_0=45d50 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 2503: montana south: nad27 -<2503> proj=lcc datum=NAD27 -lon_0=-109d30 lat_1=46d24 lat_2=44d52 lat_0=44 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 2601: nebraska north: nad27 -<2601> proj=lcc datum=NAD27 -lon_0=-100 lat_1=42d49 lat_2=41d51 lat_0=41d20 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 2602: nebraska south: nad27 -<2602> proj=lcc datum=NAD27 -lon_0=-99d30 lat_1=41d43 lat_2=40d17 lat_0=39d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 2701: nevada east: nad27 -<2701> proj=tmerc datum=NAD27 -lon_0=-115d35 lat_0=34d45 k=.9999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 2702: nevada central: nad27 -<2702> proj=tmerc datum=NAD27 -lon_0=-116d40 lat_0=34d45 k=.9999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 2703: nevada west: nad27 -<2703> proj=tmerc datum=NAD27 -lon_0=-118d35 lat_0=34d45 k=.9999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 2800: new hampshire ---: nad27 -<2800> proj=tmerc datum=NAD27 -lon_0=-71d40 lat_0=42d30 k=.9999666666666667 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 2900: new jersey ---: nad27 -<2900> proj=tmerc datum=NAD27 -lon_0=-74d40 lat_0=38d50 k=.999975 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 3001: new mexico east: nad27 -<3001> proj=tmerc datum=NAD27 -lon_0=-104d20 lat_0=31 k=.9999090909090909 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 3002: new mexico central: nad27 -<3002> proj=tmerc datum=NAD27 -lon_0=-106d15 lat_0=31 k=.9999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 3003: new mexico west: nad27 -<3003> proj=tmerc datum=NAD27 -lon_0=-107d50 lat_0=31 k=.9999166666666667 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 3101: new york east: nad27 -<3101> proj=tmerc datum=NAD27 -lon_0=-74d20 lat_0=40 k=.9999666666666667 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 3102: new york central: nad27 -<3102> proj=tmerc datum=NAD27 -lon_0=-76d35 lat_0=40 k=.9999375 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 3103: new york west: nad27 -<3103> proj=tmerc datum=NAD27 -lon_0=-78d35 lat_0=40 k=.9999375 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 3104: new york long island: nad27 -<3104> proj=lcc datum=NAD27 -lon_0=-74 lat_1=41d2 lat_2=40d40 lat_0=40d30 -x_0=609601.2192024384 y_0=30480.06096012192 -no_defs <> - -# 3200: north carolina ---: nad27 -<3200> proj=lcc datum=NAD27 -lon_0=-79 lat_1=36d10 lat_2=34d20 lat_0=33d45 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 3301: north dakota north: nad27 -<3301> proj=lcc datum=NAD27 -lon_0=-100d30 lat_1=48d44 lat_2=47d26 lat_0=47 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 3302: north dakota south: nad27 -<3302> proj=lcc datum=NAD27 -lon_0=-100d30 lat_1=47d29 lat_2=46d11 lat_0=45d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 3401: ohio north: nad27 -<3401> proj=lcc datum=NAD27 -lon_0=-82d30 lat_1=41d42 lat_2=40d26 lat_0=39d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 3402: ohio south: nad27 -<3402> proj=lcc datum=NAD27 -lon_0=-82d30 lat_1=40d2 lat_2=38d44 lat_0=38 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 3501: oklahoma north: nad27 -<3501> proj=lcc datum=NAD27 -lon_0=-98 lat_1=36d46 lat_2=35d34 lat_0=35 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 3502: oklahoma south: nad27 -<3502> proj=lcc datum=NAD27 -lon_0=-98 lat_1=35d14 lat_2=33d56 lat_0=33d20 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 3601: oregon north: nad27 -<3601> proj=lcc datum=NAD27 -lon_0=-120d30 lat_1=46 lat_2=44d20 lat_0=43d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 3602: oregon south: nad27 -<3602> proj=lcc datum=NAD27 -lon_0=-120d30 lat_1=44 lat_2=42d20 lat_0=41d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 3701: pennsylvania north: nad27 -<3701> proj=lcc datum=NAD27 -lon_0=-77d45 lat_1=41d57 lat_2=40d53 lat_0=40d10 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 3702: pennsylvania south: nad27 -<3702> proj=lcc datum=NAD27 -lon_0=-77d45 lat_1=40d58 lat_2=39d56 lat_0=39d20 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 3800: rhode island ---: nad27 -<3800> proj=tmerc datum=NAD27 -lon_0=-71d30 lat_0=41d5 k=.99999375 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 3901: south carolina north: nad27 -<3901> proj=lcc datum=NAD27 -lon_0=-81 lat_1=34d58 lat_2=33d46 lat_0=33 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 3902: south carolina south: nad27 -<3902> proj=lcc datum=NAD27 -lon_0=-81 lat_1=33d40 lat_2=32d20 lat_0=31d50 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4001: south dakota north: nad27 -<4001> proj=lcc datum=NAD27 -lon_0=-100 lat_1=45d41 lat_2=44d25 lat_0=43d50 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4002: south dakota south: nad27 -<4002> proj=lcc datum=NAD27 -lon_0=-100d20 lat_1=44d24 lat_2=42d50 lat_0=42d20 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4100: tennessee ---: nad27 -<4100> proj=lcc datum=NAD27 -lon_0=-86 lat_1=36d25 lat_2=35d15 lat_0=34d40 -x_0=609601.2192024384 y_0=30480.06096012192 -no_defs <> - -# 4201: texas north: nad27 -<4201> proj=lcc datum=NAD27 -lon_0=-101d30 lat_1=36d11 lat_2=34d39 lat_0=34 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4202: texas north central: nad27 -<4202> proj=lcc datum=NAD27 -lon_0=-97d30 lat_1=33d58 lat_2=32d8 lat_0=31d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4203: texas central: nad27 -<4203> proj=lcc datum=NAD27 -lon_0=-100d20 lat_1=31d53 lat_2=30d7 lat_0=29d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4204: texas south central: nad27 -<4204> proj=lcc datum=NAD27 -lon_0=-99 lat_1=30d17 lat_2=28d23 lat_0=27d50 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4205: texas south: nad27 -<4205> proj=lcc datum=NAD27 -lon_0=-98d30 lat_1=27d50 lat_2=26d10 lat_0=25d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4301: utah north: nad27 -<4301> proj=lcc datum=NAD27 -lon_0=-111d30 lat_1=41d47 lat_2=40d43 lat_0=40d20 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4302: utah central: nad27 -<4302> proj=lcc datum=NAD27 -lon_0=-111d30 lat_1=40d39 lat_2=39d1 lat_0=38d20 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4303: utah south: nad27 -<4303> proj=lcc datum=NAD27 -lon_0=-111d30 lat_1=38d21 lat_2=37d13 lat_0=36d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4400: vermont ---: nad27 -<4400> proj=tmerc datum=NAD27 -lon_0=-72d30 lat_0=42d30 k=.9999642857142857 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 4501: virginia north: nad27 -<4501> proj=lcc datum=NAD27 -lon_0=-78d30 lat_1=39d12 lat_2=38d2 lat_0=37d40 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4502: virginia south: nad27 -<4502> proj=lcc datum=NAD27 -lon_0=-78d30 lat_1=37d58 lat_2=36d46 lat_0=36d20 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4601: washington north: nad27 -<4601> proj=lcc datum=NAD27 -lon_0=-120d50 lat_1=48d44 lat_2=47d30 lat_0=47 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4602: washington south: nad27 -<4602> proj=lcc datum=NAD27 -lon_0=-120d30 lat_1=47d20 lat_2=45d50 lat_0=45d20 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4701: west virginia north: nad27 -<4701> proj=lcc datum=NAD27 -lon_0=-79d30 lat_1=40d15 lat_2=39 lat_0=38d30 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4702: west virginia south: nad27 -<4702> proj=lcc datum=NAD27 -lon_0=-81 lat_1=38d53 lat_2=37d29 lat_0=37 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4801: wisconsin north: nad27 -<4801> proj=lcc datum=NAD27 -lon_0=-90 lat_1=46d46 lat_2=45d34 lat_0=45d10 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4802: wisconsin central: nad27 -<4802> proj=lcc datum=NAD27 -lon_0=-90 lat_1=45d30 lat_2=44d15 lat_0=43d50 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4803: wisconsin south: nad27 -<4803> proj=lcc datum=NAD27 -lon_0=-90 lat_1=44d4 lat_2=42d44 lat_0=42 -x_0=609601.2192024384 y_0=0 -no_defs <> - -# 4901: wyoming east: nad27 -<4901> proj=tmerc datum=NAD27 -lon_0=-105d10 lat_0=40d40 k=.9999411764705882 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 4902: wyoming east central: nad27 -<4902> proj=tmerc datum=NAD27 -lon_0=-107d20 lat_0=40d40 k=.9999411764705882 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 4903: wyoming west central: nad27 -<4903> proj=tmerc datum=NAD27 -lon_0=-108d45 lat_0=40d40 k=.9999411764705882 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 4904: wyoming west: nad27 -<4904> proj=tmerc datum=NAD27 -lon_0=-110d5 lat_0=40d40 k=.9999411764705882 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 5001: alaska zone no. 1: nad27 -<5001> proj=omerc datum=NAD27 -k=.9999 lonc=-133d40 lat_0=57 alpha=-36d52'11.6315 -x_0=818585.5672270928 y_0=575219.2451072642 -no_defs <> - -# 5002: alaska zone no. 2: nad27 -<5002> proj=tmerc datum=NAD27 -lon_0=-142 lat_0=54 k=.9999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 5003: alaska zone no. 3: nad27 -<5003> proj=tmerc datum=NAD27 -lon_0=-146 lat_0=54 k=.9999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 5004: alaska zone no. 4: nad27 -<5004> proj=tmerc datum=NAD27 -lon_0=-150 lat_0=54 k=.9999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 5005: alaska zone no. 5: nad27 -<5005> proj=tmerc datum=NAD27 -lon_0=-154 lat_0=54 k=.9999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 5006: alaska zone no. 6: nad27 -<5006> proj=tmerc datum=NAD27 -lon_0=-158 lat_0=54 k=.9999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 5007: alaska zone no. 7: nad27 -<5007> proj=tmerc datum=NAD27 -lon_0=-162 lat_0=54 k=.9999 -x_0=213360.4267208534 y_0=0 -no_defs <> - -# 5008: alaska zone no. 8: nad27 -<5008> proj=tmerc datum=NAD27 -lon_0=-166 lat_0=54 k=.9999 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 5009: alaska zone no. 9: nad27 -<5009> proj=tmerc datum=NAD27 -lon_0=-170 lat_0=54 k=.9999 -x_0=182880.3657607315 y_0=0 -no_defs <> - -# 5201: puerto rico and virgin islands: nad27 -<5201> proj=lcc datum=NAD27 -lon_0=-66d26 lat_1=18d26 lat_2=18d2 lat_0=17d50 -x_0=152400.3048006096 y_0=0 -no_defs <> - -# 5202: virgin islands st. croix: nad27 -<5202> proj=lcc datum=NAD27 -lon_0=-66d26 lat_1=18d26 lat_2=18d2 lat_0=17d50 -x_0=152400.3048006096 y_0=30480.06096012192 -no_defs <> - -# 5400: guam island: nad27 -<5400> proj=poly datum=NAD27 -x_0=50000 y_0=50000 lon_0=144d44'55.50254 lat_0=13d28'20.87887 -no_defs <> - diff --git a/app/android/assets/qgis-data/proj/nad83 b/app/android/assets/qgis-data/proj/nad83 deleted file mode 100644 index 1b65f5196..000000000 --- a/app/android/assets/qgis-data/proj/nad83 +++ /dev/null @@ -1,745 +0,0 @@ -# SCCSID @(#)nad83 4.1 92/12/20 GIE -# proj +init files for: -# -# State Plane Coordinate Systems, -# North American Datum 1983 - - +lastupdate=1992-12-20 -# 101: alabama east: nad83 -<101> proj=tmerc datum=NAD83 -lon_0=-85d50 lat_0=30d30 k=.99996 -x_0=200000 y_0=0 -no_defs <> - -# 102: alabama west: nad83 -<102> proj=tmerc datum=NAD83 -lon_0=-87d30 lat_0=30 k=.9999333333333333 -x_0=600000 y_0=0 -no_defs <> - -# 5010: alaska zone no. 10: nad83 -<5010> proj=lcc datum=NAD83 -lon_0=-176 lat_1=53d50 lat_2=51d50 lat_0=51 -x_0=1000000 y_0=0 -no_defs <> - -# 201: arizona east: nad83 -<201> proj=tmerc datum=NAD83 -lon_0=-110d10 lat_0=31 k=.9999 -x_0=213360 y_0=0 -no_defs <> - -# 202: arizona central: nad83 -<202> proj=tmerc datum=NAD83 -lon_0=-111d55 lat_0=31 k=.9999 -x_0=213360 y_0=0 -no_defs <> - -# 203: arizona west: nad83 -<203> proj=tmerc datum=NAD83 -lon_0=-113d45 lat_0=31 k=.9999333333333333 -x_0=213360 y_0=0 -no_defs <> - -# 301: arkansas north: nad83 -<301> proj=lcc datum=NAD83 -lon_0=-92 lat_1=36d14 lat_2=34d56 lat_0=34d20 -x_0=400000 y_0=0 -no_defs <> - -# 302: arkansas south: nad83 -<302> proj=lcc datum=NAD83 -lon_0=-92 lat_1=34d46 lat_2=33d18 lat_0=32d40 -x_0=400000 y_0=400000 -no_defs <> - -# 401: california i: nad83 -<401> proj=lcc datum=NAD83 -lon_0=-122 lat_1=41d40 lat_2=40 lat_0=39d20 -x_0=2000000 y_0=500000 -no_defs <> - -# 402: california ii: nad83 -<402> proj=lcc datum=NAD83 -lon_0=-122 lat_1=39d50 lat_2=38d20 lat_0=37d40 -x_0=2000000 y_0=500000 -no_defs <> - -# 403: california iii: nad83 -<403> proj=lcc datum=NAD83 -lon_0=-120d30 lat_1=38d26 lat_2=37d4 lat_0=36d30 -x_0=2000000 y_0=500000 -no_defs <> - -# 404: california iv: nad83 -<404> proj=lcc datum=NAD83 -lon_0=-119 lat_1=37d15 lat_2=36 lat_0=35d20 -x_0=2000000 y_0=500000 -no_defs <> - -# 405: california v: nad83 -<405> proj=lcc datum=NAD83 -lon_0=-118 lat_1=35d28 lat_2=34d2 lat_0=33d30 -x_0=2000000 y_0=500000 -no_defs <> - -# 406: california vi: nad83 -<406> proj=lcc datum=NAD83 -lon_0=-116d15 lat_1=33d53 lat_2=32d47 lat_0=32d10 -x_0=2000000 y_0=500000 -no_defs <> - -# 501: colorado north: nad83 -<501> proj=lcc datum=NAD83 -lon_0=-105d30 lat_1=40d47 lat_2=39d43 lat_0=39d20 -x_0=914401.8289 y_0=304800.6096 -no_defs <> - -# 502: colorado central: nad83 -<502> proj=lcc datum=NAD83 -lon_0=-105d30 lat_1=39d45 lat_2=38d27 lat_0=37d50 -x_0=914401.8289 y_0=304800.6096 -no_defs <> - -# 503: colorado south: nad83 -<503> proj=lcc datum=NAD83 -lon_0=-105d30 lat_1=38d26 lat_2=37d14 lat_0=36d40 -x_0=914401.8289 y_0=304800.6096 -no_defs <> - -# 600: connecticut ---: nad83 -<600> proj=lcc datum=NAD83 -lon_0=-72d45 lat_1=41d52 lat_2=41d12 lat_0=40d50 -x_0=304800.6096 y_0=152400.3048 -no_defs <> - -# 700: delaware ---: nad83 -<700> proj=tmerc datum=NAD83 -lon_0=-75d25 lat_0=38 k=.999995 -x_0=200000 y_0=0 -no_defs <> - -# 901: florida east: nad83 -<901> proj=tmerc datum=NAD83 -lon_0=-81 lat_0=24d20 k=.9999411764705882 -x_0=200000 y_0=0 -no_defs <> - -# 902: florida west: nad83 -<902> proj=tmerc datum=NAD83 -lon_0=-82 lat_0=24d20 k=.9999411764705882 -x_0=200000 y_0=0 -no_defs <> - -# 903: florida north: nad83 -<903> proj=lcc datum=NAD83 -lon_0=-84d30 lat_1=30d45 lat_2=29d35 lat_0=29 -x_0=600000 y_0=0 -no_defs <> - -# 1001: georgia east: nad83 -<1001> proj=tmerc datum=NAD83 -lon_0=-82d10 lat_0=30 k=.9999 -x_0=200000 y_0=0 -no_defs <> - -# 1002: georgia west: nad83 -<1002> proj=tmerc datum=NAD83 -lon_0=-84d10 lat_0=30 k=.9999 -x_0=700000 y_0=0 -no_defs <> - -# 5101: hawaii 1: nad83 -<5101> proj=tmerc datum=NAD83 -lon_0=-155d30 lat_0=18d50 k=.9999666666666667 -x_0=500000 y_0=0 -no_defs <> - -# 5102: hawaii 2: nad83 -<5102> proj=tmerc datum=NAD83 -lon_0=-156d40 lat_0=20d20 k=.9999666666666667 -x_0=500000 y_0=0 -no_defs <> - -# 5103: hawaii 3: nad83 -<5103> proj=tmerc datum=NAD83 -lon_0=-158 lat_0=21d10 k=.99999 -x_0=500000 y_0=0 -no_defs <> - -# 5104: hawaii 4: nad83 -<5104> proj=tmerc datum=NAD83 -lon_0=-159d30 lat_0=21d50 k=.99999 -x_0=500000 y_0=0 -no_defs <> - -# 5105: hawaii 5: nad83 -<5105> proj=tmerc datum=NAD83 -lon_0=-160d10 lat_0=21d40 k=1 -x_0=500000 y_0=0 -no_defs <> - -# 1101: idaho east: nad83 -<1101> proj=tmerc datum=NAD83 -lon_0=-112d10 lat_0=41d40 k=.9999473684210526 -x_0=200000 y_0=0 -no_defs <> - -# 1102: idaho central: nad83 -<1102> proj=tmerc datum=NAD83 -lon_0=-114 lat_0=41d40 k=.9999473684210526 -x_0=500000 y_0=0 -no_defs <> - -# 1103: idaho west: nad83 -<1103> proj=tmerc datum=NAD83 -lon_0=-115d45 lat_0=41d40 k=.9999333333333333 -x_0=800000 y_0=0 -no_defs <> - -# 1201: illinois east: nad83 -<1201> proj=tmerc datum=NAD83 -lon_0=-88d20 lat_0=36d40 k=.999975 -x_0=300000 y_0=0 -no_defs <> - -# 1202: illinois west: nad83 -<1202> proj=tmerc datum=NAD83 -lon_0=-90d10 lat_0=36d40 k=.9999411764705882 -x_0=700000 y_0=0 -no_defs <> - -# 1301: indiana east: nad83 -<1301> proj=tmerc datum=NAD83 -lon_0=-85d40 lat_0=37d30 k=.9999666666666667 -x_0=100000 y_0=250000 -no_defs <> - -# 1302: indiana west: nad83 -<1302> proj=tmerc datum=NAD83 -lon_0=-87d5 lat_0=37d30 k=.9999666666666667 -x_0=900000 y_0=250000 -no_defs <> - -# 1401: iowa north: nad83 -<1401> proj=lcc datum=NAD83 -lon_0=-93d30 lat_1=43d16 lat_2=42d4 lat_0=41d30 -x_0=1500000 y_0=1000000 -no_defs <> - -# 1402: iowa south: nad83 -<1402> proj=lcc datum=NAD83 -lon_0=-93d30 lat_1=41d47 lat_2=40d37 lat_0=40 -x_0=500000 y_0=0 -no_defs <> - -# 1501: kansas north: nad83 -<1501> proj=lcc datum=NAD83 -lon_0=-98 lat_1=39d47 lat_2=38d43 lat_0=38d20 -x_0=400000 y_0=0 -no_defs <> - -# 1502: kansas south: nad83 -<1502> proj=lcc datum=NAD83 -lon_0=-98d30 lat_1=38d34 lat_2=37d16 lat_0=36d40 -x_0=400000 y_0=400000 -no_defs <> - -# 1601: kentucky north: nad83 -<1601> proj=lcc datum=NAD83 -lon_0=-84d15 lat_1=38d58 lat_2=37d58 lat_0=37d30 -x_0=500000 y_0=0 -no_defs <> - -# 1602: kentucky south: nad83 -<1602> proj=lcc datum=NAD83 -lon_0=-85d45 lat_1=37d56 lat_2=36d44 lat_0=36d20 -x_0=500000 y_0=500000 -no_defs <> - -# 1701: louisiana north: nad83 -<1701> proj=lcc datum=NAD83 -lon_0=-92d30 lat_1=32d40 lat_2=31d10 lat_0=30d30 -x_0=1000000 y_0=0 -no_defs <> - -# 1702: louisiana south: nad83 -<1702> proj=lcc datum=NAD83 -lon_0=-91d20 lat_1=30d42 lat_2=29d18 lat_0=28d30 -x_0=1000000 y_0=0 -no_defs <> - -# 1703: louisiana offshore: nad83 -<1703> proj=lcc datum=NAD83 -lon_0=-91d20 lat_1=27d50 lat_2=26d10 lat_0=25d30 -x_0=1000000 y_0=0 -no_defs <> - -# 1801: maine east: nad83 -<1801> proj=tmerc datum=NAD83 -lon_0=-68d30 lat_0=43d40 k=.9999 -x_0=300000 y_0=0 -no_defs <> - -# 1802: maine west: nad83 -<1802> proj=tmerc datum=NAD83 -lon_0=-70d10 lat_0=42d50 k=.9999666666666667 -x_0=900000 y_0=0 -no_defs <> - -# 1900: maryland ---: nad83 -<1900> proj=lcc datum=NAD83 -lon_0=-77 lat_1=39d27 lat_2=38d18 lat_0=37d40 -x_0=400000 y_0=0 -no_defs <> - -# 2001: massachusetts mainland: nad83 -<2001> proj=lcc datum=NAD83 -lon_0=-71d30 lat_1=42d41 lat_2=41d43 lat_0=41 -x_0=200000 y_0=750000 -no_defs <> - -# 2002: massachusetts island: nad83 -<2002> proj=lcc datum=NAD83 -lon_0=-70d30 lat_1=41d29 lat_2=41d17 lat_0=41 -x_0=500000 y_0=0 -no_defs <> - -# 2111: michigan north: nad83 -<2111> proj=lcc datum=NAD83 -lon_0=-87 lat_1=47d5 lat_2=45d29 lat_0=44d47 -x_0=8000000 y_0=0 -no_defs <> - -# 2112: michigan central/l: nad83 -<2112> proj=lcc datum=NAD83 -lon_0=-84d22 lat_1=45d42 lat_2=44d11 lat_0=43d19 -x_0=6000000 y_0=0 -no_defs <> - -# 2113: michigan south: nad83 -<2113> proj=lcc datum=NAD83 -lon_0=-84d22 lat_1=43d40 lat_2=42d6 lat_0=41d30 -x_0=4000000 y_0=0 -no_defs <> - -# 2201: minnesota north: nad83 -<2201> proj=lcc datum=NAD83 -lon_0=-93d6 lat_1=48d38 lat_2=47d2 lat_0=46d30 -x_0=800000 y_0=100000 -no_defs <> - -# 2202: minnesota central: nad83 -<2202> proj=lcc datum=NAD83 -lon_0=-94d15 lat_1=47d3 lat_2=45d37 lat_0=45 -x_0=800000 y_0=100000 -no_defs <> - -# 2203: minnesota south: nad83 -<2203> proj=lcc datum=NAD83 -lon_0=-94 lat_1=45d13 lat_2=43d47 lat_0=43 -x_0=800000 y_0=100000 -no_defs <> - -# 2301: mississippi east: nad83 -<2301> proj=tmerc datum=NAD83 -lon_0=-88d50 lat_0=29d30 k=.99995 -x_0=300000 y_0=0 -no_defs <> - -# 2302: mississippi west: nad83 -<2302> proj=tmerc datum=NAD83 -lon_0=-90d20 lat_0=29d30 k=.99995 -x_0=700000 y_0=0 -no_defs <> - -# 2401: missouri east: nad83 -<2401> proj=tmerc datum=NAD83 -lon_0=-90d30 lat_0=35d50 k=.9999333333333333 -x_0=250000 y_0=0 -no_defs <> - -# 2402: missouri central: nad83 -<2402> proj=tmerc datum=NAD83 -lon_0=-92d30 lat_0=35d50 k=.9999333333333333 -x_0=500000 y_0=0 -no_defs <> - -# 2403: missouri west: nad83 -<2403> proj=tmerc datum=NAD83 -lon_0=-94d30 lat_0=36d10 k=.9999411764705882 -x_0=850000 y_0=0 -no_defs <> - -# 2500: montana: nad83 -<2500> proj=lcc datum=NAD83 -lon_0=-109d30 lat_1=49 lat_2=45 lat_0=44d15 -x_0=600000 y_0=0 -no_defs <> - -# 2600: nebraska: nad83 -<2600> proj=lcc datum=NAD83 -lon_0=-100 lat_1=43 lat_2=40 lat_0=39d50 -x_0=500000 y_0=0 -no_defs <> - -# 2701: nevada east: nad83 -<2701> proj=tmerc datum=NAD83 -lon_0=-115d35 lat_0=34d45 k=.9999 -x_0=200000 y_0=8000000 -no_defs <> - -# 2702: nevada central: nad83 -<2702> proj=tmerc datum=NAD83 -lon_0=-116d40 lat_0=34d45 k=.9999 -x_0=500000 y_0=6000000 -no_defs <> - -# 2703: nevada west: nad83 -<2703> proj=tmerc datum=NAD83 -lon_0=-118d35 lat_0=34d45 k=.9999 -x_0=800000 y_0=4000000 -no_defs <> - -# 2800: new hampshire ---: nad83 -<2800> proj=tmerc datum=NAD83 -lon_0=-71d40 lat_0=42d30 k=.9999666666666667 -x_0=300000 y_0=0 -no_defs <> - -# 2900: new jersey ---: nad83 -<2900> proj=tmerc datum=NAD83 -lon_0=-74d30 lat_0=38d50 k=.9999 -x_0=150000 y_0=0 -no_defs <> - -# 3001: new mexico east: nad83 -<3001> proj=tmerc datum=NAD83 -lon_0=-104d20 lat_0=31 k=.9999090909090909 -x_0=165000 y_0=0 -no_defs <> - -# 3002: new mexico central: nad83 -<3002> proj=tmerc datum=NAD83 -lon_0=-106d15 lat_0=31 k=.9999 -x_0=500000 y_0=0 -no_defs <> - -# 3003: new mexico west: nad83 -<3003> proj=tmerc datum=NAD83 -lon_0=-107d50 lat_0=31 k=.9999166666666667 -x_0=830000 y_0=0 -no_defs <> - -# 3101: new york east: nad83 -<3101> proj=tmerc datum=NAD83 -lon_0=-74d30 lat_0=38d50 k=.9999 -x_0=150000 y_0=0 -no_defs <> - -# 3102: new york central: nad83 -<3102> proj=tmerc datum=NAD83 -lon_0=-76d35 lat_0=40 k=.9999375 -x_0=250000 y_0=0 -no_defs <> - -# 3103: new york west: nad83 -<3103> proj=tmerc datum=NAD83 -lon_0=-78d35 lat_0=40 k=.9999375 -x_0=350000 y_0=0 -no_defs <> - -# 3104: new york long island: nad83 -<3104> proj=lcc datum=NAD83 -lon_0=-74 lat_1=41d2 lat_2=40d40 lat_0=40d10 -x_0=300000 y_0=0 -no_defs <> - -# 3200: north carolina ---: nad83 -<3200> proj=lcc datum=NAD83 -lon_0=-79 lat_1=36d10 lat_2=34d20 lat_0=33d45 -x_0=609601.22 y_0=0 -no_defs <> - -# 3301: north dakota north: nad83 -<3301> proj=lcc datum=NAD83 -lon_0=-100d30 lat_1=48d44 lat_2=47d26 lat_0=47 -x_0=600000 y_0=0 -no_defs <> - -# 3302: north dakota south: nad83 -<3302> proj=lcc datum=NAD83 -lon_0=-100d30 lat_1=47d29 lat_2=46d11 lat_0=45d40 -x_0=600000 y_0=0 -no_defs <> - -# 3401: ohio north: nad83 -<3401> proj=lcc datum=NAD83 -lon_0=-82d30 lat_1=41d42 lat_2=40d26 lat_0=39d40 -x_0=600000 y_0=0 -no_defs <> - -# 3402: ohio south: nad83 -<3402> proj=lcc datum=NAD83 -lon_0=-82d30 lat_1=40d2 lat_2=38d44 lat_0=38 -x_0=600000 y_0=0 -no_defs <> - -# 3501: oklahoma north: nad83 -<3501> proj=lcc datum=NAD83 -lon_0=-98 lat_1=36d46 lat_2=35d34 lat_0=35 -x_0=600000 y_0=0 -no_defs <> - -# 3502: oklahoma south: nad83 -<3502> proj=lcc datum=NAD83 -lon_0=-98 lat_1=35d14 lat_2=33d56 lat_0=33d20 -x_0=600000 y_0=0 -no_defs <> - -# 3601: oregon north: nad83 -<3601> proj=lcc datum=NAD83 -lon_0=-120d30 lat_1=46 lat_2=44d20 lat_0=43d40 -x_0=2500000 y_0=0 -no_defs <> - -# 3602: oregon south: nad83 -<3602> proj=lcc datum=NAD83 -lon_0=-120d30 lat_1=44 lat_2=42d20 lat_0=41d40 -x_0=1500000 y_0=0 -no_defs <> - -# 3701: pennsylvania north: nad83 -<3701> proj=lcc datum=NAD83 -lon_0=-77d45 lat_1=41d57 lat_2=40d53 lat_0=40d10 -x_0=600000 y_0=0 -no_defs <> - -# 3702: pennsylvania south: nad83 -<3702> proj=lcc datum=NAD83 -lon_0=-77d45 lat_1=40d58 lat_2=39d56 lat_0=39d20 -x_0=600000 y_0=0 -no_defs <> - -# 3800: rhode island ---: nad83 -<3800> proj=tmerc datum=NAD83 -lon_0=-71d30 lat_0=41d5 k=.99999375 -x_0=100000 y_0=0 -no_defs <> - -# 3900: south carolina: nad83 -<3900> proj=lcc datum=NAD83 -lon_0=-81 lat_1=34d50 lat_2=32d30 lat_0=31d50 -x_0=609600 y_0=0 -no_defs <> - -# 4001: south dakota north: nad83 -<4001> proj=lcc datum=NAD83 -lon_0=-100 lat_1=45d41 lat_2=44d25 lat_0=43d50 -x_0=600000 y_0=0 -no_defs <> - -# 4002: south dakota south: nad83 -<4002> proj=lcc datum=NAD83 -lon_0=-100d20 lat_1=44d24 lat_2=42d50 lat_0=42d20 -x_0=600000 y_0=0 -no_defs <> - -# 4100: tennessee ---: nad83 -<4100> proj=lcc datum=NAD83 -lon_0=-86 lat_1=36d25 lat_2=35d15 lat_0=34d20 -x_0=600000 y_0=0 -no_defs <> - -# 4201: texas north: nad83 -<4201> proj=lcc datum=NAD83 -lon_0=-101d30 lat_1=36d11 lat_2=34d39 lat_0=34 -x_0=200000 y_0=1000000 -no_defs <> - -# 4202: texas north central: nad83 -<4202> proj=lcc datum=NAD83 -lon_0=-98d30 lat_1=33d58 lat_2=32d8 lat_0=31d40 -x_0=600000 y_0=2000000 -no_defs <> - -# 4203: texas central: nad83 -<4203> proj=lcc datum=NAD83 -lon_0=-100d20 lat_1=31d53 lat_2=30d7 lat_0=29d40 -x_0=700000 y_0=3000000 -no_defs <> - -# 4204: texas south central: nad83 -<4204> proj=lcc datum=NAD83 -lon_0=-99 lat_1=30d17 lat_2=28d23 lat_0=27d50 -x_0=600000 y_0=4000000 -no_defs <> - -# 4205: texas south: nad83 -<4205> proj=lcc datum=NAD83 -lon_0=-98d30 lat_1=27d50 lat_2=26d10 lat_0=25d40 -x_0=300000 y_0=5000000 -no_defs <> - -# 4301: utah north: nad83 -<4301> proj=lcc datum=NAD83 -lon_0=-111d30 lat_1=41d47 lat_2=40d43 lat_0=40d20 -x_0=500000 y_0=1000000 -no_defs <> - -# 4302: utah central: nad83 -<4302> proj=lcc datum=NAD83 -lon_0=-111d30 lat_1=40d39 lat_2=39d1 lat_0=38d20 -x_0=500000 y_0=2000000 -no_defs <> - -# 4303: utah south: nad83 -<4303> proj=lcc datum=NAD83 -lon_0=-111d30 lat_1=38d21 lat_2=37d13 lat_0=36d40 -x_0=500000 y_0=3000000 -no_defs <> - -# 4400: vermont ---: nad83 -<4400> proj=tmerc datum=NAD83 -lon_0=-72d30 lat_0=42d30 k=.9999642857142857 -x_0=500000 y_0=0 -no_defs <> - -# 4501: virginia north: nad83 -<4501> proj=lcc datum=NAD83 -lon_0=-78d30 lat_1=39d12 lat_2=38d2 lat_0=37d40 -x_0=3500000 y_0=2000000 -no_defs <> - -# 4502: virginia south: nad83 -<4502> proj=lcc datum=NAD83 -lon_0=-78d30 lat_1=37d58 lat_2=36d46 lat_0=36d20 -x_0=3500000 y_0=1000000 -no_defs <> - -# 4601: washington north: nad83 -<4601> proj=lcc datum=NAD83 -lon_0=-120d50 lat_1=48d44 lat_2=47d30 lat_0=47 -x_0=500000 y_0=0 -no_defs <> - -# 4602: washington south: nad83 -<4602> proj=lcc datum=NAD83 -lon_0=-120d30 lat_1=47d20 lat_2=45d50 lat_0=45d20 -x_0=500000 y_0=0 -no_defs <> - -# 4701: west virginia north: nad83 -<4701> proj=lcc datum=NAD83 -lon_0=-79d30 lat_1=40d15 lat_2=39 lat_0=38d30 -x_0=600000 y_0=0 -no_defs <> - -# 4702: west virginia south: nad83 -<4702> proj=lcc datum=NAD83 -lon_0=-81 lat_1=38d53 lat_2=37d29 lat_0=37 -x_0=600000 y_0=0 -no_defs <> - -# 4801: wisconsin north: nad83 -<4801> proj=lcc datum=NAD83 -lon_0=-90 lat_1=46d46 lat_2=45d34 lat_0=45d10 -x_0=600000 y_0=0 -no_defs <> - -# 4802: wisconsin central: nad83 -<4802> proj=lcc datum=NAD83 -lon_0=-90 lat_1=45d30 lat_2=44d15 lat_0=43d50 -x_0=600000 y_0=0 -no_defs <> - -# 4803: wisconsin south: nad83 -<4803> proj=lcc datum=NAD83 -lon_0=-90 lat_1=44d4 lat_2=42d44 lat_0=42 -x_0=600000 y_0=0 -no_defs <> - -# 4901: wyoming east: nad83 -<4901> proj=tmerc datum=NAD83 -lon_0=-105d10 lat_0=40d30 k=.9999375 -x_0=200000 y_0=0 -no_defs <> - -# 4902: wyoming east central: nad83 -<4902> proj=tmerc datum=NAD83 -lon_0=-107d20 lat_0=40d30 k=.9999375 -x_0=400000 y_0=100000 -no_defs <> - -# 4903: wyoming west central: nad83 -<4903> proj=tmerc datum=NAD83 -lon_0=-108d45 lat_0=40d30 k=.9999375 -x_0=600000 y_0=0 -no_defs <> - -# 4904: wyoming west: nad83 -<4904> proj=tmerc datum=NAD83 -lon_0=-110d5 lat_0=40d30 k=.9999375 -x_0=800000 y_0=100000 -no_defs <> - -# 5001: alaska zone no. 1: nad83 -<5001> proj=omerc datum=NAD83 -k=.9999 lonc=-133d40 lat_0=57 alpha=-36d52'11.6315 -x_0=818676.7344011233 y_0=575097.6888751927 -no_defs <> - -# 5002: alaska zone no. 2: nad83 -<5002> proj=tmerc datum=NAD83 -lon_0=-142 lat_0=54 k=.9999 -x_0=500000 y_0=0 -no_defs <> - -# 5003: alaska zone no. 3: nad83 -<5003> proj=tmerc datum=NAD83 -lon_0=-146 lat_0=54 k=.9999 -x_0=500000 y_0=0 -no_defs <> - -# 5004: alaska zone no. 4: nad83 -<5004> proj=tmerc datum=NAD83 -lon_0=-150 lat_0=54 k=.9999 -x_0=500000 y_0=0 -no_defs <> - -# 5005: alaska zone no. 5: nad83 -<5005> proj=tmerc datum=NAD83 -lon_0=-154 lat_0=54 k=.9999 -x_0=500000 y_0=0 -no_defs <> - -# 5006: alaska zone no. 6: nad83 -<5006> proj=tmerc datum=NAD83 -lon_0=-158 lat_0=54 k=.9999 -x_0=500000 y_0=0 -no_defs <> - -# 5007: alaska zone no. 7: nad83 -<5007> proj=tmerc datum=NAD83 -lon_0=-162 lat_0=54 k=.9999 -x_0=500000 y_0=0 -no_defs <> - -# 5008: alaska zone no. 8: nad83 -<5008> proj=tmerc datum=NAD83 -lon_0=-166 lat_0=54 k=.9999 -x_0=500000 y_0=0 -no_defs <> - -# 5009: alaska zone no. 9: nad83 -<5009> proj=tmerc datum=NAD83 -lon_0=-170 lat_0=54 k=.9999 -x_0=500000 y_0=0 -no_defs <> - -# 5200: puerto rico and virgin islands: nad83 -<5200> proj=lcc datum=NAD83 -lon_0=-66d26 lat_1=18d26 lat_2=18d2 lat_0=17d50 -x_0=200000 y_0=200000 -no_defs <> - diff --git a/app/android/assets/qgis-data/proj/other.extra b/app/android/assets/qgis-data/proj/other.extra deleted file mode 100644 index 4b5797e9a..000000000 --- a/app/android/assets/qgis-data/proj/other.extra +++ /dev/null @@ -1,53 +0,0 @@ -## NAD83 / BC Albers (this has been superseded but is kept for compatibility) -<42102> +proj=aea +ellps=GRS80 +lat_0=45 +lon_0=-126.0 +lat_1=50.0 +lat_2=58.5 +x_0=1000000.0 +y_0=0 +datum=NAD83 +units=m no_defs <> - - -# -# OGC-defined extended codes (41000--41999) -# see http://www.digitalearth.gov/wmt/auto.html -# -# WGS84 / Simple Mercator -<41001> +proj=merc +lat_ts=0 +lon_0=0 +k=1.000000 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> -# -# CubeWerx-defined extended codes (42100--42199) -# -# WGS 84 / LCC Canada -<42101> +proj=lcc +lat_1=49 +lat_2=77 +lat_0=0 +lon_0=-95 +x_0=0 +y_0=-8000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> -#EPSG:42102,"PROJCS[\"NAD83 / BC Albers\",GEOGCS[\"NAD83\",DATUM[\"North_American_Datum_1983\",SPHEROID[\"GRS_1980\",6378137,298.257222101]],PRIMEM[\"Greenwich\",0],UNIT[\"Decimal_Degree\",0.0174532925199433]],PROJECTION[\"Albers_conic_equal_area\"],PARAMETER[\"central_meridian\",-126.0],PARAMETER[\"latitude_of_origin\",45],PARAMETER[\"standard_parallel_1\",50.0],PARAMETER[\"standard_parallel_2\",58.5],PARAMETER[\"false_easting\",1000000.0],PARAMETER[\"false_northing\",0],UNIT[\"Meter\",1]]" -# WGS 84 / LCC USA -<42103> +proj=lcc +lat_1=33 +lat_2=45 +lat_0=0 +lon_0=-100 +x_0=0 +y_0=0 +ellps=WGS72 +datum=WGS84 +units=m +no_defs no_defs <> -# NAD83 / MTM zone 8 Québec -<42104> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs no_defs <> -# WGS84 / Merc NorthAm -<42105> +proj=merc +lat_ts=0 +lon_0=-96 +k=1.000000 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> -# WGS84 / Lambert Azim Mozambique -<42106> +proj=laea +lat_0=5 +lon_0=20 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +datum=WGS84 +units=m +no_defs no_defs <> -# -# CubeWerx-customer definitions (42300--42399) -# -# NAD27 / Polar Stereographic / CM=-98 -<42301> +proj=stere +lat_0=90 +lon_0=-98 +x_0=0 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> -# JapanOrtho.09 09 -<42302> +proj=tmerc +lat_0=36 +lon_0=139.833333333333 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> -# NAD83 / Albers NorthAm -<42303> +proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=23 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> -# NAD83 / NRCan LCC Canada -<42304> +proj=lcc +lat_1=49 +lat_2=77 +lat_0=49 +lon_0=-95 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> -# France_II -<42305> +proj=lcc +lat_1=45.898918964419 +lat_2=47.696014502038 +lat_0=46.8 +lon_0=2.337229166666667 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356514.999904194 +pm=2.337229166666667 +units=m +no_defs no_defs <> -# NAD83/QC_LCC -<42306> +proj=lcc +lat_1=46 +lat_2=60 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> -# NAD83 / Texas Central - feet -<42307> +proj=lcc +lat_1=31.8833333333333 +lat_2=30.1166666666667 +lat_0=29.6666666666667 +lon_0=-100.333333333333 +x_0=700000.0000000001 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> -# NAD27 / California Albers -<42308> +proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> -# NAD 83 / LCC Canada AVHRR-2 -<42309> +proj=lcc +lat_1=49 +lat_2=77 +lat_0=0 +lon_0=-95 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> -# WGS84+GRS80 / Mercator -<42310> +proj=merc +lat_ts=0 +lon_0=0 +k=1.000000 +x_0=0 +y_0=0 +ellps=GRS80 +datum=WGS84 +units=m +no_defs no_defs <> -# NAD83 / LCC Statcan -<42311> +proj=lcc +lat_1=49 +lat_2=77 +lat_0=63.390675 +lon_0=-91.86666700000001 +x_0=6200000 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> -# -# Funny epsgish code for google mercator - you should really use EPSG:3857 -# -<900913> +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs <> diff --git a/app/android/assets/qgis-data/proj/proj.db b/app/android/assets/qgis-data/proj/proj.db deleted file mode 100644 index a6eeae97f..000000000 Binary files a/app/android/assets/qgis-data/proj/proj.db and /dev/null differ diff --git a/app/android/assets/qgis-data/proj/proj.ini b/app/android/assets/qgis-data/proj/proj.ini deleted file mode 100644 index 144562cf6..000000000 --- a/app/android/assets/qgis-data/proj/proj.ini +++ /dev/null @@ -1,51 +0,0 @@ -[general] -; Lines starting by ; are commented lines. -; - -; Network capabilities disabled by default. -; Can be overridden with the PROJ_NETWORK=ON environment variable. -; Cf https://proj.org/en/latest/usage/network.html -; Valid values = on, off -network = off - -; Endpoint of the Content Delivery Network where remote resources might -; be accessed. Only used if network access is allowed (cf above "network" -; option) -; Can be overridden with the PROJ_NETWORK_ENDPOINT environment variable. -cdn_endpoint = https://cdn.proj.org - -; Whether to enable a cache of remote resources that are accessed, on the -; local file system -; Valid values = on, off -cache_enabled = on - -; Size of the cache in megabytes -cache_size_MB = 300 - -; Time-to-live delay in seconds before already accessed remote resources are -; acessed again to check if they have been updated. -cache_ttl_sec = 86400 - -; Can be set to on so that by default the lack of a known resource files needed -; for the best transformation PROJ would normally use causes an error, or off -; to accept missing resource files without errors or warnings. -; This default value itself is overriden by the PROJ_ONLY_BEST_DEFAULT environment -; variable if set, and then by the ONLY_BEST setting that can be -; passed to the proj_create_crs_to_crs() method, or with the --only-best -; option of the cs2cs program. -; (added in PROJ 9.2) -; Valid values = on, off -only_best_default = off - -; Filename of the Certificate Authority (CA) bundle. -; Can be overriden with the PROJ_CURL_CA_BUNDLE / CURL_CA_BUNDLE environment variable. -; (added in PROJ 9.0) -; ca_bundle_path = /path/to/cabundle.pem - -; Transverse Mercator (and UTM) default algorithm: auto, evenden_snyder or poder_engsager -; * evenden_snyder is the fastest, but less accurate far from central meridian -; * poder_engsager is slower, but more accurate far from central meridian -; * default will auto-select between the two above depending on the coordinate -; to transform and will use evenden_snyder if the error in doing so is below -; 0.1 mm (for an ellipsoid of the size of Earth) -tmerc_default_algo = poder_engsager diff --git a/app/android/assets/qgis-data/proj/projjson.schema.json b/app/android/assets/qgis-data/proj/projjson.schema.json deleted file mode 100644 index a8578c81e..000000000 --- a/app/android/assets/qgis-data/proj/projjson.schema.json +++ /dev/null @@ -1,1174 +0,0 @@ -{ - "$id": "https://proj.org/schemas/v0.7/projjson.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "description": "Schema for PROJJSON (v0.7)", - "$comment": "This document is copyright Even Rouault and PROJ contributors, 2019-2023, and subject to the MIT license. This file exists both in data/ and in schemas/vXXX/. Keep both in sync. And if changing the value of $id, change PROJJSON_DEFAULT_VERSION accordingly in io.cpp", - - "oneOf": [ - { "$ref": "#/definitions/crs" }, - { "$ref": "#/definitions/datum" }, - { "$ref": "#/definitions/datum_ensemble" }, - { "$ref": "#/definitions/ellipsoid" }, - { "$ref": "#/definitions/prime_meridian" }, - { "$ref": "#/definitions/single_operation" }, - { "$ref": "#/definitions/concatenated_operation" }, - { "$ref": "#/definitions/coordinate_metadata" } - ], - - "definitions": { - - "abridged_transformation": { - "type": "object", - "properties": { - "$schema" : { "type": "string" }, - "type": { "type": "string", "enum": ["AbridgedTransformation"] }, - "name": { "type": "string" }, - "source_crs": { - "$ref": "#/definitions/crs", - "$comment": "Only present when the source_crs of the bound_crs does not match the source_crs of the AbridgedTransformation. No equivalent in WKT" - }, - "method": { "$ref": "#/definitions/method" }, - "parameters": { - "type": "array", - "items": { "$ref": "#/definitions/parameter_value" } - }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "required" : [ "name", "method", "parameters" ], - "allOf": [ - { "$ref": "#/definitions/id_ids_mutually_exclusive" } - ], - "additionalProperties": false - }, - - "axis": { - "type": "object", - "properties": { - "$schema" : { "type": "string" }, - "type": { "type": "string", "enum": ["Axis"] }, - "name": { "type": "string" }, - "abbreviation": { "type": "string" }, - "direction": { "type": "string", - "enum": [ "north", - "northNorthEast", - "northEast", - "eastNorthEast", - "east", - "eastSouthEast", - "southEast", - "southSouthEast", - "south", - "southSouthWest", - "southWest", - "westSouthWest", - "west", - "westNorthWest", - "northWest", - "northNorthWest", - "up", - "down", - "geocentricX", - "geocentricY", - "geocentricZ", - "columnPositive", - "columnNegative", - "rowPositive", - "rowNegative", - "displayRight", - "displayLeft", - "displayUp", - "displayDown", - "forward", - "aft", - "port", - "starboard", - "clockwise", - "counterClockwise", - "towards", - "awayFrom", - "future", - "past", - "unspecified" ] }, - "meridian": { "$ref": "#/definitions/meridian" }, - "unit": { "$ref": "#/definitions/unit" }, - "minimum_value": { "type": "number" }, - "maximum_value": { "type": "number" }, - "range_meaning": { "type": "string", "enum": [ "exact", "wraparound"] }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "required" : [ "name", "abbreviation", "direction" ], - "allOf": [ - { "$ref": "#/definitions/id_ids_mutually_exclusive" } - ], - "additionalProperties": false - }, - - "bbox": { - "type": "object", - "properties": { - "east_longitude": { "type": "number" }, - "west_longitude": { "type": "number" }, - "south_latitude": { "type": "number" }, - "north_latitude": { "type": "number" } - }, - "required" : [ "east_longitude", "west_longitude", - "south_latitude", "north_latitude" ], - "additionalProperties": false - }, - - "bound_crs": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "$schema" : { "type": "string" }, - "type": { "type": "string", "enum": ["BoundCRS"] }, - "name": { "type": "string" }, - "source_crs": { "$ref": "#/definitions/crs" }, - "target_crs": { "$ref": "#/definitions/crs" }, - "transformation": { "$ref": "#/definitions/abridged_transformation" }, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "source_crs", "target_crs", "transformation" ], - "additionalProperties": false - }, - - "compound_crs": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", "enum": ["CompoundCRS"] }, - "name": { "type": "string" }, - "components": { - "type": "array", - "items": { "$ref": "#/definitions/crs" } - }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "components" ], - "additionalProperties": false - }, - - "concatenated_operation": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", "enum": ["ConcatenatedOperation"] }, - "name": { "type": "string" }, - "source_crs": { "$ref": "#/definitions/crs" }, - "target_crs": { "$ref": "#/definitions/crs" }, - "steps": { - "type": "array", - "items": { "$ref": "#/definitions/single_operation" } - }, - "accuracy": { "type": "string" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "source_crs", "target_crs", "steps" ], - "additionalProperties": false - }, - - "conversion": { - "type": "object", - "properties": { - "$schema" : { "type": "string" }, - "type": { "type": "string", "enum": ["Conversion"] }, - "name": { "type": "string" }, - "method": { "$ref": "#/definitions/method" }, - "parameters": { - "type": "array", - "items": { "$ref": "#/definitions/parameter_value" } - }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "required" : [ "name", "method" ], - "allOf": [ - { "$ref": "#/definitions/id_ids_mutually_exclusive" } - ], - "additionalProperties": false - }, - - "coordinate_metadata": { - "type": "object", - "properties": { - "$schema" : { "type": "string" }, - "type": { "type": "string", "enum": ["CoordinateMetadata"] }, - "crs": { "$ref": "#/definitions/crs" }, - "coordinateEpoch": { "type": "number" } - }, - "required" : [ "crs" ], - "additionalProperties": false - }, - - "coordinate_system": { - "type": "object", - "properties": { - "$schema" : { "type": "string" }, - "type": { "type": "string", "enum": ["CoordinateSystem"] }, - "name": { "type": "string" }, - "subtype": { "type": "string", - "enum": ["Cartesian", - "spherical", - "ellipsoidal", - "vertical", - "ordinal", - "parametric", - "affine", - "TemporalDateTime", - "TemporalCount", - "TemporalMeasure"] }, - "axis": { - "type": "array", - "items": { "$ref": "#/definitions/axis" } - }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "required" : [ "subtype", "axis" ], - "allOf": [ - { "$ref": "#/definitions/id_ids_mutually_exclusive" } - ], - "additionalProperties": false - }, - - "crs": { - "oneOf": [ - { "$ref": "#/definitions/bound_crs" }, - { "$ref": "#/definitions/compound_crs" }, - { "$ref": "#/definitions/derived_engineering_crs" }, - { "$ref": "#/definitions/derived_geodetic_crs" }, - { "$ref": "#/definitions/derived_parametric_crs" }, - { "$ref": "#/definitions/derived_projected_crs" }, - { "$ref": "#/definitions/derived_temporal_crs" }, - { "$ref": "#/definitions/derived_vertical_crs" }, - { "$ref": "#/definitions/engineering_crs" }, - { "$ref": "#/definitions/geodetic_crs" }, - { "$ref": "#/definitions/parametric_crs" }, - { "$ref": "#/definitions/projected_crs" }, - { "$ref": "#/definitions/temporal_crs" }, - { "$ref": "#/definitions/vertical_crs" } - ] - }, - - "datum": { - "oneOf": [ - { "$ref": "#/definitions/geodetic_reference_frame" }, - { "$ref": "#/definitions/vertical_reference_frame" }, - { "$ref": "#/definitions/dynamic_geodetic_reference_frame" }, - { "$ref": "#/definitions/dynamic_vertical_reference_frame" }, - { "$ref": "#/definitions/temporal_datum" }, - { "$ref": "#/definitions/parametric_datum" }, - { "$ref": "#/definitions/engineering_datum" } - ] - }, - - "datum_ensemble": { - "type": "object", - "properties": { - "$schema" : { "type": "string" }, - "type": { "type": "string", "enum": ["DatumEnsemble"] }, - "name": { "type": "string" }, - "members": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { "type": "string" }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "required" : [ "name" ], - "allOf": [ - { "$ref": "#/definitions/id_ids_mutually_exclusive" } - ], - "additionalProperties": false - } - }, - "ellipsoid": { "$ref": "#/definitions/ellipsoid" }, - "accuracy": { "type": "string" }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "required" : [ "name", "members", "accuracy" ], - "allOf": [ - { "$ref": "#/definitions/id_ids_mutually_exclusive" } - ], - "additionalProperties": false - }, - - "deformation_model": { - "description": "Association to a PointMotionOperation", - "type": "object", - "properties": { - "name": { "type": "string" }, - "id": { "$ref": "#/definitions/id" } - }, - "required" : [ "name" ], - "additionalProperties": false - }, - - "derived_engineering_crs": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", - "enum": ["DerivedEngineeringCRS"] }, - "name": { "type": "string" }, - "base_crs": { "$ref": "#/definitions/engineering_crs" }, - "conversion": { "$ref": "#/definitions/conversion" }, - "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "base_crs", "conversion", "coordinate_system" ], - "additionalProperties": false - }, - - "derived_geodetic_crs": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", - "enum": ["DerivedGeodeticCRS", - "DerivedGeographicCRS"] }, - "name": { "type": "string" }, - "base_crs": { "$ref": "#/definitions/geodetic_crs" }, - "conversion": { "$ref": "#/definitions/conversion" }, - "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "base_crs", "conversion", "coordinate_system" ], - "additionalProperties": false - }, - - "derived_parametric_crs": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", - "enum": ["DerivedParametricCRS"] }, - "name": { "type": "string" }, - "base_crs": { "$ref": "#/definitions/parametric_crs" }, - "conversion": { "$ref": "#/definitions/conversion" }, - "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "base_crs", "conversion", "coordinate_system" ], - "additionalProperties": false - }, - - "derived_projected_crs": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", - "enum": ["DerivedProjectedCRS"] }, - "name": { "type": "string" }, - "base_crs": { "$ref": "#/definitions/projected_crs" }, - "conversion": { "$ref": "#/definitions/conversion" }, - "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "base_crs", "conversion", "coordinate_system" ], - "additionalProperties": false - }, - - "derived_temporal_crs": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", - "enum": ["DerivedTemporalCRS"] }, - "name": { "type": "string" }, - "base_crs": { "$ref": "#/definitions/temporal_crs" }, - "conversion": { "$ref": "#/definitions/conversion" }, - "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "base_crs", "conversion", "coordinate_system" ], - "additionalProperties": false - }, - - "derived_vertical_crs": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", - "enum": ["DerivedVerticalCRS"] }, - "name": { "type": "string" }, - "base_crs": { "$ref": "#/definitions/vertical_crs" }, - "conversion": { "$ref": "#/definitions/conversion" }, - "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "base_crs", "conversion", "coordinate_system" ], - "additionalProperties": false - }, - - "dynamic_geodetic_reference_frame": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", "enum": ["DynamicGeodeticReferenceFrame"] }, - "name": {}, - "anchor": {}, - "anchor_epoch": {}, - "ellipsoid": {}, - "prime_meridian": {}, - "frame_reference_epoch": { "type": "number" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "ellipsoid", "frame_reference_epoch" ], - "additionalProperties": false - }, - - "dynamic_vertical_reference_frame": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", "enum": ["DynamicVerticalReferenceFrame"] }, - "name": {}, - "anchor": {}, - "anchor_epoch": {}, - "frame_reference_epoch": { "type": "number" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "frame_reference_epoch" ], - "additionalProperties": false - }, - - "ellipsoid": { - "type": "object", - "oneOf":[ - { - "properties": { - "$schema" : { "type": "string" }, - "type": { "type": "string", "enum": ["Ellipsoid"] }, - "name": { "type": "string" }, - "semi_major_axis": { "$ref": "#/definitions/value_in_metre_or_value_and_unit" }, - "semi_minor_axis": { "$ref": "#/definitions/value_in_metre_or_value_and_unit" }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "required" : [ "name", "semi_major_axis", "semi_minor_axis" ], - "additionalProperties": false - }, - { - "properties": { - "$schema" : { "type": "string" }, - "type": { "type": "string", "enum": ["Ellipsoid"] }, - "name": { "type": "string" }, - "semi_major_axis": { "$ref": "#/definitions/value_in_metre_or_value_and_unit" }, - "inverse_flattening": { "type": "number" }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "required" : [ "name", "semi_major_axis", "inverse_flattening" ], - "additionalProperties": false - }, - { - "properties": { - "$schema" : { "type": "string" }, - "type": { "type": "string", "enum": ["Ellipsoid"] }, - "name": { "type": "string" }, - "radius": { "$ref": "#/definitions/value_in_metre_or_value_and_unit" }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "required" : [ "name", "radius" ], - "additionalProperties": false - } - ], - "allOf": [ - { "$ref": "#/definitions/id_ids_mutually_exclusive" } - ] - }, - - "engineering_crs": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", "enum": ["EngineeringCRS"] }, - "name": { "type": "string" }, - "datum": { "$ref": "#/definitions/engineering_datum" }, - "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "datum" ], - "additionalProperties": false - }, - - "engineering_datum": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", "enum": ["EngineeringDatum"] }, - "name": { "type": "string" }, - "anchor": { "type": "string" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name" ], - "additionalProperties": false - }, - - "geodetic_crs": { - "type": "object", - "properties": { - "type": { "type": "string", "enum": ["GeodeticCRS", "GeographicCRS"] }, - "name": { "type": "string" }, - "datum": { - "oneOf": [ - { "$ref": "#/definitions/geodetic_reference_frame" }, - { "$ref": "#/definitions/dynamic_geodetic_reference_frame" } - ] - }, - "datum_ensemble": { "$ref": "#/definitions/datum_ensemble" }, - "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, - "deformation_models": { - "type": "array", - "items": { "$ref": "#/definitions/deformation_model" } - }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name" ], - "description": "One and only one of datum and datum_ensemble must be provided", - "allOf": [ - { "$ref": "#/definitions/object_usage" }, - { "$ref": "#/definitions/one_and_only_one_of_datum_or_datum_ensemble" } - ], - "additionalProperties": false - }, - - "geodetic_reference_frame": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", "enum": ["GeodeticReferenceFrame"] }, - "name": { "type": "string" }, - "anchor": { "type": "string" }, - "anchor_epoch": { "type": "number" }, - "ellipsoid": { "$ref": "#/definitions/ellipsoid" }, - "prime_meridian": { "$ref": "#/definitions/prime_meridian" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "ellipsoid" ], - "additionalProperties": false - }, - - "geoid_model": { - "type": "object", - "properties": { - "name": { "type": "string" }, - "interpolation_crs": { "$ref": "#/definitions/crs" }, - "id": { "$ref": "#/definitions/id" } - }, - "required" : [ "name" ], - "additionalProperties": false - }, - - "id": { - "type": "object", - "properties": { - "authority": { "type": "string" }, - "code": { - "oneOf": [ { "type": "string" }, { "type": "integer" } ] - }, - "version": { - "oneOf": [ { "type": "string" }, { "type": "number" } ] - }, - "authority_citation": { "type": "string" }, - "uri": { "type": "string" } - }, - "required" : [ "authority", "code" ], - "additionalProperties": false - }, - - "ids": { - "type": "array", - "items": { "$ref": "#/definitions/id" } - }, - - "method": { - "type": "object", - "properties": { - "$schema" : { "type": "string" }, - "type": { "type": "string", "enum": ["OperationMethod"]}, - "name": { "type": "string" }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "required" : [ "name" ], - "allOf": [ - { "$ref": "#/definitions/id_ids_mutually_exclusive" } - ], - "additionalProperties": false - }, - - "id_ids_mutually_exclusive": { - "not": { - "type": "object", - "required": [ "id", "ids" ] - } - }, - - "one_and_only_one_of_datum_or_datum_ensemble": { - "allOf": [ - { - "not": { - "type": "object", - "required": [ "datum", "datum_ensemble" ] - } - }, - { - "oneOf": [ - { "type": "object", "required": ["datum"] }, - { "type": "object", "required": ["datum_ensemble"] } - ] - } - ] - }, - - "meridian": { - "type": "object", - "properties": { - "$schema" : { "type": "string" }, - "type": { "type": "string", "enum": ["Meridian"] }, - "longitude": { "$ref": "#/definitions/value_in_degree_or_value_and_unit" }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "required" : [ "longitude" ], - "allOf": [ - { "$ref": "#/definitions/id_ids_mutually_exclusive" } - ], - "additionalProperties": false - }, - - "object_usage": { - "anyOf": [ - { - "type": "object", - "properties": { - "$schema" : { "type": "string" }, - "scope": { "type": "string" }, - "area": { "type": "string" }, - "bbox": { "$ref": "#/definitions/bbox" }, - "vertical_extent": { "$ref": "#/definitions/vertical_extent" }, - "temporal_extent": { "$ref": "#/definitions/temporal_extent" }, - "remarks": { "type": "string" }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "allOf": [ - { "$ref": "#/definitions/id_ids_mutually_exclusive" } - ] - }, - { - "type": "object", - "properties": { - "$schema" : { "type": "string" }, - "usages": { "$ref": "#/definitions/usages" }, - "remarks": { "type": "string" }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "allOf": [ - { "$ref": "#/definitions/id_ids_mutually_exclusive" } - ] - } - ] - }, - - "parameter_value": { - "type": "object", - "properties": { - "$schema" : { "type": "string" }, - "type": { "type": "string", "enum": ["ParameterValue"] }, - "name": { "type": "string" }, - "value": { - "oneOf": [ - { "type": "string" }, - { "type": "number" } - ] - }, - "unit": { "$ref": "#/definitions/unit" }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "required" : [ "name", "value" ], - "allOf": [ - { "$ref": "#/definitions/id_ids_mutually_exclusive" } - ], - "additionalProperties": false - }, - - "parametric_crs": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", "enum": ["ParametricCRS"] }, - "name": { "type": "string" }, - "datum": { "$ref": "#/definitions/parametric_datum" }, - "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "datum" ], - "additionalProperties": false - }, - - "parametric_datum": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", "enum": ["ParametricDatum"] }, - "name": { "type": "string" }, - "anchor": { "type": "string" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name" ], - "additionalProperties": false - }, - - "point_motion_operation": { - "$comment": "Not implemented in PROJ (at least as of PROJ 9.1)", - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", "enum": ["PointMotionOperation"] }, - "name": { "type": "string" }, - "source_crs": { "$ref": "#/definitions/crs" }, - "method": { "$ref": "#/definitions/method" }, - "parameters": { - "type": "array", - "items": { "$ref": "#/definitions/parameter_value" } - }, - "accuracy": { "type": "string" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "source_crs", "method", "parameters" ], - "additionalProperties": false - }, - - "prime_meridian": { - "type": "object", - "properties": { - "$schema" : { "type": "string" }, - "type": { "type": "string", "enum": ["PrimeMeridian"] }, - "name": { "type": "string" }, - "longitude": { "$ref": "#/definitions/value_in_degree_or_value_and_unit" }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "required" : [ "name" ], - "allOf": [ - { "$ref": "#/definitions/id_ids_mutually_exclusive" } - ], - "additionalProperties": false - }, - - "single_operation": { - "oneOf": [ - { "$ref": "#/definitions/conversion" }, - { "$ref": "#/definitions/transformation" }, - { "$ref": "#/definitions/point_motion_operation" } - ] - }, - - "projected_crs": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", - "enum": ["ProjectedCRS"] }, - "name": { "type": "string" }, - "base_crs": { "$ref": "#/definitions/geodetic_crs" }, - "conversion": { "$ref": "#/definitions/conversion" }, - "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "base_crs", "conversion", "coordinate_system" ], - "additionalProperties": false - }, - - "temporal_crs": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", "enum": ["TemporalCRS"] }, - "name": { "type": "string" }, - "datum": { "$ref": "#/definitions/temporal_datum" }, - "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "datum" ], - "additionalProperties": false - }, - - "temporal_datum": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", "enum": ["TemporalDatum"] }, - "name": { "type": "string" }, - "calendar": { "type": "string" }, - "time_origin": { "type": "string" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "calendar" ], - "additionalProperties": false - }, - - "temporal_extent": { - "type": "object", - "properties": { - "start": { "type": "string" }, - "end": { "type": "string" } - }, - "required" : [ "start", "end" ], - "additionalProperties": false - }, - - "transformation": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", "enum": ["Transformation"] }, - "name": { "type": "string" }, - "source_crs": { "$ref": "#/definitions/crs" }, - "target_crs": { "$ref": "#/definitions/crs" }, - "interpolation_crs": { "$ref": "#/definitions/crs" }, - "method": { "$ref": "#/definitions/method" }, - "parameters": { - "type": "array", - "items": { "$ref": "#/definitions/parameter_value" } - }, - "accuracy": { "type": "string" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name", "source_crs", "target_crs", "method", "parameters" ], - "additionalProperties": false - }, - - "unit": { - "oneOf": [ - { - "type": "string", - "enum": ["metre", "degree", "unity"] - }, - { - "type": "object", - "properties": { - "type": { "type": "string", - "enum": ["LinearUnit", "AngularUnit", "ScaleUnit", - "TimeUnit", "ParametricUnit", "Unit"] }, - "name": { "type": "string" }, - "conversion_factor": { "type": "number" }, - "id": { "$ref": "#/definitions/id" }, - "ids": { "$ref": "#/definitions/ids" } - }, - "required" : [ "type", "name" ], - "allOf": [ - { "$ref": "#/definitions/id_ids_mutually_exclusive" } - ], - "additionalProperties": false - } - ] - }, - - "usages": { - "type": "array", - "items": { - "type": "object", - "properties": { - "scope": { "type": "string" }, - "area": { "type": "string" }, - "bbox": { "$ref": "#/definitions/bbox" }, - "vertical_extent": { "$ref": "#/definitions/vertical_extent" }, - "temporal_extent": { "$ref": "#/definitions/temporal_extent" } - }, - "additionalProperties": false - } - }, - - "value_and_unit": { - "type": "object", - "properties": { - "value": { "type": "number" }, - "unit": { "$ref": "#/definitions/unit" } - }, - "required" : [ "value", "unit" ], - "additionalProperties": false - }, - - "value_in_degree_or_value_and_unit": { - "oneOf": [ - { "type": "number" }, - { "$ref": "#/definitions/value_and_unit" } - ] - }, - - "value_in_metre_or_value_and_unit": { - "oneOf": [ - { "type": "number" }, - { "$ref": "#/definitions/value_and_unit" } - ] - }, - - "vertical_crs": { - "type": "object", - "properties": { - "type": { "type": "string", "enum": ["VerticalCRS"] }, - "name": { "type": "string" }, - "datum": { - "oneOf": [ - { "$ref": "#/definitions/vertical_reference_frame" }, - { "$ref": "#/definitions/dynamic_vertical_reference_frame" } - ] - }, - "datum_ensemble": { "$ref": "#/definitions/datum_ensemble" }, - "coordinate_system": { "$ref": "#/definitions/coordinate_system" }, - "geoid_model": { "$ref": "#/definitions/geoid_model" }, - "geoid_models": { - "type": "array", - "items": { "$ref": "#/definitions/geoid_model" } - }, - "deformation_models": { - "type": "array", - "items": { "$ref": "#/definitions/deformation_model" } - }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name"], - "description": "One and only one of datum and datum_ensemble must be provided", - "allOf": [ - { "$ref": "#/definitions/object_usage" }, - { "$ref": "#/definitions/one_and_only_one_of_datum_or_datum_ensemble" }, - { - "not": { - "type": "object", - "required": [ "geoid_model", "geoid_models" ] - } - } - ], - "additionalProperties": false - }, - - "vertical_extent": { - "type": "object", - "properties": { - "minimum": { "type": "number" }, - "maximum": { "type": "number" }, - "unit": { "$ref": "#/definitions/unit" } - }, - "required" : [ "minimum", "maximum" ], - "additionalProperties": false - }, - - "vertical_reference_frame": { - "type": "object", - "allOf": [{ "$ref": "#/definitions/object_usage" }], - "properties": { - "type": { "type": "string", "enum": ["VerticalReferenceFrame"] }, - "name": { "type": "string" }, - "anchor": { "type": "string" }, - "anchor_epoch": { "type": "number" }, - "$schema" : {}, - "scope": {}, - "area": {}, - "bbox": {}, - "vertical_extent": {}, - "temporal_extent": {}, - "usages": {}, - "remarks": {}, - "id": {}, "ids": {} - }, - "required" : [ "name" ], - "additionalProperties": false - } - - } -} diff --git a/app/android/assets/qgis-data/proj/triangulation.schema.json b/app/android/assets/qgis-data/proj/triangulation.schema.json deleted file mode 100644 index 8203f5d91..000000000 --- a/app/android/assets/qgis-data/proj/triangulation.schema.json +++ /dev/null @@ -1,214 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "description": "Schema for triangulation based transformation", - "type": "object", - "properties": { - "file_type": { - "type": "string", - "enum": [ - "triangulation_file" - ], - "description": "File type. Always \"triangulation_file\"" - }, - "format_version": { - "type": "string", - "enum": [ - "1.0", "1.1" - ] - }, - "name": { - "type": "string", - "description": "A brief descriptive name of the triangulation" - }, - "version": { - "type": "string", - "description": "A string identifying the version of the triangulation. The format for specifying version will be defined by the agency responsible for the triangulation" - }, - "publication_date": { - "$ref": "#/definitions/datetime", - "description": "The date on which this version of the triangulation was published (or possibly the date on which it takes effect?)" - }, - "fallback_strategy": { - "type": "string", - "enum": [ - "none", - "nearest_side", - "nearest_centroid" - ] - }, - "license": { - "type": "string", - "description": "License under which the file is published" - }, - "description": { - "type": "string", - "description": "A text description of the file" - }, - "authority": { - "type": "object", - "description": "Basic information about the agency responsible for the data set", - "properties": { - "name": { - "type": "string", - "description": "The name of the agency" - }, - "url": { - "type": "string", - "description": "The url of the agency website", - "format": "uri" - }, - "address": { - "type": "string", - "description": "The postal address of the agency" - }, - "email": { - "type": "string", - "description": "An email contact address for the agency", - "format": "email" - } - }, - "required": [ - "name" - ], - "additionalProperties": false - }, - "links": { - "type": "array", - "description": "Links to related information", - "items": { - "type": "object", - "properties": { - "href": { - "type": "string", - "description": "The URL holding the information", - "format": "uri" - }, - "rel": { - "type": "string", - "description": "The relationship to the dataset. Proposed relationships are:\n- \"about\": a web page for human consumption describing the model\n- \"source\": the authoritative source data from which the triangulation is built.\n- \"metadata\": ISO 19115 XML metadata regarding the triangulation." - }, - "type": { - "type": "string", - "description": "MIME type" - }, - "title": { - "type": "string", - "description": "Description of the link" - } - }, - "required": [ - "href" - ], - "additionalProperties": false - } - }, - "extent": { - "$ref": "#/definitions/extent", - "description": "Defines the region within which the triangulation is defined. This should be a bounding box defined as an array of [west,south,east,north] coordinate values in a unspecified geographic CRS. This bounding box should be seen as approximate, given that triangulation may be defined with projected coordinates, and also because some triangulations may not cover the whole bounding box." - }, - "input_crs": { - "$ref": "#/definitions/crs", - "description": "String identifying the CRS of source coordinates in the vertices. Typically \"EPSG:XXXX\". If the transformation is for vertical component, this should be the code for a compound CRS (can be EPSG:XXXX+YYYY where XXXX is the code of the horizontal CRS and YYYY the code of the vertical CRS). For example, for the KKJ->ETRS89 transformation, this is EPSG:2393 (\"KKJ / Finland Uniform Coordinate System\"). The input coordinates are assumed to be passed in the \"normalized for visualisation\" / \"GIS friendly\" order, that is longitude, latitude for geographic coordinates and easting, northing for projected coordinates." - }, - "output_crs": { - "$ref": "#/definitions/crs", - "description": "String identifying the CRS of target coordinates in the vertices. Typically \"EPSG:XXXX\". If the transformation is for vertical component, this should be the code for a compound CRS (can be EPSG:XXXX+YYYY where XXXX is the code of the horizontal CRS and YYYY the code of the vertical CRS). For example, for the KKJ->ETRS89 transformation, this is EPSG:3067 (\"ETRS89 / TM35FIN(E,N)\"). The output coordinates will be returned in the \"normalized for visualisation\" / \"GIS friendly\" order, that is easting, that is longitude, latitude for geographic coordinates and easting, northing for projected coordinates." - }, - "transformed_components": { - "type": "array", - "description": "Specify which component of the coordinates are transformed. Either \"horizontal\", \"vertical\" or both", - "minItems": 1, - "maxItems": 2, - "items": { - "type": "string", - "enum": [ - "horizontal", - "vertical" - ] - } - }, - "vertices_columns": { - "type": "array", - "description": "Specify the name of the columns of the rows in the \"vertices\" array. There must be exactly as many elements in \"vertices_columns\" as in a row of \"vertices\". The following names have a special meaning: \"source_x\", \"source_y\", \"target_x\", \"target_y\", \"source_z\", \"target_z\" and \"offset_z\". \"source_x\" and \"source_y\" are compulsory. \"source_x\" is for the source longitude (in degree) or easting. \"source_y\" is for the source latitude (in degree) or northing. \"target_x\" and \"target_y\" are compulsory when \"horizontal\" is specified in \"transformed_components\". (\"source_z\" and \"target_z\") or \"offset_z\" are compulsory when \"vertical\" is specified in \"transformed_components\".", - "minItems": 3, - "items": { - "type": "string" - } - }, - "triangles_columns": { - "type": "array", - "description": "Specify the name of the columns of the rows in the \"triangles\" array. There must be exactly as many elements in \"triangles_columns\" as in a row of \"triangles\". The following names have a special meaning: \"idx_vertex1\", \"idx_vertex2\", \"idx_vertex3\". They are compulsory.", - "minItems": 3, - "items": { - "type": "string" - } - }, - "vertices": { - "type": "array", - "description": "an array whose items are themselves arrays with as many columns as described in \"vertices_columns\"", - "items": { - "type": "array" - } - }, - "triangles": { - "type": "array", - "description": "an array whose items are themselves arrays with as many columns as described in \"triangles_columns\". The value of the \"idx_vertexN\" columns must be indices (between 0 and len(\"vertices\"-1) of items of the \"vertices\" array", - "items": { - "type": "array" - } - } - }, - "required": [ - "file_type", - "format_version", - "transformed_components", - "vertices_columns", - "triangles_columns", - "vertices", - "triangles" - ], - "additionalProperties": false, - "definitions": { - "crs": { - "type": "string" - }, - "datetime": { - "type": "string", - "format": "date-time", - "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$" - }, - "extent": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "bbox" - ] - }, - "name" : { - "type": "string", - "description": "Name of the extent (e.g. \"Finland - mainland south of 66°N\")" - }, - "parameters": { - "type": "object", - "properties": { - "bbox": { - "type": "array", - "minItems": 4, - "maxItems": 4, - "items": { - "type": "number" - } - } - } - } - }, - "required": [ - "type", - "parameters" - ], - "additionalProperties": false - } - } -} diff --git a/app/android/assets/qgis-data/proj/world b/app/android/assets/qgis-data/proj/world deleted file mode 100644 index 9119eed8c..000000000 --- a/app/android/assets/qgis-data/proj/world +++ /dev/null @@ -1,214 +0,0 @@ -# SCCSID @(#)world 1.2 95/08/05 GIE REL -# proj +init files for various non-U.S. coordinate systems. -# - +lastupdate=2016-12-12 - - # Swiss Coordinate System - +proj=somerc +lat_0=46d57'8.660"N +lon_0=7d26'22.500"E - +ellps=bessel +x_0=600000 +y_0=200000 - +k_0=1. no_defs <> - # Laborde grid for Madagascar - proj=labrd ellps=intl lon_0=46d26'13.95E lat_0=18d54S - azi=18d54 k_0=.9995 x_0=400000 y_0=800000 - no_defs <> - # New Zealand Map Grid (NZMG) - proj=nzmg # Projection unique to N.Z. so all factors fixed - no_defs <> -# Secondary grids DMA TM8358.1, p. 4.3 - # British West Indies - proj=tmerc ellps=clrk80 lon_0=62W - x_0=400000 k_0=0.9995 - no_defs <> - # Costa Rica Norte - proj=lcc ellps=clrk66 lat_1=10d28N lon_0=84d20W - x_0=500000 y_0=217820.522 k_0=0.99995696 - no_defs <> - # Costa Rica Sud - proj=lcc ellps=clrk66 lat_1=9dN lon_0=83d40W - x_0=500000 y_0=327987.436 k_0=0.99995696 - no_defs <> - # Cuba Norte - proj=lcc ellps=clrk66 lat_1=22d21N lon_0=81dW - x_0=500000 y_0=280296.016 k_0=0.99993602 - no_defs <> - # Cuba Sud - proj=lcc ellps=clrk66 lat_1=20d43'N lon_0=76d50'W - x_0=500000 y_0=229126.939 k_0=0.99994848 - no_defs <> - # Dominican Republic - proj=lcc ellps=clrk66 lat_1=18d49'N lon_0=71d30'W - x_0=500000 y_0=277063.657 k_0=0.99991102 - no_defs <> - # Egypt - proj=tmerc ellps=intl lon_0=25d30'E x_0=300000 k_0=0.99985 - no_defs <> - # Egypt - proj=tmerc ellps=intl lon_0=28d30'E x_0=300000 k_0=0.99985 - no_defs <> - # Egypt - proj=tmerc ellps=intl lon_0=31d30'E x_0=300000 k_0=0.99985 - no_defs <> - # Egypt - proj=tmerc ellps=intl lon_0=34d30'E x_0=300000 k_0=0.99985 - no_defs <> - # Egypt - proj=tmerc ellps=intl lon_0=37d30'E x_0=300000 k_0=0.99985 - no_defs <> - # El Salvador - proj=lcc ellps=clrk66 lat_1=13d47'N lon_0=89dW - x_0=500000 y_0=295809.184 k_0=0.99996704 - no_defs <> - # Guatemala Norte - proj=lcc ellps=clrk66 lat_1=16d49'N lon_0=90d20'W - x_0=500000 y_0=292209.579 k_0=0.99992226 - no_defs <> - # Guatemala Sud - proj=lcc ellps=clrk66 lat_1=14d54'N lon_0=90d20'W - x_0=500000 y_0=325992.681 k_0=0.99989906 - no_defs <> - # Haiti - proj=lcc ellps=clrk66 lat_1=18d49'N lon_0=71d30'W - x_0=500000 y_0=277063.657 k_0=0.99991102 - no_defs <> - # Honduras Norte - proj=lcc ellps=clrk66 lat_1=15d30'N lon_0=86d10'W - x_0=500000 y_0=296917.439 k_0=0.99993273 - no_defs <> - # Honduras Sud - proj=lcc ellps=clrk66 lat_1=13d47'N lon_0=87d10'W - x_0=500000 y_0=296215.903 k_0=0.99995140 - no_defs <> - # Levant - proj=lcc ellps=clrk66 lat_1=34d39'N lon_0=37d21'E - x_0=500000 y_0=300000 k_0=0.9996256 - no_defs <> - # Nicaragua Norte - proj=lcc ellps=clrk66 lat_1=13d52'N lon_0=85d30'W - x_0=500000 y_0=359891.816 k_0=0.99990314 - no_defs <> - # Nicaragua Sud - proj=lcc ellps=clrk66 lat_1=11d40'N lon_0=85d30'W - x_0=500000 y_0=288876.327 k_0=0.99992228 - no_defs <> - # Northwest Africa - proj=lcc ellps=clrk80 lat_1=34dN lon_0=0dE - x_0=1000000 y_0=500000 k_0=0.99908 - no_defs <> - # Palestine - proj=tmerc a=6378300.79 rf=293.488307656 - lat_0=31d44'2.749"N lon_0=35d12'43.490"E - x_0=170251.555 y_0=126867.909 k_0=1 - no_defs <> - # Panama - proj=lcc ellps=clrk66 lat_1=8d25'N lon_0=80dW - x_0=500000 y_0=294865.303 k_0=0.99989909 - no_defs <> -# other grids in DMA TM8358.1 - # British National Grid - proj=tmerc ellps=airy lat_0=49dN lon_0=2dW - k_0=0.9996012717 x_0=400000 y_0=-100000 - no_defs <> - # West Malaysian RSO Grid - proj=omerc a=6377295.66402 rf=300.8017 alpha=323d01'32.846" - no_uoff rot_conv lonc=102d15E lat_0=4dN k_0=0.99984 x_0=804670.240 y_0=0 - no_defs <> - # India Zone I - proj=lcc ellps=everest lon_0=68E lat_1=32d30'N - x_0=2743185.69 y_0=914395.23 k_0=.998786408 - no_defs <> - # India Zone IIA - proj=lcc ellps=everest lon_0=74E lat_1=26N - x_0=2743185.69 y_0=914395.23 k_0=.998786408 - no_defs <> - # India Zone IIB - proj=lcc ellps=everest lon_0=90E lat_1=26N - x_0=2743185.69 y_0=914395.23 k_0=.998786408 - no_defs <> - # India Zone IIIA - proj=lcc ellps=everest lon_0=80E lat_1=19N - x_0=2743185.69 y_0=914395.23 k_0=.998786408 - no_defs <> - # India Zone IIIB - proj=lcc ellps=everest lon_0=100E lat_1=19N - x_0=2743185.69 y_0=914395.23 k_0=.998786408 - no_defs <> - # India Zone IVA - proj=lcc ellps=everest lon_0=80E lat_1=12N - x_0=2743185.69 y_0=914395.23 k_0=.998786408 - no_defs <> - # India Zone IVB - proj=lcc ellps=everest lon_0=104E lat_1=12N - x_0=2743185.69 y_0=914395.23 k_0=.998786408 - no_defs <> - # Ceylon Belt - proj=tmerc ellps=everest lon_0=80d46'18.160"E lat_0=7d0'1.729"N - x_0=160933.56048 y_0=160933.56048 k_0=1. - no_defs <> - # Irish Transverse Mercator Grid - proj=tmerc ellps=mod_airy lat_0=53d30'N lon_0=8W - x_0=200000 y_0=250000 k_0=1.000035 - no_defs <> - # Netherlands East Indies Equatorial Zone - proj=merc ellps=bessel lon_0=110E - x_0=3900000 y_0=900000 k_0=0.997 - no_defs <> - # Nord Algerie Grid - proj=lcc ellps=clrk80 lon_0=2d42E lat_0=36N - x_0=500000 y_0=300000 k_0=0.999625544 - no_defs <> - # Nord Maroc Grid - proj=lcc ellps=clrk80 lon_0=5d24'W lat_0=33d18'N - x_0=500000 y_0=300000 k_0=0.999625769 - no_defs <> - # Nord Tunisie Grid - proj=lcc ellps=clrk80 lon_0=9d54E lat_0=36N - x_0=500000 y_0=300000 k_0=0.999625544 - no_defs <> - # Sud Algerie Grid - proj=lcc ellps=clrk80 lon_0=2d42E lat_0=33d18'N - x_0=500000 y_0=300000 k_0=0.999625769 - no_defs <> - # Sud Maroc Grid - proj=lcc ellps=clrk80 lon_0=5d24W lat_0=29d42'N - x_0=500000 y_0=300000 k_0=0.999615596 - no_defs <> - # Sud Tunisie Grid - proj=lcc ellps=clrk80 lon_0=9d54'E lat_0=33d18'N - x_0=500000 y_0=300000 k_0=0.999625769 - no_defs <> -# Gauss Krueger Grid for Germany -# -# The first figure of the easting is lon_0 divided by 3 -# ( 2 for 6d0E, 3 for 9d0E, 4 for 12d0E) -# For translations you have to remove this first figure -# and convert northings and eastings from km to meter . -# The other way round, divide by 1000 and add the figure. -# I made 3 entries for the officially used grids in Germany -# -# -# Und nochmal in deutsch : -# Die erste Ziffer des Rechtswerts beschreibt den Hauptmeridian -# und ist dessen Gradzahl geteilt durch 3. -# Zum Umrechnen in Grad muss daher die erste Ziffer des Rechtswertes -# entfernt werden und evt. von km auf Metern umgerechnet werden. -# Zur Umrechnung in Gauss Krueger Koordinaten entsprechend die -# Ziffer fuer den Hauptmeridian vor dem Rechtswert ergaenzen. -# Ich hab fuer alle drei in Deutschland ueblichen Hauptmeridiane -# jeweils einen Eintrag ergaenzt. -# -# -# added by Michael Goepel -# - # Gauss Krueger Grid for Germany - proj=tmerc ellps=bessel lon_0=6d0E lat_0=0 - x_0=500000 - no_defs<> - # Gauss Krueger Grid for Germany - proj=tmerc ellps=bessel lon_0=9d0E lat_0=0 - x_0=500000 - no_defs<> - # Gauss Krueger Grid for Germany - proj=tmerc ellps=bessel lon_0=12d0E lat_0=0 - x_0=500000 - no_defs<> - diff --git a/app/android/assets/qgis-data/resources/qgis.db b/app/android/assets/qgis-data/resources/qgis.db deleted file mode 100644 index b6edd8912..000000000 Binary files a/app/android/assets/qgis-data/resources/qgis.db and /dev/null differ diff --git a/app/android/assets/qgis-data/resources/srs.db b/app/android/assets/qgis-data/resources/srs.db deleted file mode 100644 index 6b8193b77..000000000 Binary files a/app/android/assets/qgis-data/resources/srs.db and /dev/null differ diff --git a/app/android/src/uk/co/lutraconsulting/InputActivity.java b/app/android/src/uk/co/lutraconsulting/MMActivity.java similarity index 89% rename from app/android/src/uk/co/lutraconsulting/InputActivity.java rename to app/android/src/uk/co/lutraconsulting/MMActivity.java index a6c4224ab..9a25b7d1e 100644 --- a/app/android/src/uk/co/lutraconsulting/InputActivity.java +++ b/app/android/src/uk/co/lutraconsulting/MMActivity.java @@ -50,9 +50,9 @@ import androidx.core.view.WindowCompat; import androidx.core.splashscreen.SplashScreen; -public class InputActivity extends QtActivity +public class MMActivity extends QtActivity { - private static final String TAG = "Mergin Maps Input Activity"; + private static final String TAG = "Mergin Maps Activity"; private static final int MEDIA_CODE = 101; private boolean keepSplashScreenVisible = true; private String localTargetPath = null; @@ -83,20 +83,23 @@ void setCustomStatusAndNavBar() if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { Log.d( TAG, "Unsupported Android version for painting behind system bars." ); return; - } + } else { WindowCompat.setDecorFitsSystemWindows(getWindow(), false); Window window = getWindow(); - // draw app edge-to-edge - window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); - - // make the status bar background color transparent - window.setStatusBarColor(Color.TRANSPARENT); - - // make the navigation button background color transparent - window.setNavigationBarColor(Color.TRANSPARENT); + // on Android 15+ all apps are edge-to-edge + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) { + // draw app edge-to-edge + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + + // make the status bar background color transparent + window.setStatusBarColor(Color.TRANSPARENT); + + // make the navigation button background color transparent + window.setNavigationBarColor(Color.TRANSPARENT); + } // do not show background dim for the navigation buttons window.setNavigationBarContrastEnforced(false); @@ -287,19 +290,23 @@ public void vibrate() vib = vibManager.getDefaultVibrator(); } + // The reason why we use duplicate calls to vibrate is because some manufacturers (samsung) don't support + // the usage of predefined VibrationEffect and vice versa. In the end only one vibration gets executed. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { - vib.vibrate(VibrationEffect.createOneShot(10, VibrationEffect.DEFAULT_AMPLITUDE)); + vib.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE)); } else { vib.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK)); + vib.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE)); } } else { vib.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK), VibrationAttributes.createForUsage(VibrationAttributes.USAGE_CLASS_FEEDBACK)); + vib.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE)); } } diff --git a/app/android/src/uk/co/lutraconsulting/PositionTrackingService.java b/app/android/src/uk/co/lutraconsulting/PositionTrackingService.java index dc38a3cb8..a20e9f8fb 100644 --- a/app/android/src/uk/co/lutraconsulting/PositionTrackingService.java +++ b/app/android/src/uk/co/lutraconsulting/PositionTrackingService.java @@ -151,7 +151,7 @@ public int onStartCommand( Intent intent, int flags, int startId ) { manager.createNotificationChannel( serviceChannel ); // Build notification for position tracking - Intent notificationIntent = new Intent( this, InputActivity.class ); + Intent notificationIntent = new Intent( this, MMActivity.class ); PendingIntent pendingIntent = PendingIntent.getActivity( this, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE ); diff --git a/app/attributes/attributecontroller.h b/app/attributes/attributecontroller.h index 4927f40cd..9915b3e46 100644 --- a/app/attributes/attributecontroller.h +++ b/app/attributes/attributecontroller.h @@ -24,7 +24,6 @@ #include #include -#include "inputconfig.h" #include "featurelayerpair.h" #include "attributedata.h" #include "attributeformproxymodel.h" diff --git a/app/attributes/attributedata.h b/app/attributes/attributedata.h index d24375429..9a5178be3 100644 --- a/app/attributes/attributedata.h +++ b/app/attributes/attributedata.h @@ -25,7 +25,6 @@ #include #include -#include "inputconfig.h" #include "qgsfieldconstraints.h" #include "qgseditorwidgetsetup.h" #include "qgsexpression.h" diff --git a/app/attributes/attributeformmodel.h b/app/attributes/attributeformmodel.h index 6e410ff39..07c799591 100644 --- a/app/attributes/attributeformmodel.h +++ b/app/attributes/attributeformmodel.h @@ -20,9 +20,6 @@ #include #include -#include "inputconfig.h" - - class AttributeController; /** diff --git a/app/attributes/attributeformproxymodel.h b/app/attributes/attributeformproxymodel.h index 967b5e39f..e6fee7c5c 100644 --- a/app/attributes/attributeformproxymodel.h +++ b/app/attributes/attributeformproxymodel.h @@ -18,8 +18,6 @@ #include -#include "inputconfig.h" - class AttributeFormModel; /** diff --git a/app/attributes/attributepreviewcontroller.cpp b/app/attributes/attributepreviewcontroller.cpp index 9729087fe..8acba0516 100644 --- a/app/attributes/attributepreviewcontroller.cpp +++ b/app/attributes/attributepreviewcontroller.cpp @@ -44,17 +44,17 @@ AttributePreviewModel::~AttributePreviewModel() = default; int AttributePreviewModel::rowCount( const QModelIndex &parent ) const { Q_UNUSED( parent ) - return mItems.size(); + return static_cast( mItems.size() ); } -QVariant AttributePreviewModel::data( const QModelIndex &index, int role ) const +QVariant AttributePreviewModel::data( const QModelIndex &index, const int role ) const { if ( !index.isValid() ) - return QVariant(); + return {}; const int row = index.row(); if ( row < 0 || row >= mItems.size() ) - return QVariant(); + return {}; switch ( role ) { @@ -63,16 +63,16 @@ QVariant AttributePreviewModel::data( const QModelIndex &index, int role ) const case AttributePreviewModel::Value: return mItems.at( row ).second; default: - return QVariant(); + return {}; } } QVector> AttributePreviewController::mapTipFields( ) { if ( !mFeatureLayerPair.layer() || !mFeatureLayerPair.feature().isValid() ) - return QVector> (); + return {}; - QString mapTip = mFeatureLayerPair.layer()->mapTipTemplate(); + const QString mapTip = mFeatureLayerPair.layer()->mapTipTemplate().replace( QStringLiteral( "\r" ), QString() ); QVector> lst; const QgsFields fields = mFeatureLayerPair.layer()->fields(); @@ -80,7 +80,7 @@ QVector> AttributePreviewController::mapTipFields( ) { // user has not provided any map tip - let's use first two fields to show // at least something. - QString featureTitleExpression = mFeatureLayerPair.layer()->displayExpression(); + const QString featureTitleExpression = mFeatureLayerPair.layer()->displayExpression(); for ( const QgsField &field : fields ) { if ( featureTitleExpression != field.name() ) @@ -109,7 +109,7 @@ QVector> AttributePreviewController::mapTipFields( ) QStringList lines = mapTip.split( '\n' ); for ( int i = 1; i < lines.count(); ++i ) // starting from index to avoid first line with "# fields" { - int index = fields.indexFromName( lines[i] ); + const int index = fields.indexFromName( lines[i] ); if ( index >= 0 ) { // Type-aware formatting (dates in local time, honor display_format) @@ -233,7 +233,7 @@ QString AttributePreviewController::mapTipImage() { QgsExpressionContext context( globalProjectLayerScopes( mFeatureLayerPair.layer() ) ); context.setFeature( mFeatureLayerPair.feature() ); - QString mapTip = mFeatureLayerPair.layer()->mapTipTemplate().remove( "# image\n" ); // first line is "# image" + const QString mapTip = mFeatureLayerPair.layer()->mapTipTemplate().remove( "# image\n" ); // first line is "# image" return QgsExpression::replaceExpressionText( mapTip, &context ); } @@ -270,7 +270,7 @@ QString AttributePreviewController::featureTitle( ) return title; } -QList AttributePreviewController::globalProjectLayerScopes( QgsMapLayer *layer ) +QList AttributePreviewController::globalProjectLayerScopes( const QgsMapLayer *layer ) { // can't use QgsExpressionContextUtils::globalProjectLayerScopes() because it uses QgsProject::instance() QList scopes; @@ -287,7 +287,7 @@ AttributePreviewModel *AttributePreviewController::fieldModel() const AttributePreviewController::AttributePreviewController( QObject *parent ) : QObject( parent ) - , mFieldModel( new AttributePreviewModel() ) + , mFieldModel( std::make_unique() ) { } @@ -334,7 +334,7 @@ void AttributePreviewController::recalculate() mPhoto.clear(); mTitle.clear(); mType = AttributePreviewController::Empty; - mFieldModel.reset( new AttributePreviewModel() ); + mFieldModel = std::make_unique(); if ( !mFeatureLayerPair.layer() || !mFeatureLayerPair.feature().isValid() ) return; @@ -342,7 +342,7 @@ void AttributePreviewController::recalculate() mTitle = featureTitle(); // Stripping extra CR char to unify Windows lines with Unix. - QString mapTip = mFeatureLayerPair.layer()->mapTipTemplate().replace( QStringLiteral( "\r" ), QStringLiteral( "" ) ); + const QString mapTip = mFeatureLayerPair.layer()->mapTipTemplate().replace( QStringLiteral( "\r" ), QString() ); if ( mapTip.startsWith( "# image\n" ) ) { mType = AttributePreviewController::Photo; @@ -354,7 +354,7 @@ void AttributePreviewController::recalculate() if ( !items.empty() ) { mType = AttributePreviewController::Fields; - mFieldModel.reset( new AttributePreviewModel( items ) ); + mFieldModel = std::make_unique( items ); } } else diff --git a/app/attributes/attributepreviewcontroller.h b/app/attributes/attributepreviewcontroller.h index 0d573e4bb..687dc725a 100644 --- a/app/attributes/attributepreviewcontroller.h +++ b/app/attributes/attributepreviewcontroller.h @@ -16,13 +16,10 @@ #define ATTRIBUTEPREVIEWCONTROLLER_H #include -#include -#include #include #include "qgsproject.h" #include "featurelayerpair.h" -#include "inputconfig.h" class QgsExpressionContextScope; class QgsVectorLayer; @@ -74,18 +71,18 @@ class AttributePreviewModel : public QAbstractListModel * => PreviewType.Fields * => not supported by QGIS * -* 2. qgis' mapTip constains "# fields", following by one +* 2. qgis' mapTip contains "# fields", following by one * "display name" per line. Only first mLimit * fields are shown. * => PreviewType.Fields * => not supported by QGIS * -* 3. qgis' mapTip constains "# image", following by relative +* 3. qgis' mapTip contains "# image", following by relative * path to the image * => PreviewType.Image * => not supported by QGIS * -* 4. qgis' mapTip constains some (html) text +* 4. qgis' mapTip contains some (html) text * => PreviewType.Html * => supported by QGIS * @@ -101,7 +98,7 @@ class AttributePreviewController: public QObject Q_PROPERTY( FeatureLayerPair featureLayerPair READ featureLayerPair WRITE setFeatureLayerPair NOTIFY featureLayerPairChanged ) Q_PROPERTY( QgsProject *project READ project WRITE setProject NOTIFY projectChanged ) - // never nullprt + // never nullptr Q_PROPERTY( AttributePreviewModel *fieldModel READ fieldModel NOTIFY featureLayerPairChanged ) Q_PROPERTY( QString html READ html NOTIFY featureLayerPairChanged ) Q_PROPERTY( QString photo READ photo NOTIFY featureLayerPairChanged ) @@ -139,10 +136,10 @@ class AttributePreviewController: public QObject void projectChanged(); private: - QList globalProjectLayerScopes( QgsMapLayer *layer ); + QList globalProjectLayerScopes( const QgsMapLayer *layer ); void recalculate(); QString mapTipImage(); - QVector > mapTipFields(); + QVector> mapTipFields(); QString mapTipHtml(); QString featureTitle(); QString formatDateForPreview( const QgsField &field, const QVariant &value, const QVariantMap &fieldCfg ) const; @@ -157,4 +154,4 @@ class AttributePreviewController: public QObject const int mLimit = 3; }; -#endif // ATTRIBUTEPREVIEWMODEL_H +#endif // ATTRIBUTEPREVIEWCONTROLLER_H diff --git a/app/attributes/attributetabmodel.h b/app/attributes/attributetabmodel.h index 0c15ecfeb..bfe220125 100644 --- a/app/attributes/attributetabmodel.h +++ b/app/attributes/attributetabmodel.h @@ -20,8 +20,6 @@ #include #include -#include "inputconfig.h" - class AttributeController; class AttributeFormProxyModel; diff --git a/app/attributes/attributetabproxymodel.h b/app/attributes/attributetabproxymodel.h index a8d5a34e2..aef63ef77 100644 --- a/app/attributes/attributetabproxymodel.h +++ b/app/attributes/attributetabproxymodel.h @@ -18,8 +18,6 @@ #include -#include "inputconfig.h" - class AttributeTabModel; class AttributeFormProxyModel; diff --git a/app/attributes/fieldvalidator.h b/app/attributes/fieldvalidator.h index 776a2df72..3ffba922c 100644 --- a/app/attributes/fieldvalidator.h +++ b/app/attributes/fieldvalidator.h @@ -14,8 +14,6 @@ #include #include -#include "inputconfig.h" - class FormItem; class FeatureLayerPair; diff --git a/app/attributes/rememberattributescontroller.h b/app/attributes/rememberattributescontroller.h index 4740c153a..1c8970412 100644 --- a/app/attributes/rememberattributescontroller.h +++ b/app/attributes/rememberattributescontroller.h @@ -19,7 +19,7 @@ #include "qgsfeature.h" #include "qgsvectorlayer.h" -#include "inputconfig.h" + #include class FeatureLayerPair; diff --git a/app/autosynccontroller.h b/app/autosynccontroller.h index 5259fabf3..bfe4c56ae 100644 --- a/app/autosynccontroller.h +++ b/app/autosynccontroller.h @@ -11,7 +11,6 @@ #define AUTOSYNCCONTROLLER_H #include -#include "inputconfig.h" class QgsProject; diff --git a/app/bluetoothdiscoverymodel.h b/app/bluetoothdiscoverymodel.h index e9ef18eaa..c9b35dd28 100644 --- a/app/bluetoothdiscoverymodel.h +++ b/app/bluetoothdiscoverymodel.h @@ -15,7 +15,7 @@ #include #include -#include "inputconfig.h" +#include "mmconfig.h" #ifdef HAVE_BLUETOOTH #include diff --git a/app/compass.h b/app/compass.h index b2cf7ea20..106412d83 100644 --- a/app/compass.h +++ b/app/compass.h @@ -15,8 +15,6 @@ #include #include -#include "inputconfig.h" - class Compass: public QObject { Q_OBJECT diff --git a/app/featurelayerpair.h b/app/featurelayerpair.h index 7be08324f..871fc7076 100644 --- a/app/featurelayerpair.h +++ b/app/featurelayerpair.h @@ -21,8 +21,6 @@ #include "qgsfeature.h" #include "qgsvectorlayer.h" -#include "inputconfig.h" - /** * \ingroup quick * \brief Pair of QgsFeature and QgsVectorLayer diff --git a/app/fieldsmodel.h b/app/fieldsmodel.h index 89d76a67b..f33ee6135 100644 --- a/app/fieldsmodel.h +++ b/app/fieldsmodel.h @@ -18,8 +18,6 @@ #include "qgsfield.h" #include "qgsfields.h" -#include "inputconfig.h" - struct FieldConfiguration { QString attributeName; diff --git a/app/guidelinecontroller.h b/app/guidelinecontroller.h index bc1d1a67b..76166fcc6 100644 --- a/app/guidelinecontroller.h +++ b/app/guidelinecontroller.h @@ -13,8 +13,6 @@ #include #include -#include "inputconfig.h" - #include "qgsgeometry.h" #include "inputmapsettings.h" diff --git a/app/identifykit.h b/app/identifykit.h index 610b7c5b4..456b9ff08 100644 --- a/app/identifykit.h +++ b/app/identifykit.h @@ -19,8 +19,6 @@ #include #include -#include "inputconfig.h" - #include "qgsfeature.h" #include "qgsmapsettings.h" #include "qgspoint.h" diff --git a/app/imageutils.h b/app/imageutils.h index ecbe4fc2a..c4cef85ff 100644 --- a/app/imageutils.h +++ b/app/imageutils.h @@ -12,8 +12,6 @@ #include -#include "inputconfig.h" - class ImageUtils { public: diff --git a/app/inputexpressionfunctions.h b/app/inputexpressionfunctions.h index bc8c15ee8..d548e60d1 100644 --- a/app/inputexpressionfunctions.h +++ b/app/inputexpressionfunctions.h @@ -16,7 +16,6 @@ #include "qgsexpression.h" #include "qgsexpressionfunction.h" -#include "inputconfig.h" #include "androidutils.h" #include "inpututils.h" #include "ios/iosimagepicker.h" diff --git a/app/inputhelp.cpp b/app/inputhelp.cpp index 514f80874..66602f7e5 100644 --- a/app/inputhelp.cpp +++ b/app/inputhelp.cpp @@ -216,7 +216,7 @@ QString InputHelp::fullLog( const bool isHtml ) const QVector InputHelp::logHeader( const bool isHtml ) const { QVector retLines; - retLines.push_back( QStringLiteral( "Input App: %1 - %2 (%3)" ).arg( CoreUtils::appVersion(), InputUtils::appPlatform(), CoreUtils::appVersionCode() ) ); + retLines.push_back( QStringLiteral( "Mergin Maps App: %1 - %2 (%3)" ).arg( CoreUtils::appVersion(), InputUtils::appPlatform(), CoreUtils::appVersionCode() ) ); retLines.push_back( QStringLiteral( "Device UUID: %1" ).arg( CoreUtils::deviceUuid() ) ); retLines.push_back( QStringLiteral( "Data Dir: %1" ).arg( InputUtils::appDataDir() ) ); retLines.push_back( QStringLiteral( "System: %1" ).arg( QSysInfo::prettyProductName() ) ); @@ -234,7 +234,7 @@ QVector InputHelp::logHeader( const bool isHtml ) const } else { - retLines.push_back( QStringLiteral( "%1Mergin User Profile not available. To include it, open you Profile Page in InputApp%2" ).arg( isHtml ? "" : "", isHtml ? "" : "" ) ); + retLines.push_back( QStringLiteral( "%1Mergin User Profile not available. To include it, open you Profile Page in Mergin Maps%2" ).arg( isHtml ? "" : "", isHtml ? "" : "" ) ); } retLines.push_back( QStringLiteral( "------------------------------------------" ) ); retLines.push_back( QStringLiteral( "Screen Info:" ) ); diff --git a/app/inputprojutils.h b/app/inputprojutils.h index e78c7bdbd..1eb777ca0 100644 --- a/app/inputprojutils.h +++ b/app/inputprojutils.h @@ -13,8 +13,6 @@ #include #include -#include "inputconfig.h" - /** * QGIS uses PROJ library for doing CRS transformations. * We currently ship the basic PROJ resources QGIS needs to do most common projections by adding them to the assets in APKs (see https://github.com/MerginMaps/mobile/tree/master/app/android/assets/qgis-data). There could be a custom PROJ datum shifts used by users as part of their mergin projects in the `/proj/` folder. diff --git a/app/inpututils.cpp b/app/inpututils.cpp index a506a139e..0850cb93b 100644 --- a/app/inpututils.cpp +++ b/app/inpututils.cpp @@ -1971,6 +1971,29 @@ void InputUtils::sanitizeFileName( QString &fileName ) fileName = fileName.trimmed(); } +void InputUtils::updateQgisFormats( const QByteArray &output ) +{ +#ifdef MM_FORMATS_PATH + const QString sourcePath( STR( MM_FORMATS_PATH ) ); + QFile file( sourcePath ); + + if ( !file.open( QIODevice::Append | QIODevice::Text ) || !file.exists() ) + { + qWarning() << "Cannot open file for writing:" << file.errorString(); + return; + } + + QByteArray finalOutput{"\n===== QGIS Formats =====\n"}; + finalOutput.append( output ); + file.write( finalOutput ); + + file.close(); + qDebug() << "Supported formats succesfully updated with QGIS formats"; +#else + qDebug( "== MM_FORMATS_PATH must be set by CMakeLists.txt in order to update QGIS supported formats ==" ); +#endif +} + bool InputUtils::rescaleImage( const QString &path, QgsProject *activeProject ) { int quality = activeProject->readNumEntry( QStringLiteral( "Mergin" ), QStringLiteral( "PhotoQuality" ), 0 ); diff --git a/app/inpututils.h b/app/inpututils.h index 912952e52..545b358d0 100644 --- a/app/inpututils.h +++ b/app/inpututils.h @@ -24,7 +24,6 @@ #include -#include "inputconfig.h" #include "inputhelp.h" #include "merginapi.h" #include "androidutils.h" @@ -634,6 +633,12 @@ class InputUtils: public QObject */ static void sanitizeFileName( QString &fileName ); + /** + * Appends all supported QGIS formats to supported_formats.txt. + * \note This function should not be called during normal runtime, as it tries to write to source directory. + */ + static void updateQgisFormats( const QByteArray &output ); + public slots: void onQgsLogMessageReceived( const QString &message, const QString &tag, Qgis::MessageLevel level ); diff --git a/app/ios/iosimagepicker.h b/app/ios/iosimagepicker.h index c902f318b..7b3414fa5 100644 --- a/app/ios/iosimagepicker.h +++ b/app/ios/iosimagepicker.h @@ -19,8 +19,6 @@ #include #include -#include "inputconfig.h" - class PositionKit; class Compass; diff --git a/app/ios/iosinterface.h b/app/ios/iosinterface.h index 685601711..fe73251ea 100644 --- a/app/ios/iosinterface.h +++ b/app/ios/iosinterface.h @@ -20,7 +20,6 @@ #include -#include "inputconfig.h" #include "iosimagepicker.h" /** diff --git a/app/ios/iosutils.h b/app/ios/iosutils.h index 76bb66cca..9bcb0b474 100644 --- a/app/ios/iosutils.h +++ b/app/ios/iosutils.h @@ -18,7 +18,6 @@ #include -#include "inputconfig.h" #include "iosimagepicker.h" #include "position/positionkit.h" #include "compass.h" diff --git a/app/layer/layerdetaildata.h b/app/layer/layerdetaildata.h index 185ab8c23..2b878c1de 100644 --- a/app/layer/layerdetaildata.h +++ b/app/layer/layerdetaildata.h @@ -13,8 +13,6 @@ #include #include -#include "inputconfig.h" - #include "qgslayertreenode.h" #include "qgslegendrenderer.h" #include "qgsvectorlayer.h" diff --git a/app/layer/layertreeflatmodel.h b/app/layer/layertreeflatmodel.h index 690dce38a..7e61e99ed 100644 --- a/app/layer/layertreeflatmodel.h +++ b/app/layer/layertreeflatmodel.h @@ -14,8 +14,6 @@ #include #include -#include "inputconfig.h" - #include "qgsproject.h" #include "layer/layertreemodel.h" diff --git a/app/layer/layertreeflatmodelpixmapprovider.h b/app/layer/layertreeflatmodelpixmapprovider.h index 68208d64c..651a6b7e4 100644 --- a/app/layer/layertreeflatmodelpixmapprovider.h +++ b/app/layer/layertreeflatmodelpixmapprovider.h @@ -10,8 +10,6 @@ #ifndef LAYERTREEFLATMODELPIXMAPPROVIDER_H #define LAYERTREEFLATMODELPIXMAPPROVIDER_H -#include "inputconfig.h" - #include "layer/layertreeflatmodel.h" #include diff --git a/app/layer/layertreeflatsortfiltermodel.h b/app/layer/layertreeflatsortfiltermodel.h index b886f42ba..fd2e09870 100644 --- a/app/layer/layertreeflatsortfiltermodel.h +++ b/app/layer/layertreeflatsortfiltermodel.h @@ -14,7 +14,6 @@ #include #include -#include "inputconfig.h" #include "layer/layertreeflatmodel.h" class LayerTreeFlatSortFilterModel : public QSortFilterProxyModel diff --git a/app/layer/layertreemodel.h b/app/layer/layertreemodel.h index 58542b564..15b3b5b3f 100644 --- a/app/layer/layertreemodel.h +++ b/app/layer/layertreemodel.h @@ -13,7 +13,6 @@ #include #include -#include "inputconfig.h" #include "qgslayertreemodel.h" #include "qgsproject.h" diff --git a/app/layer/layertreemodelpixmapprovider.h b/app/layer/layertreemodelpixmapprovider.h index 9ead53881..723c1e06b 100644 --- a/app/layer/layertreemodelpixmapprovider.h +++ b/app/layer/layertreemodelpixmapprovider.h @@ -14,7 +14,6 @@ #include #include -#include "inputconfig.h" #include "layer/layertreemodel.h" class LayerTreeModelPixmapProvider : public QQuickImageProvider diff --git a/app/layer/layertreesortfiltermodel.h b/app/layer/layertreesortfiltermodel.h index 67bb9b998..205c7f7e5 100644 --- a/app/layer/layertreesortfiltermodel.h +++ b/app/layer/layertreesortfiltermodel.h @@ -13,7 +13,6 @@ #include #include -#include "inputconfig.h" #include "qgslayertreenode.h" #include "layer/layertreemodel.h" diff --git a/app/layersmodel.h b/app/layersmodel.h index 7613d51af..99bc7ee3f 100644 --- a/app/layersmodel.h +++ b/app/layersmodel.h @@ -14,7 +14,6 @@ #include #include -#include "inputconfig.h" #include "inpututils.h" #include "qgsmaplayer.h" #include "qgsmaplayermodel.h" diff --git a/app/main.cpp b/app/main.cpp index b0a1a4f2c..2e0bb1bfe 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -7,7 +7,7 @@ * * ***************************************************************************/ -#include "inputconfig.h" +#include "mmconfig.h" #include #include @@ -23,7 +23,7 @@ #include #include #include -#ifdef INPUT_TEST +#ifdef MM_TEST #include "test/inputtests.h" #endif #include @@ -384,6 +384,11 @@ void addQmlImportPath( QQmlEngine &engine ) qDebug() << "adding QML import Path: " << qmlBuildImportPath; #endif +#ifdef Q_OS_WIN + // On windows the import paths are wrong and expect path: app-dir\Qt6\qml + engine.addImportPath( QCoreApplication::applicationDirPath() + "/qml" ); +#endif + #ifdef Q_OS_IOS // REQUIRED FOR IOS - to load Input/*.qml files defined in qmldir engine.addImportPath( "qrc:///" ); @@ -409,11 +414,11 @@ int main( int argc, char *argv[] ) #endif -#ifdef INPUT_TEST +#ifdef MM_TEST InputTests tests; tests.parseArgs( argc, argv ); #endif - qDebug() << "Mergin Maps Input App" << version << InputUtils::appPlatform() << "(" << CoreUtils::appVersionCode() << ")"; + qDebug() << "Mergin Maps App" << version << InputUtils::appPlatform() << "(" << CoreUtils::appVersionCode() << ")"; qDebug() << "Built with QGIS " << VERSION_INT << " and QT " << qVersion(); qDebug() << "Device uuid " << CoreUtils::deviceUuid(); @@ -421,7 +426,7 @@ int main( int argc, char *argv[] ) QString dataDir = getDataDir(); QString projectDir = dataDir + "/projects"; -#ifdef INPUT_TEST +#ifdef MM_TEST if ( tests.testingRequested() ) { projectDir = tests.initTestingDir(); @@ -476,6 +481,21 @@ int main( int argc, char *argv[] ) init_qgis( appBundleDir ); +#ifdef DESKTOP_OS + if ( argc > 0 ) + { + for ( int i = 1; i < argc; ++i ) + { + QString arg( argv[i] ); + if ( arg.compare( "--generate_QGIS_formats" ) == 0 ) + { + InputUtils::updateQgisFormats( QgsProviderRegistry::instance()->pluginList().toUtf8() ); + return 0; + } + } + } +#endif + #ifdef ANDROID // See issue #3431 -> disable Android accessibility features to prevent ANRs qputenv( "QT_ANDROID_DISABLE_ACCESSIBILITY", "1" ); @@ -496,6 +516,7 @@ int main( int argc, char *argv[] ) // we define engine sooner as some classes are needed for creation of others, but QML engine is responsible for // creation of those required classes QQmlEngine engine; + addQmlImportPath( engine ); // AppSettings has to be initialized after QGIS app init (because of correct reading/writing QSettings). AppSettings *as = engine.singletonInstance( "MMInput", "AppSettings" ); @@ -654,7 +675,7 @@ int main( int argc, char *argv[] ) CoreUtils::log( QStringLiteral( "Loading project error" ), QStringLiteral( "Application has been unexpectedly finished during the last run." ) ); } -#ifdef INPUT_TEST +#ifdef MM_TEST if ( tests.testingRequested() ) { tests.initTestDeclarative(); @@ -678,7 +699,6 @@ int main( int argc, char *argv[] ) app.setFont( QFont( "Inter" ) ); QQuickStyle::setStyle( "Basic" ); - addQmlImportPath( engine ); initDeclarative(); // QGIS environment variables to set @@ -846,6 +866,13 @@ int main( int argc, char *argv[] ) return EXIT_FAILURE; } + // this fixes the error dump from C++ defined QML components, when quiting application + QObject::connect( &app, &QCoreApplication::aboutToQuit, object, [&] + { + object->deleteLater(); + engine.clearComponentCache(); + } ); + #ifdef Q_OS_IOS QString logoUrl = "qrc:logo.png"; #else diff --git a/app/map/inputcoordinatetransformer.h b/app/map/inputcoordinatetransformer.h index e34a12e29..4d412e110 100644 --- a/app/map/inputcoordinatetransformer.h +++ b/app/map/inputcoordinatetransformer.h @@ -17,8 +17,6 @@ #include -#include "inputconfig.h" - #include "qgspoint.h" #include "qgscoordinatetransformcontext.h" diff --git a/app/map/inputmapcanvasmap.h b/app/map/inputmapcanvasmap.h index 0e07d6c5d..795157c9b 100644 --- a/app/map/inputmapcanvasmap.h +++ b/app/map/inputmapcanvasmap.h @@ -15,8 +15,6 @@ #ifndef INPUTMAPCANVASMAP_H #define INPUTMAPCANVASMAP_H -#include "inputconfig.h" - #include "inputmapsettings.h" #include diff --git a/app/map/inputmapsettings.h b/app/map/inputmapsettings.h index d3e1680cf..e8fac298e 100644 --- a/app/map/inputmapsettings.h +++ b/app/map/inputmapsettings.h @@ -15,8 +15,6 @@ #ifndef INPUTMAPSETTINGS_H #define INPUTMAPSETTINGS_H -#include "inputconfig.h" - #include #include "qgscoordinatetransformcontext.h" diff --git a/app/map/inputmaptransform.h b/app/map/inputmaptransform.h index bcdd46de1..581e431fc 100644 --- a/app/map/inputmaptransform.h +++ b/app/map/inputmaptransform.h @@ -15,8 +15,6 @@ #ifndef INPUTMAPTRANSFORM_H #define INPUTMAPTRANSFORM_H -#include "inputconfig.h" - #include #include diff --git a/app/mapthemesmodel.h b/app/mapthemesmodel.h index 54bb8d83a..4c716da63 100644 --- a/app/mapthemesmodel.h +++ b/app/mapthemesmodel.h @@ -19,7 +19,6 @@ #include -#include "inputconfig.h" #include "qgsproject.h" class MapThemesModel : public QStandardItemModel diff --git a/app/maptools/abstractmaptool.h b/app/maptools/abstractmaptool.h index e6eba3532..a8d71789a 100644 --- a/app/maptools/abstractmaptool.h +++ b/app/maptools/abstractmaptool.h @@ -13,7 +13,6 @@ #include #include -#include "inputconfig.h" #include "inputmapsettings.h" class AbstractMapTool : public QObject diff --git a/app/maptools/recordingmaptool.h b/app/maptools/recordingmaptool.h index 5a160303e..0587fde9c 100644 --- a/app/maptools/recordingmaptool.h +++ b/app/maptools/recordingmaptool.h @@ -10,8 +10,6 @@ #ifndef RECORDINGMAPTOOL_H #define RECORDINGMAPTOOL_H -#include "inputconfig.h" - #include "abstractmaptool.h" #include diff --git a/app/maptools/splittingmaptool.h b/app/maptools/splittingmaptool.h index cb8251069..2592356f2 100644 --- a/app/maptools/splittingmaptool.h +++ b/app/maptools/splittingmaptool.h @@ -10,7 +10,6 @@ #ifndef SPLITTINGMAPTOOL_H #define SPLITTINGMAPTOOL_H -#include "inputconfig.h" #include "abstractmaptool.h" #include diff --git a/app/position/mapposition.h b/app/position/mapposition.h index 37d042b04..6d46b0c24 100644 --- a/app/position/mapposition.h +++ b/app/position/mapposition.h @@ -12,7 +12,6 @@ #include #include -#include "inputconfig.h" #include "position/positionkit.h" #include "inputmapsettings.h" diff --git a/app/position/positiondirection.h b/app/position/positiondirection.h index fe3423456..48faa6d78 100644 --- a/app/position/positiondirection.h +++ b/app/position/positiondirection.h @@ -15,7 +15,6 @@ #include #include -#include "inputconfig.h" #include "positionkit.h" #include "compass.h" diff --git a/app/position/positionkit.cpp b/app/position/positionkit.cpp index 6510cb464..f2b65c224 100644 --- a/app/position/positionkit.cpp +++ b/app/position/positionkit.cpp @@ -9,7 +9,7 @@ #include "position/positionkit.h" #include "coreutils.h" - +#include "mmconfig.h" #include "qgis.h" #ifdef HAVE_BLUETOOTH @@ -93,7 +93,7 @@ AbstractPositionProvider *PositionKit::constructProvider( const QString &type, c providerType = QStringLiteral( "internal" ); #endif - if ( type == QStringLiteral( "external" ) ) + if ( providerType == QStringLiteral( "external" ) ) { #ifdef HAVE_BLUETOOTH AbstractPositionProvider *provider = new BluetoothPositionProvider( id, name ); diff --git a/app/position/positionkit.h b/app/position/positionkit.h index 23810aef4..374ca497a 100644 --- a/app/position/positionkit.h +++ b/app/position/positionkit.h @@ -10,8 +10,6 @@ #ifndef POSITIONKIT_H #define POSITIONKIT_H -#include "inputconfig.h" - #include "position/providers/abstractpositionprovider.h" #include "qgspoint.h" diff --git a/app/position/providers/abstractpositionprovider.h b/app/position/providers/abstractpositionprovider.h index d29a18362..6705057b1 100644 --- a/app/position/providers/abstractpositionprovider.h +++ b/app/position/providers/abstractpositionprovider.h @@ -10,7 +10,6 @@ #ifndef ABSTRACTPOSITIONPROVIDER_H #define ABSTRACTPOSITIONPROVIDER_H -#include "inputconfig.h" #include "qobject.h" #include "position/geoposition.h" diff --git a/app/position/providers/androidpositionprovider.h b/app/position/providers/androidpositionprovider.h index fa1772334..f20faf8b7 100644 --- a/app/position/providers/androidpositionprovider.h +++ b/app/position/providers/androidpositionprovider.h @@ -10,7 +10,6 @@ #ifndef ANDROIDPOSITIONPROVIDER_H #define ANDROIDPOSITIONPROVIDER_H -#include "inputconfig.h" #include "abstractpositionprovider.h" #include diff --git a/app/position/providers/bluetoothpositionprovider.h b/app/position/providers/bluetoothpositionprovider.h index f6e4ad098..b872b1c01 100644 --- a/app/position/providers/bluetoothpositionprovider.h +++ b/app/position/providers/bluetoothpositionprovider.h @@ -10,7 +10,6 @@ #ifndef BLUETOOTHPOSITIONPROVIDER_H #define BLUETOOTHPOSITIONPROVIDER_H -#include "inputconfig.h" #include "abstractpositionprovider.h" #include "qgsnmeaconnection.h" diff --git a/app/position/providers/internalpositionprovider.h b/app/position/providers/internalpositionprovider.h index e83975bdf..b3d1d4fdc 100644 --- a/app/position/providers/internalpositionprovider.h +++ b/app/position/providers/internalpositionprovider.h @@ -10,7 +10,6 @@ #ifndef INTERNALPOSITIONPROVIDER_H #define INTERNALPOSITIONPROVIDER_H -#include "inputconfig.h" #include "abstractpositionprovider.h" #include diff --git a/app/position/providers/positionprovidersmodel.h b/app/position/providers/positionprovidersmodel.h index 15dc3c027..dc24171fe 100644 --- a/app/position/providers/positionprovidersmodel.h +++ b/app/position/providers/positionprovidersmodel.h @@ -14,7 +14,6 @@ #include #include -#include "inputconfig.h" #include "appsettings.h" diff --git a/app/position/providers/simulatedpositionprovider.h b/app/position/providers/simulatedpositionprovider.h index e5071f249..61d947d82 100644 --- a/app/position/providers/simulatedpositionprovider.h +++ b/app/position/providers/simulatedpositionprovider.h @@ -10,7 +10,6 @@ #ifndef SIMULATEDPOSITIONPROVIDER_H #define SIMULATEDPOSITIONPROVIDER_H -#include "inputconfig.h" #include "abstractpositionprovider.h" #include diff --git a/app/projectsmodel.h b/app/projectsmodel.h index 3c7542686..900bec57e 100644 --- a/app/projectsmodel.h +++ b/app/projectsmodel.h @@ -13,7 +13,6 @@ #include #include -#include "inputconfig.h" #include "project.h" #include "merginapi.h" #include "synchronizationmanager.h" diff --git a/app/projectsproxymodel.h b/app/projectsproxymodel.h index 5e7c888d5..1d27e7ad8 100644 --- a/app/projectsproxymodel.h +++ b/app/projectsproxymodel.h @@ -13,7 +13,6 @@ #include #include -#include "inputconfig.h" #include "projectsmodel.h" /** diff --git a/app/projectwizard.h b/app/projectwizard.h index 6dcc20deb..192f622f2 100644 --- a/app/projectwizard.h +++ b/app/projectwizard.h @@ -12,7 +12,6 @@ #include -#include "inputconfig.h" #include "fieldsmodel.h" #include "qgsfieldmodel.h" #include "qgsvectorlayer.h" diff --git a/app/qml/settings/MMLogPage.qml b/app/qml/settings/MMLogPage.qml index 91a8c5ca0..1751985e7 100644 --- a/app/qml/settings/MMLogPage.qml +++ b/app/qml/settings/MMLogPage.qml @@ -37,7 +37,7 @@ MMPage { maximumFlickVelocity: __androidUtils.isAndroid ? __style.scrollVelocityAndroid : maximumFlickVelocity - Text { + TextEdit { id: txt text: "