#!/bin/env bash # Geotag images # Copyright (C) 2017,2023 Pekka Helenius # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # ############################################### # TODO Coordinate threshold = Grid size is 30x30m? # TODO Find API for ASTER DEM v2 (provides better data) # Username for REST API data request USERNAME= ############################ # Ping openstreetmap.org three times. PING_ADDRESS="nominatim.openstreetmap.org" INTERNET_TEST=$(ping -c 3 "${PING_ADDRESS}" 2>&1 | grep -c "unknown host") if [[ ! "${INTERNET_TEST}" -eq 0 ]] then echo -e "\nCan't connect to the Geo Service provider '${PING_ADDRESS}'. Please check your internet connection and try again.\n" exit 1 fi ############################ for IMAGE in $(echo "${@}") do IMAGE_BASENAME=$(basename "${IMAGE}" | cut -f 1 -d '.') IMAGE_EXTENSION=$(echo $(basename "${IMAGE}" | cut -f 2 -d '.' | sed '/^\s*$/d')) if [[ $(exiftool -n -p '$GPSLatitude,$GPSLongitude' "${IMAGE}" | awk -F ',' '{print NF}') != 2 ]] then echo -e "$IMAGE_BASENAME: Missing coordinates. Are you sure you have geotagged the photo?\n" exit 0 else LATITUDE=$(exiftool -n -p '$GPSLatitude' "${IMAGE}") LONGITUDE=$(exiftool -n -p '$GPSLongitude' "${IMAGE}") # Clear previous geonames information. exiftool \ -Location= \ -LocationShownCity= \ -LocationShownCountryName= \ -LocationShownProvinceState= \ -LocationShownSublocation= \ -Country-PrimaryLocationName= \ -Sub-location= \ -Country= \ -City= \ -State= \ -Province-State= \ -GPSAltitude= \ "${IMAGE}" \ -overwrite_original echo -e "$IMAGE_BASENAME: retrieving country information.\n" reversegeo "${IMAGE}" # Reference: http://www.geonames.org/export/web-services.html # Get elevation by retrieving a ASTER DEM value from GeoNames API server, grid size 30x30m # There are several error factors: # DEM Grid size # General inaccurancies in DEM model # Geoid model & projection errors # Coordinate errors # Variations in (estimated) height values # So the retrieved elevation value is just a rough estimation here. ALTITUDE=$(curl -s "http://api.geonames.org/astergdem?lat=$LATITUDE&lng=$LONGITUDE&username=$USERNAME") # If we have a successful answer, then if [[ "${ALTITUDE}" =~ '^[0-9]+$' ]] then exiftool -GPSAltitude="${ALTITUDE}" "${IMAGE}" -overwrite_original echo -e "${IMAGE_BASENAME}: Altitude value updated.\n" else # TODO: If not successful, try again for 2 times, then abort. echo -e "${IMAGE_BASENAME}: Couldn't retrieve altitude value.\n" fi fi done