pax_global_header00006660000000000000000000000064135560430240014514gustar00rootroot0000000000000052 comment=213c9d56fd31977ab8886f2faba28ca62b701b2b gpscorrelate-2.0/000077500000000000000000000000001355604302400140475ustar00rootroot00000000000000gpscorrelate-2.0/.appveyor.yml000066400000000000000000000050701355604302400165170ustar00rootroot00000000000000# AppVeyor CI configuration file https://www.appveyor.com environment: CYGWIN_MIRROR: http://cygwin.mirror.constant.com matrix: - CONFIG: cygwin - CONFIG: cygwin64 - CONFIG: msys2 install: - cmd: if [%CONFIG%]==[cygwin] ( C:\cygwin\setup-x86.exe -qgnNdO -l C:\cygwin\var\cache\setup -R c:\cygwin -s "%CYGWIN_MIRROR%" -P exiv2 -P libexiv2-devel -P libxml2-devel -P libiconv-devel ) - cmd: if [%CONFIG%]==[cygwin64] ( C:\cygwin64\setup-x86_64.exe -qgnNdO -l C:\cygwin64\var\cache\setup -R c:\cygwin64 -s "%CYGWIN_MIRROR%" -P exiv2 -P libexiv2-devel -P libxml2-devel -P libiconv-devel ) - cmd: if [%CONFIG%]==[msys2] ( set "PATH=C:\msys64\mingw64\bin;C:\msys64\usr\bin;%PATH%" ) - cmd: if [%CONFIG%]==[msys2] ( bash -lc "pacman --noconfirm --noprogressbar -S --needed mingw-w64-x86_64-{libxml2,libiconv,exiv2,pkg-config}" ) build_script: - cmd: if [%CONFIG%]==[cygwin] ( C:\%CONFIG%\bin\bash -e -l -c "cd $APPVEYOR_BUILD_FOLDER && make gpscorrelate CFLAGS='-Wall -Wextra -O3 -DENABLE_NLS' LDFLAGS='-lintl'" ) - cmd: if [%CONFIG%]==[cygwin64] ( C:\%CONFIG%\bin\bash -e -l -c "cd $APPVEYOR_BUILD_FOLDER && make gpscorrelate CFLAGS='-Wall -Wextra -O3 -DENABLE_NLS' LDFLAGS='-lintl'" ) - cmd: if [%CONFIG%]==[msys2] ( make EXEEXT=.exe gpscorrelate.exe CC=gcc CXX=g++ CFLAGS="-Wall -Wextra -O3 -DENABLE_NLS" LDFLAGS="-lintl" ) test_script: # Cygwin allows overwriting read-only files for some strange reason, which # causes 4 tests to fail. Until that's sorted, consider 4 tests failing as # success. - cmd: if [%CONFIG%]==[cygwin] ( C:\%CONFIG%\bin\bash -l -c "cd $APPVEYOR_BUILD_FOLDER && make check > test.log; cat test.log; grep -q '4 test(s) have FAILED' test.log" ) - cmd: if [%CONFIG%]==[cygwin64] ( C:\%CONFIG%\bin\bash -l -c "cd $APPVEYOR_BUILD_FOLDER && make check > test.log; cat test.log; grep -q '4 test(s) have FAILED' test.log" ) # msys2 seems to have a number of bugs that cause test failures: # 1) The tests setting TZ fail, because it doesn't seem to support time # zones set by TZ (tests 38, 39, 40). # 2) Calling fflush on stdout when the buffer contains a partial line causes # a spurious \r\n to be written (tests 50, 67). # 3) File names on NTFS may not contain the double quote character (test 97). # 4) Characters in ISO 8859/1 on the command line don't seem to make it through # unscathed (test 113). # Until these are addressed (if it's even possible), consider 7 tests failing # as success. - cmd: if [%CONFIG%]==[msys2] ( bash -lc "cd $APPVEYOR_BUILD_FOLDER && make check > test.log; cat test.log; grep -q '7 test(s) have FAILED' test.log" ) gpscorrelate-2.0/.cirrus.yml000066400000000000000000000025701355604302400161630ustar00rootroot00000000000000# Cirrus CI configuration # https://cirrus-ci.com/github/dfandrich/gpscorrelate task: name: FreeBSD freebsd_instance: matrix: image: freebsd-12-0-release-amd64 image: freebsd-11-2-release-amd64 image: freebsd-10-4-release-amd64 env: # Set to 10 instead of 1 to avoid problems when new commits are submitted # during a run. CIRRUS_CLONE_DEPTH: 10 CFLAGS: -Wall -Wextra -Werror -O3 -DENABLE_NLS=1 LDFLAGS: $CFLAGS -lintl CC: cc CXX: c++ MAKE_FLAGS: -j 2 matrix: - GTK: 2 - GTK: 3 pkginstall_script: - pkg install -y pkgconf docbook-xsl exiv2 libxml2 gtk"$GTK" libxslt gettext-tools desktop-file-utils compile_script: # GTK3 throws up some warnings, so avoid -Werror - if [ "$GTK" = 3 ] ; then CFLAGS='-Wall -Wextra -O3 -DENABLE_NLS=1'; fi - make CC="$CC" CXX="$CXX" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" GTK="$GTK" test_script: - ./gpscorrelate -V # The tests involving writing to read-only files fail when run as root # (because the OS allows the files to be overwritten then). Run the # tests as a normal user to get around that problem. The log directory # must be world-writable since files will be written there. - install -d -m 0777 tests/log - sudo -u nobody make check install_script: - make prefix= DESTDIR="${HOME}" install install-po install-desktop-file gpscorrelate-2.0/.travis.yml000066400000000000000000000200721355604302400161610ustar00rootroot00000000000000# Travis CI configuration file # https://travis-ci.org/dfandrich/gpscorrelate sudo: false language: cpp git: # Set to 10 instead of 1 to avoid problems when the most recent commits have [skip ci] depth: 10 # Install needed packages on Ubuntu and OS X addons: apt: packages: - desktop-file-utils - docbook-xsl - exiv2 - libexiv2-dev - libgtk2.0-dev - xsltproc homebrew: packages: - desktop-file-utils - docbook-xsl - exiv2 - gtk+ - libxml2 # The default OS X image is now (August 2019) too old to work without this update: true install: - if [ "$CONFIG" = "coverage" ] ; then pip install --user cpp-coveralls; fi - | if [ "$CONFIG" = "musl" ] ; then echo > Dockerfile " FROM alpine RUN apk add --no-cache build-base exiv2-dev libxml2-dev gettext-dev gtk+2.0-dev desktop-file-utils # Use the same user id as the one building this container RUN adduser -D -u $(id -u) build " docker build -t alpine-build . fi env: # More configurations are configured in the matrix section matrix: - CONFIG=normal - CONFIG=no-nls global: - MAKEFLAGS='-j 2' compiler: - clang - gcc os: - linux - osx matrix: include: # Only run the coverage build in one configuration - env: CONFIG=coverage DIST=bionic os: linux dist: bionic compiler: gcc - env: CONFIG=debuglog DIST=bionic os: linux dist: bionic compiler: gcc - env: CONFIG=no-werror GTK=3 os: linux compiler: gcc addons: apt: packages: - desktop-file-utils - docbook-xsl - exiv2 - libexiv2-dev - libgtk-3-dev - xsltproc - env: CONFIG=no-werror DIST=bionic GTK=3 os: linux dist: bionic compiler: gcc addons: apt: packages: - desktop-file-utils - docbook-xsl - exiv2 - libexiv2-dev - libgtk-3-dev - xsltproc - env: CONFIG=normal DIST=bionic os: linux dist: bionic compiler: gcc - env: CONFIG=no-werror DIST=bionic os: linux dist: bionic compiler: clang - env: CONFIG=normal DIST=xenial os: linux dist: xenial compiler: gcc - env: CONFIG=no-werror DIST=xenial os: linux dist: xenial compiler: clang - env: CONFIG=clang6 DIST=xenial os: linux dist: xenial compiler: clang addons: apt: packages: - desktop-file-utils - docbook-xsl - exiv2 - libexiv2-dev - libgtk2.0-dev - clang-6.0 - xsltproc - env: CONFIG=clang7 os: linux compiler: clang addons: apt: sources: - llvm-toolchain-trusty-7 - ubuntu-toolchain-r-test packages: - desktop-file-utils - docbook-xsl - exiv2 - libexiv2-dev - libgtk2.0-dev - clang-7 - xsltproc - env: CONFIG=clang8 os: linux compiler: clang addons: apt: sources: - llvm-toolchain-trusty-8 - ubuntu-toolchain-r-test packages: - desktop-file-utils - docbook-xsl - exiv2 - libexiv2-dev - libgtk2.0-dev - clang-8 - xsltproc - env: CONFIG=gcc8 os: linux compiler: gcc addons: apt: sources: - ubuntu-toolchain-r-test packages: - desktop-file-utils - docbook-xsl - exiv2 - libexiv2-dev - libgtk2.0-dev - g++-8 - xsltproc - env: CONFIG=sanitize os: linux compiler: clang addons: apt: sources: - llvm-toolchain-trusty-8 - ubuntu-toolchain-r-test packages: - desktop-file-utils - docbook-xsl - exiv2 - libexiv2-dev - libgtk2.0-dev - clang-8 - xsltproc - env: CONFIG=musl DIST=alpine os: linux sudo: required services: docker - env: CONFIG=no-werror GTK=3 os: osx compiler: gcc addons: homebrew: packages: - desktop-file-utils - docbook-xsl - exiv2 - gtk+3 - libxml2 # The default OS X image is now (August 2019) too old to work without this update: true - env: CONFIG=normal os: osx osx_image: xcode11 compiler: clang addons: homebrew: packages: - desktop-file-utils - docbook-xsl - exiv2 - gtk+ - libxml2 - env: CONFIG=normal DIST=bionic arch: arm64 os: linux dist: bionic compiler: gcc before_install: - GTK=${GTK:-2} # The apt addons section is ignored on bionic for some reason - if [ "${DIST}" = "bionic" ] ; then sudo apt-get install -y desktop-file-utils docbook-xsl exiv2 gettext libexiv2-dev libgtk${GTK/3/-}${GTK/2/.0}-dev libxml2-dev xsltproc; fi script: # Build both the command-line tool and GUI by default - TARGET='gpscorrelate gpscorrelate-gui' - INSTALLTARGET='install install-po install-desktop-file' - if [ "$CONFIG" = "normal" ] ; then CFLAGS='-Wall -Wextra -Werror -Wno-error=deprecated-declarations -O3 -DENABLE_NLS=1'; fi - if [ "$CONFIG" = "debuglog" ] ; then CFLAGS='-Wall -Wextra -Werror -O3 -DENABLE_NLS=1 -DDEBUG'; fi - if [ "$CONFIG" = "no-werror" ] ; then CFLAGS='-Wall -Wextra -O3 -DENABLE_NLS=1'; fi - if [ "$CONFIG" = "no-nls" ] ; then CFLAGS='-Wall -Wextra -Werror -Wno-error=deprecated-declarations -O3'; fi - if [ "$CONFIG" = "sanitize" ] ; then CFLAGS='-g -O0 -fsanitize=address -fsanitize=undefined -DENABLE_NLS=1'; LDFLAGS='$(CFLAGS)'; export CC=clang-8; export ASAN_OPTIONS=strict_string_checks=0:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1; fi # FIXME: There are no tests for the GUI, so don't bother building it. - if [ "$CONFIG" = "coverage" ] ; then CFLAGS='-g -O0 --coverage'; LDFLAGS='$(CFLAGS)'; TARGET='gpscorrelate'; INSTALLTARGET='install-po install-desktop-file'; fi - if [ "$CONFIG" = "clang6" ] ; then CFLAGS='-Wall -Wextra -Werror -Wno-error=deprecated-declarations -O3 -DENABLE_NLS=1'; CC=clang-6.0; CXX=clang++-6.0; fi - if [ "$CONFIG" = "clang7" ] ; then CFLAGS='-Wall -Wextra -Werror -Wno-error=deprecated-declarations -O3 -DENABLE_NLS=1'; CC=clang-7; CXX=clang++-7; fi - if [ "$CONFIG" = "clang8" ] ; then CFLAGS='-Wall -Wextra -Werror -Wno-error=deprecated-declarations -O3 -DENABLE_NLS=1'; CC=clang-8; CXX=clang++-8; fi - if [ "$CONFIG" = "gcc8" ] ; then CFLAGS='-Wall -Wextra -Werror -O3 -DENABLE_NLS=1'; CC=gcc-8; CXX=g++-8; fi # Explicitly point to Homebrew's gettext and pkg-config files on OS X - if [ "$TRAVIS_OS_NAME" = "osx" ] ; then CFLAGS="$CFLAGS -I/usr/local/opt/gettext/include"; LDFLAGS="$LDFLAGS -L/usr/local/opt/gettext/lib -lintl"; export PKG_CONFIG_PATH="$(brew --prefix libffi)/lib/pkgconfig/":"$(brew --prefix libxml2)/lib/pkgconfig/"; fi - | set -e if [ "$CONFIG" = "musl" ] ; then docker run --rm -v "$PWD":/tmp/src alpine-build sh -c ' cat /etc/os-release # Some tests fail if run as root (the ones to do with read only files) su -l build -c " set -ex cd /tmp/src make CFLAGS=-DENABLE_NLS LDFLAGS=-lintl GTK=2 gpscorrelate gpscorrelate-gui ./gpscorrelate -V make check make install-po install-desktop-file prefix= DESTDIR="\${HOME}" " ' else make CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" CC="$CC" CXX="$CXX" GTK="$GTK" $TARGET ./gpscorrelate -V if [ "$CONFIG" = "debuglog" ] ; then # Debug logging enabled makes some tests fail due to differing output make check | tee /dev/stderr | grep -q '15 test(s) have FAILED' else make check fi # Ensure brew gettext is in the PATH so xgettext is found on OS X PATH="$PATH:/usr/local/opt/gettext/bin" make prefix= DESTDIR="${HOME}" $INSTALLTARGET fi set +e after_success: - if [ "$CONFIG" = "coverage" ] ; then coveralls --gcov-options '\-lp'; fi gpscorrelate-2.0/COPYING000066400000000000000000000431311355604302400151040ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. gpscorrelate-2.0/INSTALL000066400000000000000000000040141355604302400150770ustar00rootroot00000000000000Installation of GPS Correlate ============================= To build, you will need these prerequisites: * The Exiv2 library (C++ EXIF tag handling): http://www.exiv2.org/ * libxml2 (XML parsing): http://www.xmlsoft.org/ * pkgconfig: https://pkg-config.freedesktop.org/ * make, such as GNU makes: http://www.gnu.org/software/make/make.html * GTK+ (only if compiling the GUI)s: http://www.gtk.org * xsltproc (only for building the man page): http://xmlsoft.org/XSLT/ with manpages/docbook.xsl properly installed from http://docbook.sourceforge.net/projects/xsl/ or Internet access (xsltproc will download it automatically if it is not installed) You can build the command line version and the GUI together simply with: make and install it with: sudo make install Run the regression test suite with: make check The default build process will try to link against GTK3. To force linking against GTK2 run: make GTK=2 If the compiler can't find the necessary libraries, then set the PKG_CONFIG_PATH environment variable to the location of the .pc files first. To build only the command-line tool without the GTK dependencies, do: make gpscorrelate In both cases, pkg-config must be available to determine the compilation arguments for libxml2 and exiv2. gpscorrelate uses only standard features available in C99, POSIX and X/Open. Some C environments may not provide all the necessary features, and some environments may require compiling with the make command-line argument CFLAGS='-D_POSIX_C_SOURCE=200112L -D_XOPEN_SOURCE=600' to enable them. Alternately, you can compile gpscorrelate entirely with a C++ toolchain by compiling with make CC='$(CXX)' gpscorrelate comes translated into a number of languages, but support is not enabled by default as the gettext function is not universally available. To enable foreign language support, compile with "make CFLAGS=-DENABLE_NLS" (and LIBS=-lintl if required) and use the additional command "sudo make install-po" to install the message catalogs. Note that GNU make is required for this step. gpscorrelate-2.0/Makefile000066400000000000000000000111531355604302400155100ustar00rootroot00000000000000# Makefile for gpscorrelate PACKAGE_VERSION = 2.0 CC = gcc CXX = g++ EXEEXT = PKG_CONFIG=pkg-config CFLAGS = -Wall -O2 LDFLAGS = -Wall -O2 -lm GTK = 3 COBJS = main-command.o unixtime.o gpx-read.o correlate.o exif-gps.o latlong.o GOBJS = main-gui.o gui.o unixtime.o gpx-read.o correlate.o exif-gps.o latlong.o # Both BSD make and GNU make >= 4.0 support != to define the flags immediately # (which calls pkg-config once instead of on every compile), but until that GNU # make version is widespread, use this slower but more portable form. CFLAGSINC = `$(PKG_CONFIG) --cflags libxml-2.0 exiv2` GTKFLAGS = `$(PKG_CONFIG) --cflags gtk+-$(GTK).0` LIBS = `$(PKG_CONFIG) --libs libxml-2.0 exiv2` LIBSGUI = `$(PKG_CONFIG) --libs gtk+-$(GTK).0` CFLAGSINC += $(GTKFLAGS) # Put --nonet here to avoid downloading DTDs while building documentation XSLTFLAGS = prefix = /usr/local bindir = $(prefix)/bin datadir = $(prefix)/share mandir = $(datadir)/man docdir = $(datadir)/doc/gpscorrelate applicationsdir = $(datadir)/applications localedir = $(datadir)/locale DEFS = -DPACKAGE_VERSION=\"$(PACKAGE_VERSION)\" -DPACKAGE_LOCALE_DIR=\"$(localedir)\" -DPACKAGE_DOC_DIR=\"$(docdir)\" TARGETS = gpscorrelate-gui$(EXEEXT) gpscorrelate$(EXEEXT) doc/gpscorrelate.1 doc/gpscorrelate.html all: $(TARGETS) gpscorrelate$(EXEEXT): $(COBJS) $(CXX) -o $@ $(COBJS) $(LDFLAGS) $(LIBS) gpscorrelate-gui$(EXEEXT): $(GOBJS) $(CXX) -o $@ $(GOBJS) $(LIBSGUI) $(LDFLAGS) $(LIBS) .c.o: $(CC) $(CFLAGS) $(CFLAGSINC) $(DEFS) -c -o $@ $< .cpp.o: $(CXX) $(CFLAGS) $(CFLAGSINC) $(DEFS) -c -o $@ $< # Hack to recompile everything if a header changes *.o: *.h check: gpscorrelate$(EXEEXT) (cd tests && ./testsuite) clean: rm -f *.o gpscorrelate$(EXEEXT) gpscorrelate-gui$(EXEEXT) doc/gpscorrelate-manpage.xml tests/log/* $(TARGETS) distclean: clean clean-po rm -f AUTHORS install: all install -d $(DESTDIR)$(bindir) install gpscorrelate$(EXEEXT) gpscorrelate-gui$(EXEEXT) $(DESTDIR)$(bindir) install -d $(DESTDIR)$(mandir)/man1 install -m 0644 doc/gpscorrelate.1 $(DESTDIR)$(mandir)/man1 install -d $(DESTDIR)$(docdir) install -p -m 0644 doc/*.html doc/*.png README.md $(DESTDIR)$(docdir) install -d $(DESTDIR)$(docdir)/fr install -p -m 0644 doc/fr/*.html doc/fr/*.png $(DESTDIR)$(docdir)/fr install-desktop-file: desktop-file-install --vendor="" --dir="$(DESTDIR)$(applicationsdir)" gpscorrelate.desktop install -d $(DESTDIR)$(datadir)/icons/hicolor/scalable/apps install -p -m 0644 gpscorrelate-gui.svg $(DESTDIR)$(datadir)/icons/hicolor/scalable/apps/gpscorrelate-gui.svg docs: doc/gpscorrelate.1 doc/gpscorrelate.html # BSD make doesn't work with $< as the prerequisite in the following rules but $? is fine doc/gpscorrelate-manpage.xml: doc/gpscorrelate-manpage.xml.in sed -e 's,@DOCDIR@,$(docdir),g' -e 's,@PACKAGE_VERSION@,$(PACKAGE_VERSION),g' $? > $@ doc/gpscorrelate.1: doc/gpscorrelate-manpage.xml xsltproc $(XSLTFLAGS) -o $@ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $? doc/gpscorrelate.html: doc/gpscorrelate-manpage.xml xsltproc $(XSLTFLAGS) -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $? build-po: (cd po && $(MAKE) VERSION="$(PACKAGE_VERSION)" prefix="$(prefix)" top_srcdir="$(PWD)" update-po) (cd po && $(MAKE) VERSION="$(PACKAGE_VERSION)" prefix="$(prefix)" top_srcdir="$(PWD)" all) install-po: build-po (cd po && $(MAKE) VERSION="$(PACKAGE_VERSION)" prefix="$(prefix)" top_srcdir="$(PWD)" install) clean-po: (cd po && $(MAKE) VERSION="$(PACKAGE_VERSION)" prefix="$(prefix)" top_srcdir="$(PWD)" clean) AUTHORS: # Include authors here who aren't in the git commits (git log HEAD | sed -n -e '/^Author:/s/^[^:]*: //p' ; printf "\ Julio Castillo (Win32 support)\n\ Marc Horowitz (remove tag, timezone patches)\n\ Russell Steicke (mtime patch)\n\ Till Maas (install, doc patches)\n\ Vincent Gay (French translation)\n\ " ) | sort -u > $@ dist: AUTHORS docs mkdir gpscorrelate-$(PACKAGE_VERSION) git archive --prefix=gpscorrelate-$(PACKAGE_VERSION)/ HEAD | tar xf - install -m 0644 AUTHORS gpscorrelate-$(PACKAGE_VERSION) install -m 0644 doc/gpscorrelate.1 doc/gpscorrelate-manpage.xml doc/gpscorrelate.html gpscorrelate-$(PACKAGE_VERSION)/doc -rm gpscorrelate-$(PACKAGE_VERSION)/po/stamp-po cd gpscorrelate-$(PACKAGE_VERSION)/po && $(MAKE) VERSION="$(PACKAGE_VERSION)" prefix="$(prefix)" top_srcdir="$(PWD)" gpscorrelate.pot-update clean -rm gpscorrelate-$(PACKAGE_VERSION)/po/stamp-po tar cf gpscorrelate-$(PACKAGE_VERSION).tar gpscorrelate-$(PACKAGE_VERSION) -rm gpscorrelate-$(PACKAGE_VERSION).tar.gz gzip -9 gpscorrelate-$(PACKAGE_VERSION).tar rm -r gpscorrelate-$(PACKAGE_VERSION) gpscorrelate-2.0/README.md000066400000000000000000000044411355604302400153310ustar00rootroot00000000000000# GPSCorrelate ## Status [![Travis Build Status](https://travis-ci.org/dfandrich/gpscorrelate.svg?branch=master)](https://travis-ci.org/dfandrich/gpscorrelate) [![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/q9ooesujljat3ra7/branch/master?svg=true)](https://ci.appveyor.com/project/dfandrich/gpscorrelate) [![Cirrus Build Status](https://api.cirrus-ci.com/github/dfandrich/gpscorrelate.svg?branch=master)](https://cirrus-ci.com/github/dfandrich/gpscorrelate) [![Coverage Status](https://coveralls.io/repos/github/dfandrich/gpscorrelate/badge.svg?branch=master)](https://coveralls.io/github/dfandrich/gpscorrelate) GPSCorrelate was originally written by Daniel Foote. The maintainer is now Dan Fandrich . The GPSCorrelate home page is at https://dfandrich.github.io/gpscorrelate/ ## What is it? Digital cameras are cool. So is GPS. And, EXIF tags are really cool too. What happens when you merge the three? You end up with a set of photos taken with a digital camera that are "stamped" with the location at which they were taken. The EXIF standard defines a number of tags that are for use with GPS. A variety of programs exist around the place to match GPS data with digital camera photos, but most of them are Windows or MacOS only. Which doesn't really suit me that much. Also, each one takes the GPS data in a different format. So I wrote my own. A little bit of C, a little bit of C++, a shade of GTK+, and you end up with... what I have here. I wrote both a command line and GUI version of the program. ## Things you should know: * The program takes GPS data in GPX format. This is an XML format. I recommend using GPSBabel - it can convert from lots of formats to GPX, as well as download from several brands of popular GPS receivers. * The program can "interpolate" between points (linearly) to get better results. (That is, for GPS logs that are not one sample per second, like those I get off my Garmin eTrex GPS) * The resolution is down to one second. But that should be good enough for most things. (This is a limit of the EXIF tags format, as well as GPX) * For best results, you should synchronise your camera to the GPS time before you start taking photos. Note: digital cameras clocks drift quickly - even over a short period of time (say, a week). gpscorrelate-2.0/README.mingw32000066400000000000000000000012201355604302400162070ustar00rootroot00000000000000To compile the windows version you need a mingw32 cross compiler toolchain (binutils, gcc, g++, etc). See this page for more pointers http://www.ecn.wfu.edu/~cottrell/cross-gtk/ To compile gpscorrelate for win32 you need cross-compiled versions of: libiconv gettext cairo atk libpng libxml2 pango pixman zlib expat fontconfig freetype gettext glib2 gtk2 exiv2 Once you have all the dependencies cross-compiled, export PKG_CONFIG_PATH to the database of your toolchain environment (something like /usr/i486-mingw32/lib/pkgconfig/) Finally run: make EXEEXT=.exe (README.mingw32 was written and contributed by Julio Castilo. Thanks!) gpscorrelate-2.0/RELEASES000066400000000000000000000171001355604302400151740ustar00rootroot00000000000000Release History: v2.0: 28 October 2019 - gpscorrelate moved to Github and Dan Fandrich took over maintenance. The new home page is https://dfandrich.github.io/gpscorrelate - Now writing GPSTimeStamp tag as unsigned rational, as per spec - Now writing GPSDateStamp tag as ASCII, as per spec - Added automatic time zone offset detection by default (the previous behaviour can be selected with "-z 0") - GUI now displays the version number in the title bar - File loading dialogs now have appropriate filters on file extensions - Stop documenting the -p option, which never worked (--degmins hasn't been touched) - Store GPS coordinates in such a way as to preserve the number of significant figures of the original data - Use pkg-config to get the exiv2 compiler flags when building - Renamed OFLAGS to LDFLAGS in the Makefile which is a more common name - Use presence of the GPSLatitude tag instead of GPSVersionID as an indicator of the presence of GPS tags (some cameras write GPSVersionID even when they don't write any GPS location tags) - Don't record a GPSMapDatum tag if the string is blank - The -g option can be used multiple times to specify multiple GPX files - GUI now allows multiple GPX files to be selected - Exit status in command-line client now reflects if any image encountered a fatal or nonfatal error - Fixed NULL pointer dereference with GPX files containing a single point - Stop ignoring the last point in a track with --no-interpolation - The progress graph that shows while processing many images on a slow machine is now displayed as the files are processed. - --machine output is no longer dependent on the current locale - Properly escape quotes in file names in --machine output - Fixed time calculations spanning DST discontinuities - Added a dist target to create a tar ball from git - Only write an altitude tag if it exists in the GPX file - Added a comprehensive test suite of the CLI - Prevent duplicate GPS tags in the final file (which could happen if some tags already existed before correlation) - Stop overwriting files when --no-write is used with --remove (Debian bug #576744) - Added French, German and Russian translations of program text using gettext - Added a French translation of most documentation other than the man page - Added continuous integration builds on Linux, OS X, FreeBSD and Windows - Added support for GTK3 and made that the default - Added --latlong option to supply a coordinate manually - Integrated Windows support into the main makefile - Added the ability to overwrite existing tags with --replace - Added Help and About buttons to the GUI v1.6.1: 13 February 2010 - Added desktop icon created by Till Maas. - Added a patch to fix future build issues on Fedora. v1.6.0: 5 April 2009 Added another patch that I forgot to include in 1.5.9. Thanks again Eugeniy. v1.5.9: 4 April 2009 Incorporated patches from the new Debian maintainer: - Fixes crash on empty tags - Fixes writing of negative altitudes. - Fixes display of negative altitudes. - Fixes invalid use of Exiv2 toRational(). Thanks Eugeniy for organising all these fixes; you did all the work - I just applied the patches you supplied. v1.5.8: 1 November 2008 The 'Till Maas' release. - Added gpscorrelate.desktop contributed by Till. - Added patches for the Makefile by Till, to improve the installation. - Added manpage, originally from Debian, but converted to XML by Till. - Added patches for the Makefile by Till, to configure and install the manpages. - Added patches by Till to remove compilation warnings. - Thanks for your work! v1.5.7: 21 September 2008 - Fixed a bug where altitude data was not read correctly if the value was negative - instead it would read positive. It was always written correctly, though. Thanks to Andrzej Novak for pointing this one out. - Added an 'install' target to the makefile provided by Till Maas. Thanks! - Update the GUI to remember the last directory for Photos and GPX data when using the file chooser dialog. This also persists across program invocations. This was suggested by Till Maas. - Added Makefile.mingw32 contributed by Julio Castillo, which allows cross compilation on Win32. This also included some cross-platform patches for the code, which is greatly appreciated. v1.5.6: 1 October 2007 - Incorporated patch from Marc Horowitz that allows gpscorrelate to correctly calculate negative timezone adjustments. Previously, the minutes were not subtracted from the timezone adjustment. v1.5.5: 20 August 2007 - Made altitude data in GPX files optional. This should have been the case since the beginning, but it seems it was not. v1.5.4: 22 June 2007 - Added Photo Offset time, as a fine adjustment between photo time and GPS time. Read the docs to understand it. - GUI now has extra settings, and a "Strip GPS tags" button. - GUI Now remembers settings on exit, into ~/.gpscorrelaterc. These are reloaded next time the GUI is started. v1.5.3: 20 June 2007 - GPS coordinates, including altitude, are not written as Rational values instead of Signed Rational values, this now meets the EXIF specifications. - Default format for writing coordinates is now DD MM SS.SS. The old behaviour can be forced with the --degmins parameter. - If altitude is negative, the correct sea level reference value is now written. v1.5.2: 6 June 2007 - Fixed bug where program would die with uncaught exception if input files were not JPEGs at all. Now the exception is caught. - Fixed very silly bug where timestamps were incorrectly calculated: in struct tm, I didn't realise that tm_mon was 0-based, and didn't decrement it. This caused failures on dates spanning months with different numbers of days. Because the timestamps inside EXIF data and the timestamps from GPX data were converted the same way, the matching still worked. The date part is written as GPSDateStamp, which is wrong, and thus a --fix-datestamp option is provided. - Turns out GPS Timestamp wasn't correct either. This time was out by the local timezone. This did not affect matches. --fix-timestamps will fix this as well. - Added a --version option. v1.5.1: 3rd April 2007 Included patch from Marc Horowitz (an MIT one) to correctly remove all GPS tags when using the "remove GPS tags" feature. It seems my original code missed two. The patch instead iterates over the tags and removes anything starting with "Exif.GPSInfo". Thanks! v1.5: 24 Feb 2007 Fixed very silly bug where it would segfault on certain GPX files. Turns out those GPX files don't have time data on the trackpoints, and this is due to that track coming from certain parts of the GPS memory (where the timestamps get stripped to save space on the GPS device itself). This is something gpscorrelate should have handled. v1.4: 28 May 2006 Added option to preserve mtime on input photos. Patch submitted by Russell Steicke. (http://adelie.cx/). Also added patch to make GPX read correctly in non-C locales - would interpret "." as thousands separator in some locales. v1.3: 25 April 2006 It would appear that the Exiv2 API changed somewhat. And gpscorrelate didn't work. Reported to me by a friendly chap. Now fixed to work correctly with the latest Exiv2 v0.9.1. v1.2: (Not released until 1.3) Added --machine/-o option. This outputs the tags from the passed files in a machine-readable CSV output. v1.1: 1 Mar 2005 Instead of ignoring track segments, we record them now, and by default don't interpolate between them. This can be disabled, ie, match between track segments. v1.0: 24 Feb 2005 Initial release. gpscorrelate-2.0/correlate.c000066400000000000000000000253011355604302400161740ustar00rootroot00000000000000/* correlate.c * Written by Daniel Foote. * Started Feb 2005. * * The functions in this file match the timestamps on * the photos to the GPS data, and then, if a match * is found, writes the GPS data into the EXIF data * in the photo. For future reference... */ /* Copyright 2005-2018 Daniel Foote, Dan Fandrich. * * This file is part of gpscorrelate. * * gpscorrelate 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. * * gpscorrelate 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 gpscorrelate; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include "gpsstructure.h" #include "exif-gps.h" #include "correlate.h" #include "unixtime.h" #define MIN(a,b) (((a)<(b))?(a):(b)) /* Internal functions used to make it work. */ static void Round(const struct GPSPoint* First, struct GPSPoint* Result, time_t PhotoTime); static void Interpolate(const struct GPSPoint* First, struct GPSPoint* Result, time_t PhotoTime); /* This function returns a GPSPoint with the point selected for the * file. This allows us to do funky stuff like not actually write * the files - ie, just correlate and keep into memory... */ struct GPSPoint* CorrelatePhoto(const char* Filename, struct CorrelateOptions* Options) { /* Read out the timestamp from the EXIF data. */ char* TimeTemp; int IncludesGPS = 0; TimeTemp = ReadExifDate(Filename, &IncludesGPS); if (!TimeTemp) { /* Error reading the time from the file. Abort. */ /* If this was a read error, then a seperate message * will appear on the console. Otherwise, we were * returned here due to the lack of exif tags. */ Options->Result = CORR_NOEXIFINPUT; return NULL; } if (IncludesGPS && !Options->OverwriteExisting) { /* Already have GPS data in the file! * So we can't do this again... */ Options->Result = CORR_GPSDATAEXISTS; free(TimeTemp); return NULL; } if (Options->AutoTimeZone) { /* Use the local time zone as of the date of first picture * as the time for correlating all the remainder. */ time_t RealTime; /* PhotoTime isn't a true epoch time, but is rather out * by the local offset from UTC */ time_t PhotoTime = ConvertToUnixTime(TimeTemp, EXIF_DATE_FORMAT, 0, 0); /* Extract the component time values */ struct tm *PhotoTm = gmtime(&PhotoTime); /* Then create a true epoch-based local time, including DST */ PhotoTm->tm_isdst = -1; RealTime = mktime(PhotoTm); /* Finally, RealTime is the proper Epoch time of the photo. * The difference from PhotoTime is the time zone offset. */ Options->TimeZoneHours = (PhotoTime - RealTime) / 3600; Options->TimeZoneMins = ((PhotoTime - RealTime) % 3600) / 60; Options->AutoTimeZone = 0; } //printf("Using offset %02d:%02d\n", Options->TimeZoneHours, Options->TimeZoneMins); /* Now convert the time into Unixtime. */ time_t PhotoTime = ConvertToUnixTime(TimeTemp, EXIF_DATE_FORMAT, Options->TimeZoneHours, Options->TimeZoneMins); /* Add the PhotoOffset time. This is to make the Photo time match * the GPS time - ie, it is (GPS - Photo). */ PhotoTime += Options->PhotoOffset; /* Free the memory for the time string - it won't otherwise * be freed for us. */ free(TimeTemp); /* Search the list of GPS tracks to find one containing the range * we're interested in. Options points to an array with the last * entry denoted by a NULL Points pointer. */ int TrackNum; for (TrackNum = 0; Options->Track[TrackNum].Points; ++TrackNum) { /* Check that the photo is within the times that * our tracks are for. Can't really match it if * we were not logging when it was taken. * Note: photos taken between logging sessions of the * same file will still make it inside of this. In * some cases, it won't matter, but if it does, then * keep this in mind!! */ if ((PhotoTime >= Options->Track[TrackNum].MinTime) && (PhotoTime <= Options->Track[TrackNum].MaxTime)) break; } if (!Options->Track[TrackNum].Points) { /* All tracks were outside the time range. Abort. */ Options->Result = CORR_NOMATCH; return NULL; } /* Time to run through the list, and see if our PhotoTime * is in between two points. Alternately, it might be * exactly on a point... even better... */ const struct GPSPoint* Search; struct GPSPoint* Actual = (struct GPSPoint*) malloc(sizeof(struct GPSPoint)); Options->Result = CORR_NOMATCH; /* For convenience later */ for (Search = Options->Track[TrackNum].Points; Search; Search = Search->Next) { /* First test: is it exactly this point? */ if (PhotoTime == Search->Time) { /* This is the point, exactly. * Copy out the data and return that. */ Actual->Lat = Search->Lat; Actual->LatDecimals = Search->LatDecimals; Actual->Long = Search->Long; Actual->LongDecimals = Search->LongDecimals; Actual->Elev = Search->Elev; Actual->ElevDecimals = Search->ElevDecimals; Actual->Time = Search->Time; Options->Result = CORR_OK; break; } /* Sanity check / track segment fix: is the photo time before * the current point? If so, we've gone past it. Hrm. */ if (Search->Time > PhotoTime) { Options->Result = CORR_NOMATCH; break; } /* Sanity check: we need to peek at the next point. * Make sure we can. */ if (Search->Next == NULL) break; /* Sanity check: does this point have the same * timestamp as the next? If so, skip onward. */ if (Search->Time == Search->Next->Time) continue; /* Sanity check: does this point have a later * timestamp than the next point? If so, skip. */ if (Search->Time > Search->Next->Time) continue; if (Options->DoBetweenTrkSeg) { /* Righto, we are interpolating between segments. * So simply do nothing! Simple! */ } else { /* Don't check between track segments. * If the end of segment marker is set, then simply * "jump" over this point. */ if (Search->EndOfSegment) { continue; } } /* Sort of sanity check: is this photo inside our * "feather" time? If not, abort. */ if (Options->FeatherTime) { /* Is the point between these two? */ if ((PhotoTime > Search->Time) && (PhotoTime < Search->Next->Time)) { /* It is. Now is it too far * from these two? */ if (((Search->Time + Options->FeatherTime) < PhotoTime) && ((Search->Next->Time - Options->FeatherTime) > PhotoTime)) { /* We are inside the feather * time between two points. * Abort. */ Options->Result = CORR_TOOFAR; free(Actual); return NULL; } } } /* endif (Options->Feather) */ /* Second test: is it between this and the * next point? */ if ((PhotoTime > Search->Time) && (PhotoTime < Search->Next->Time)) { /* It is between these points. * Unless told otherwise, we interpolate. * If not interpolating, we round to nearest. * If points are equidistant, we round down. */ if (Options->NoInterpolate) { /* No interpolation. Round. */ Round(Search, Actual, PhotoTime); Options->Result = CORR_ROUND; break; } else { /* Interpolate away! */ Interpolate(Search, Actual, PhotoTime); Options->Result = CORR_INTERPOLATED; break; } } } /* End for() loop to search. */ /* Did we actually match it at all? */ if (Options->Result == CORR_NOMATCH) { /* Nope, no match at all. */ /* Return with nothing. */ free(Actual); return NULL; } /* Write the data back into the Exif info. If we're allowed. */ if (Options->NoWriteExif) { /* Don't write exif tags. Just return. */ return Actual; } else { /* Do write the exif tags. And then return. */ if (WriteGPSData(Filename, Actual, Options->Datum, Options->NoChangeMtime, Options->DegMinSecs)) { /* All ok. Good! Return. */ return Actual; } else { /* Not good. Return point, but note failure. */ Options->Result = CORR_EXIFWRITEFAIL; return Actual; } } /* Looks like nothing matched. Free the prepared memory, * and return nothing. */ free(Actual); return NULL; } void Round(const struct GPSPoint* First, struct GPSPoint* Result, time_t PhotoTime) { /* Round the point between the two points - ie, it will end * up being one or the other point. */ const struct GPSPoint* CopyFrom = NULL; /* Determine the difference between the two points. * We're using the scale function used by interpolate. * This gives us a good view of where we are... */ double Scale = (double)First->Next->Time - (double)First->Time; Scale = ((double)PhotoTime - (double)First->Time) / Scale; /* Compare our scale. */ if (Scale <= 0.5) { /* Closer to the first point. */ CopyFrom = First; } else { /* Closer to the second point. */ CopyFrom = First->Next; } /* Copy the numbers over... */ Result->Lat = CopyFrom->Lat; Result->LatDecimals = CopyFrom->LatDecimals; Result->Long = CopyFrom->Long; Result->LongDecimals = CopyFrom->LongDecimals; Result->Elev = CopyFrom->Elev; Result->ElevDecimals = CopyFrom->ElevDecimals; Result->Time = CopyFrom->Time; /* Done! */ } void Interpolate(const struct GPSPoint* First, struct GPSPoint* Result, time_t PhotoTime) { /* Interpolate between the two points. The first point * is First, the other First->Next. Results into Result. */ /* Calculate the "scale": a decimal giving the relative distance * in time between the two points. Ie, a number between 0 and 1 - * 0 is the first point, 1 is the next point, and 0.5 would be * half way. */ double Scale = (double)First->Next->Time - (double)First->Time; Scale = ((double)PhotoTime - (double)First->Time) / Scale; /* Now calculate the Latitude. */ Result->Lat = First->Lat + ((First->Next->Lat - First->Lat) * Scale); Result->LatDecimals = MIN(First->LatDecimals, First->Next->LatDecimals); /* And the longitude. */ Result->Long = First->Long + ((First->Next->Long - First->Long) * Scale); Result->LongDecimals = MIN(First->LongDecimals, First->Next->LongDecimals); /* And the elevation. If elevation wasn't set, it should be zero with * a negative ElevDecimals, which will cause it to be dropped * when written. */ Result->Elev = First->Elev + ((First->Next->Elev - First->Elev) * Scale); Result->ElevDecimals = MIN(First->ElevDecimals, First->Next->ElevDecimals); /* The time is not interpolated, but matches photo. */ Result->Time = PhotoTime; /* And that should have fixed us... */ } gpscorrelate-2.0/correlate.h000066400000000000000000000054711355604302400162070ustar00rootroot00000000000000/* correlate.h * Written by Daniel Foote. * Started Feb 2005. * * This file contains the options structure and prototypes for * functions in correlate.c. */ /* Copyright 2005-2018 Daniel Foote, Dan Fandrich. * * This file is part of gpscorrelate. * * gpscorrelate 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. * * gpscorrelate 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 gpscorrelate; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* A structure of options to pass to the correlate function. * Not really sure if this is needed, but... */ struct CorrelateOptions { int NoWriteExif; int OverwriteExisting; int NoInterpolate; int NoChangeMtime; int TimeZoneHours; /* To add to photos to make them UTC. */ int TimeZoneMins; int AutoTimeZone; int FeatherTime; char* Datum; /* Datum of the data; when writing. */ int DoBetweenTrkSeg; /* Match between track segments. */ int DegMinSecs; /* Write out data as DD MM SS.SS (more accurate than in the past) */ int Result; int PhotoOffset; /* Offset applied to Photo time. This is ADDED to PHOTO TIME to make it match GPS time. In seconds. This is (GPS - Photo) */ struct GPSTrack *Track; /* Pointer to array of tracks to use. The last track must be entirely zeros. */ }; /* Return codes in order: * _OK - all ok. Correlated exactly. * _INTERPOLATED - all ok, interpolated point. * _ROUND - point rounded to nearest. * _NOMATCH - could not find a match - photo timestamp outside GPS data * (This could be due to timezone of photos not set/set wrong). * Returns NULL for Point. * _TOOFAR - point outside "feather" time. Too far from any point. * Returns NULL for Point. * _EXIFWRITEFAIL - unable to write EXIF tags. * _NOEXIFINPUT - The source file contained no EXIF tags, or not the one we wanted. Hmm. * Returns NULL for Point. * _GPSDATAEXISTS - There is already GPS data in the photo... you probably don't want * to fiddle with it. * Returns NULL for Point. */ #define CORR_OK 1 #define CORR_INTERPOLATED 2 #define CORR_ROUND 3 #define CORR_NOMATCH 4 #define CORR_TOOFAR 5 #define CORR_EXIFWRITEFAIL 6 #define CORR_NOEXIFINPUT 7 #define CORR_GPSDATAEXISTS 8 struct GPSPoint* CorrelatePhoto(const char* Filename, struct CorrelateOptions* Options); gpscorrelate-2.0/doc/000077500000000000000000000000001355604302400146145ustar00rootroot00000000000000gpscorrelate-2.0/doc/concepts.html000066400000000000000000000313701355604302400173240ustar00rootroot00000000000000 GPS Correlate Documentation: Concepts

GPS Correlate Documentation: Concepts


Step 1: Taking photos and recording GPS data.

Before you can correlate any photos with GPS data, you first have to have some photos and some GPS data. This generally involves walking/driving/going somewhere, taking photos, and taking a GPS or smartphone tracking app with you.

Just about all smartphones these days have GPS built-in and it just takes an tracking app to do the job. There are a multitude of apps for all popular smartphone platforms, including good free ones. They often store a track in GPX format that you can download to your computer and use directly. Some will upload your track to a cloud service that you can download easily from a web site.

Another option is a ruggedized standalone GPS unit. Most of these have a "tracklog" facility that record where you have been. The resolution of these tracks is widely variable - my old Garmin eTrex GPS records up to 1600 data points, at around 20 metres between each point. This works out to travelling about 500 kilometres (by car) or 50 kilometres (on foot) before you run out of memory. (These numbers vary very much depending on many factors.)

Other GPS devices will vary in their capacity. If you are using a GPS device made only for a computer, or have attached your GPS device to a computer, you may wish to log the data on the computer. In this case, you will probably end up logging the one second fixes, which results in a fair bit of data (nothing excessive), but very accurate results.

As to taking the photos? Not too many digital cameras add GPS data to the photos themselves - although they do exist. If you have one, then you don't need this program!

Besides that, take photos as you normally would. The correlation program matches photos to GPS data by their timestamp, so it would be a good idea to synchronise the cameras time to the time from the GPS before you start taking photos. (Not the other way around: the GPS gets its time from the satellites, which means that it is probably correct... and most GPSs will not allow you to set their time, anyway).

The photos will have to be tagged with "EXIF tags", which describe metadata about each photo, including the date and time it was taken. These tags are embedded in the photos themselves. That is pretty much standard for digital cameras nowadays, however, some very very very old digital cameras (like the ancient floppy-disk Sony Mavica that a family member owns) don't store EXIF tags. These will not work with this program. There are probably ways around this, though - but they are outside what I am talking about here. (Give me half a second, and I'd start talking about writing a script to grab... no, better stop there...)

When you are finished the photo shoot, download the photos as normal and get ready. Mind that any permanent rotations or editing you do do not remove the EXIF tags.

What you need to know:

  • Synchronise your camera's time from the GPS time. Don't ask, just do it. And do it just before your photo shoot. If you forget, take a picture of your GPS screen before you're done. You can calculate the time offset later by comparing the EXIF time with the time on the screen.
  • Use a GPS or an app that has a tracklog capability. Most do - although the quality/resolution varies.
  • Take your GPS with you, and keep it close to the camera. GPS is accurate down to several meters, so use your discretion as to what "close" means.

Step 2: Getting the GPS data ready.

The GPS correlate program accepts GPS data in the GPX format: an open XML format. The format is quite arbitrary, and, naturally, everyone has their own GPS file format. So, in that way, this program is no exception. But, since that's the only format it supports, you'll have to arrange that your track information is made available in a GPX file.

A smartphone app might have an export or share function to create a track file. Once you do that, you attach your phone to a computer and browse to the location with the file. Or, the app might upload your tracks to a cloud service (automatically or on request). In that case, you'll need to log in to the web site on your computer and use the download function.

Exactly how you will get the GPS data from a discrete device is very much device dependant. Many devices have USB cables cables to download the data (although the USB cables are often glorified USB-to-serial converters). What format it will turn out as is also the big question. I personally recommend GPSBabel, which can convert between many formats (thus translating from whatever strange one your downloading method/program produces) and can also download from Garmin and Magellan GPS devices directly (so you can download straight to GPX and retain lots of useful metadata, like track segments).

If you logged the GPS data with a computer... well, it could be any format, depending on how it is logged. One trick would be to log the NMEA sentences as they came from the GPS directly into a file. Once the logging is done, GPSBabel can convert these NMEA sentences directly into GPX format. Usually these are one second fixes, so this would yield very good results - however, lugging around a laptop to log the data might not be convenient.

The other thing to know about GPX is that is stores data quite cleverly, separating tracks into "track segments". This can be explained quite simply with an example. When I drive through a tunnel with my GPS, it has no reception in the tunnel. My GPS records this lack of signal on the map by not showing a track between the points where I was in the tunnel. GPSBabel correctly reads this and enters this in the GPX file by separating the segments with "track segments".

Prior to version 1.1, this program ignored track segments and just hauled out points and considered them to be a single track. So if a photo was taken in between the time where there was no GPS data, you would not get a correct answer (depending on the situation). In current versions, the program will not match a photo between track segments. You can, however, choose to revert this behaviour. If the track was segmented during a period of steady, linear movement (like driving through a straight tunnel), then the interpolated position between segments will still end up being pretty accurate. Also, some apps will stop logging the position if you stay still for a while. The end of one segment will then be the same location as the beginning of the next. In those cases it makes sense to interpolate between segments.

What you need to know:

  • The result of downloading the GPS data could be any format. Convert it with GPSBabel to GPX format, or better yet use GPSBabel to download the data in the first place.
  • Absolute best results would be logging NMEA sentences to file, and then GPX'ing it with GPSBabel. This will give you lots of one second fixes. Very accurate.
  • The GPX format is good for archiving tracks. Due to its XML nature, it should be readable for a while to come yet.
  • The GPX file is split up into "track segments". Generally these define when you were or were not logging GPS data. This program does not interpolate between track segments, by default.

Step 3: Getting ready to correlate.

To correlate, you need photos and GPS data. I assume the last two steps would have resulted in a series of JPEG files with EXIF tags, and a GPX file with a "tracklog" of where you have been when you took the photos.

The last thing you need to know is the timezone that the camera is set to. GPS data is always in UTC, so when we correlate the photos, we need to know how much to add or subtract to the photos time to make the photo's time UTC. Just "know" this value; there are places to enter this in in the program.

(This also assumes that the camera is set for local time where you are taking the photos. It is really arbitrary, so long as you know the difference between your camera's time and UTC. If you really wanted, just set the camera to UTC and be done with it... although that's not so friendly when you try to use the EXIF data for other things. Up to you.)

As an example, here in Perth, Western Australia, the timezone is +8:00. So that is the value that I use when correlating the photos. But since version 2.0, you usually don't need to worry about time zones. The program will automatically choose one by assuming that the camera's time is the same as the computer's time. This breaks down when you go on vacation in another time zone and change the camera's time to match, then go home and correlate your photos. You'll be using the wrong time zone offset and correlation won't work properly. Just disable automatic time zone selection in this case and give the offset yourself.

There is an option to add an offset to the photo time to make it match up with GPS data. An example case is where you forget to set the camera clock so you take a photo of your GPS screen showing the current time. You can use this to calculate the difference between the GPS' time and the photos time.

Example calculations:

GPS Time in Photo:  10:10:10
Timestamp on Photo: 10:09:30
GPS - Photo:             +40

GPS Time in Photo:  10:10:10
Timestamp on Photo: 10:11:30
GPS - Photo:             -80

The value determined in the above examples becomes the "Photo offset" time, in seconds, which is added to the photo's timestamp before the correlation is performed.

What you need to know:

  • The timezone the camera was set to when taking photos. In hours and minutes, for example: +8:00.
  • You can fine tune the offset between the GPS time and the photo's time. Use the photo offset function to set this.

Step 4: Correlation.

Time to correlate! Exactly how this is performed depends on whether or not you use the GUI version (prettier) or the command line version (scriptable).

Now there are a few options to consider when deciding how to allow the program to determine exactly the location at which the photo was taken. The program works down to the second. If you have one second GPS fixes available, then the photos will be matched exactly with a point having exactly the same timestamp. As this is the accuracy of the camera, and the accuracy of the GPS - you can not get much more accurate than this with the given equipment.

When there is less than one second data rate available, there are a few options available to make the results more accurate. By default, if the program finds photos between points, it will linearly interpolate between the points to determine the correct location of the photo.

You may not wish to allow the interpolation, for whatever reason. If you disable interpolation, then the program will instead "round" to the nearest point. That means that the photo will be set to have the location that is the recorded closest fix in time (rounding down if you manage to exactly center it).

The final major setting has many names, of which I can not decide the best one for. Sometimes I call this "feather time", and other times I call this "max distance". In any event, this setting, specified in seconds, defines the furthest time from any recorded GPS point that a photo will be matched. For example, if two GPS data points are 15 minutes apart, and you took a photo in the middle, you may not wish to match this, as the camera might well have been somewhere else. In this case, set the "max distance" to the maximum time from a recorded point that you want a photo matched. In the above example, you might set it to 60 seconds, if you know how often your GPS is likely to take another data point. Some GPS trackers stop recording location points if you stop moving, in which case you can still get accurate correlation results even with a very large "max distance".

What you need to know:

  • You can use the GUI version if that suits you better.
  • Or there is always the dependable command line version.
  • By default, the program linearly interpolates. If disabled, it rounds to the nearest point.
  • "Feather time" or "max distance", in seconds is the maximum time from a data point that a photo will be matched.

Return to the contents gpscorrelate-2.0/doc/corr.png000066400000000000000000001740141355604302400162760ustar00rootroot00000000000000PNG  IHDRUb0 pHYs+IDATxց DPuq&Q$$=lMG׸?$;z%[痝pn#M}wafffffe D%NLgV(uK=~<$-2TXhu{ !QAA1TzC45K q)!H] /tY`]Ő@HAA; bMH6'6Q߰b^ՎN> AAD. Dy9!6Nvls O]4%$ -ҡ{>,ϳAQ^{q iZoeCqu_娱~ǿޠ32)NRĹ{2.,q/"gY Xj*;xo+'<CoeeY{睻|ß`"oJuݔb:H~ bu!ND!&4 +!ȵ!qSs\$˾qO+&_uґzc61I(ߏJGؐgBZdzӋr#6cJtjXk0?Ie,5QŁo p}YMn`N貢kWyOWMߞyNJ˖.ιe w :Al`a?8aLs35 .]ƣd<8H#_`2f-!zEmgc-\'Us};T ykYNf-1\ᄀ4Op>SSsIY]LyXX|]gv%VZ74=Ko「.K`_q\Y|_/z;?ϸℭY07 m $K~lPFrLu_)&yOY3 )K6ajHG9%FCpCw~VFR|;#x#[>&!HkJBA wḷ(ҳ@SQ7[eyq+,]~Q_g)0x_i3n^ 9 0=[ += 1۞ K rx5`nu^a *@8ݰĕ@|"?48>$^) VBPFrLJ܉E:K{mWįuA?{/p&c*Vw~VFhqAUɤCDo| ɾc =.x2;^1 1 ,g7N5:WXle}u3?$>-D|~E;A+OAO5޸JiO#fkMouKz5yMREKt oƜϼ!ïxrǿaz6wAn՞Rbo>>MqzF4J< ϚRd"o*Kq]P_֧)KrT%apGeH2GDI.`S5 OoʀNF„F D5KV?-A(XOh/X>uS!]w??q_W8kG2#h /Uoَ՗{@1?S +;Ak1V/e'G4Ȳ]j$-ag+R\>t#OKт;aaWE\&"+;eDWj-{0*Ӏ/u3y(f?n L,k#By(xV<T%[#,/wŐ_舶$DliO۪;0&Tϴ&Yё0Ns!_Y厥xZTn{-'"K^mKmi]=Pw k^t_[Y+ FP$qAܲHY3d%^co([6=d'ZG8)KAawE\[cMZ@L ʲ<F<4&E ܰrDFEAᨌ˴+8Z0'1t7,Mk5S,.ep1R/7)D'|Տ[:J1/NGW7r2ڛ9 ;AR t wSُ߫uYhnT>gO>vq}W;?޻w鳦ϙWXlW~4$AA1p܋+I(NJd=eQqueK׳fgrl2s\3:Q2CaBAA,G`hP^e|nC+lNoV/d-!(~  ` )ɫ{a Ol3:ty9ml֣ٷfu13~ڵkfd̬U?+ yEAA/et,u3"B,|wn+B !'"kG @dY֎sQ]23333333333333333XUL67=M$9v$+?DB"ĭz'FWԗ,SK,8̜=h*R~= H3 ZĕUHb*\02J2?|D6Q3fg_ 6%]?Oe׮_?| bF˾RRO?ɧϜ\BE~{,ZL75}"ĭz'F.\4}Dj0-JܪwBm$g\ey0~5gpةKWK->Sfss4!# &Ԥms/&|^8~ ihj;?1+Wx2=R>b_bDoLA6{=1ΏrRK̥g|M5O'&)U.ɟ}Zf?iw_6mֳZ&pXoܧ_c9E"?D21!}V3~ʮ=zrO:N>y }' w2KyѠQcP?CˀAG*TlJGS*@Lx{3 w!Ǖ]j޲UydѰq\*ђzJoinW^}Zm{^TT78TtYsZm \2(BE1k\XC5U/]Rodd$ k2jkԪ o>^m_¼X;v2J6j?ཱུsl; Μ-;^[DMkr@$YBSٶ}* +!iަ  Jb!\<ι"(1 rCl11cg$vgаISÀ-!&30HXF{[4%{b|̓?qz2I9, j&?AEּydWkxFG ~%גmrH\Լy˒bLF9sj֩Ub(9O'O~=UQf:>z[DqBLf`/~WY&hNkΜE:tC2ER$5I/|Lٻ{A%3I G8W+/{}Ξ;@2݃gF9gprm.^yϘ5V}/K_mڵb !0a x?@|I5H: Z[=d&?!M;RgvD\V?RT79hky~/!&3(_;wa$!nc1aÚ?/B%4.WrRZǎh PђAf'O(@ַwr?y,?aq"Q桠 !4UR5g}ޱ>Jrs?~(1̠_W8lg&af\a%v$kP\ӷoߣ[_raDt㚶hI:ibH6jێd u44D$.U6d_=KV;W$^AeϕE[1 ,.3^2s7%7&$})[^kƕK9}z gzLX;Z>dTA$`wfB"vFܪwlC[ `;wZ~Mq=^ĭz'F?/_!m?=Q헷@AŪQ  ==y4)hWVdp?kGIa¤} knٺ JIvZrt8#?=ĕUH,2nwgb 5@P( u=; Lu?_WJe>m 67e̾B>5f,!C BP(S[ÄS>7ߙ%DsrǍ>ߐoQ ;vP( ;-hpH"~;w銠BbbJq79'NrI?!ձU(pk]ACbEs挛RRКBPAߛo 񧟉'n`Μv;fҤm;|xH@MJRrI^mӶs/ݻ&'+W_y3oWW }#ײvᅴyˎ;p{,Z،^I_H7<+a322PtyH;jϾ}n^|c+P g?-y$tʳUγ`BO{Ϟ&gdL^Nht:)@xX=b$k "m7adV;jm}BGv>ɦkhhmAXrӧ9r|Ĩ< X Uî{;#|rrsChwl>zV0ϐHI4([~= !C/S&a UH "s~G@i!Ō?$r5=_h(va~ ou3n:C1xeffK'}uuuEEE7ϹcS?tyIKK|A3oy6ٞ* "~Z?~ʳU#g&On~BBд/u 9>z#3z>(7=Z]]ՌLHU!ŏn 3d ;X``hP6 1a8L..#E̋'M:pYP1qo! ߳Nk)YӦ{ESx1wu\ fH!0MRcO! .)_=(&IUyl;&O+p?~N0[Mr#(Ԯ+LY_pudUEikEPAq]8;8!U/f_`ݻz5O=7SAMaG,]y`kJx&I!bX&rl:ǂv-L4>67Dr775OP(V06CGw2NٸxQ;p0”JM9}l:[m:?18Gsէb`EH\| .ײWI BPA(K^kמӯgWtؑ4f{!\/GyM` BPu(xa?nr#9ܺuK3هq5=.< ̆ٲ?[#FRga#;;_h}5\B0?./dnF)۹[w.s{. Bݏ?rv;ʫ8ܮ6/6v,9PVHl̙͛3;TVVz,X*{gY i#%#UQg?m]ZV>z D50s,V>="XPXdAE{=ԳkE?8 9f B!M7=q1=KǓǽr]rӧ,5ڳ$"9B.[N4ߏM,''G_swj[[],/S1EIӣwDaґ|EBzpE/&`%\۽gmG2Lسwo>!Wx;=J B]`x^~>@[>ٺm{?SV_ӽqӁܮ#?SVCyle}EFE͙9kVuM!Æi,7^C^~VRRB7VZuCom>j'>/..y+mAZgڕ++,ǣe嬧e䲠j,=ە R[&"YVC_<),M_HD]Sτɓ(i4ُ,8{ٺo=L]-sؤ_LH0Wz8_Ee%qvP,a6 FٟD9LOTS[<2rW?@c8xpcr875LWriM#EHQxxbqI'tQB!nG8%\\P2iADv c(ϓ8=jTb( ;tLA:)=K^^Yu5 gf]/(Sf:&'R\IPtx>†pDs#%~M]T^!! H9sl121,?q+*,{4JJPȳV8sn:WPCBY!ݔ)uXK< W@ <, tLXل[__YVC!%8;@DSb|FC_}9hא/?rqq˻P( m2 lgkmۥ\,cǹkV 8Am B]Jl4hhڇwu&fC'"A,&f_BPos:4(S( BO?BP(is]}K6p-¡f_h4{j|ƯjԚoKJ˸kK$=͝l³.{x]{neXn=X'N >)) B[ON%&%m;, q򕫸b5b'r'o5:tDž_,6N4ٴuvuNn79;uiWN:=zbq'N 8VP( Zw{xCj]Cq(6q'HϜs,w^ Bݷߦ-[Mz$1B` 8y< BP<aDÏ}g<wWâGms=6m3fݘ]CXl  uod}=~<*?o/]BPL4쯿o}ΝO[gpGi՚6ۮ{ 0E.[hq>?KV8ǟ1  nŠmײl)J[m7EK2s1+1%ϙ9/,Yp!fBP׶Co ~ϐ9rrs_~դdײyqV^cvip=EΝӯ/7l>a"l'N~Z_Plsƌm ; Yfˍc_y __055̙ӾS:WWWg߿{tieee$VUU^;Onj G^xvle(}GMdj+++'NB"?%BP([jU^ўOxM`=Jz6mB֭[\̫}@"qv8VܴyA"Z*M+[sl5/&Iq?s>X!7/o/HfԊnzya&r5zǞb>52rf9hW46`qLؕWTg+)){.rQ3?ԱsaNnhb_v퓒Ԑ>|(ċK {[sBPr=2*AX{?5 ?OY#񿑣̜5 &zxȰa^(#8B؁ktibxNW:@~JVݺ=qTwC8U9y:-_[ygf]gw0xR9#Z@ʙ5vm'18RGYD&";;|!3HHL%CE7ozjW|P(AxoظѓzM^@D)~)Ϝp>!ńF_ {CBp$o6~7\ # d&QrU)CU#﯂BPǫ[?5EGKH~ 4W@|x=wKNl 'F)Ӡc.| KvIȒ-hU{0gĜ9C"~~]TBC511rU g|0y2P3҇~"2HW(`^ׄWd;nˤGC8Iv"⒄n[bǙDP"dkOvxQqi~P( B^kێşhSh߸"&1P( ?sHqIW:'?7%͑KAAA_0M'G׵{6^# BP(&(S( B|J"~8toŪ=  ;pIߵ3ߟͅ BP(VE7h" ~i/9r4"'7F vP( B~'U,\5!\9&qsq2p"¯ 4ESDɃR-ʹY7Ҳr˺.^*iV-agmt]i2,٨ǩI?u2:OAHÆ1%ܞ'3_} RKc\DžDXP( By$6c$5Wm;5\G~ȟI=mÊ(rZFl|DhmٺͤÓYw/[ҥ٨Kxye0zCԼ 39s@Μٜh&fzn[ BP C߂zyhoCh/NFEb\9Rl8k^MP=گkPCBb݅Dφ>;λF}>ι_c v?Tq^&!|[^(SM}:h\C{i%_fu9J Bh*NlP+sbQd1tg˶89?vhTxIGUq +- Q??^N^?S Nإ+զP( ӂ[w/=5wj'O6akYNظx/&dޝ1Pt"}HK'Z6q qZ}=飹GP?vԆ2]M~h.{@3<̫,O8J2NqPDWL$ыAjO`| 2>l0u{o N"WlL}hOP(ݟc%:w{IU/*RvuI_xqA@(+ҮE7o~0g@?cԘԜu삅 ʆ{د/]>jK[&!1t`G=@}$;E'S( /\-Ťoڼ['O3.ܳT8z r\n}^rӧ9[|Ҕ#Fv=3A=驩iMDD,.6ydtr"\w~rrr whUSR8B}8&J^ܷ#?Ϥ_LHnUD>|S+% g\7 !f2 ߑHn, =<8=qc>ذq##l",?B>$o}Yd)j$v%vFOgAGq"~h*Ct{RRƞ%[1qLHiT8صع Jϒ%&]wニ23=4y \nVS(Q 쁰)zr뾬fnF\;S7xP`ܨХ<*y6@ڼ2S0M[TΦcD!#v.kuF<{GVH4>?qNgË yHIġ\8`QLAB!2v܉ϊYr`(,p>6do!U O_H7Ϩ{6=2["E?ɼv 7]jc/[.tѣGԏ/,, >7{$iii4@xF9])(k khm{nn:y u@V !v!Wk֭C:`O˂IS d /c戬BRbY@j3MaChxA>$MYBj B O$8Q9Vc6I9~yj>ǰ\^!!v1gΘ j̸x +yKٕqE4 zӉa"- B@Y q ށQ0# NsF˗ew'O #Il1P( n@ǧhBps0Ӗڇwes1gxbP( sWjs%$$N2U0on߮F/P( ?΁ /,ȼVuvjڕe+Vr%_=m) BѺ_}C0+fO>m[[8Ra8"ܤݜ9v;؉%%r;hTlMJJd+*|k`>~9$OP(VXAҮ\eC ?Vʪ[ںz҇΄9C$JO?^4d<(+Xx7sr2?(S( ?SDŽeg4-o-&2Кkײ\~ä_NMc^^Tr9ճ朜\7ܩ" BPj,~__h[߁&k 9<IL?1W:Ȩc29!K)[@6j!BP( \/sLzJjJܩ6|x{ n޲?BP(y8}QQQݖ? 3٪n222sE,;6v܊=bH~) g,/ }ҔdF/\L#HB3%"ă<P( 5rS?lؖ1~ڵ~רH}0c3qqM$ Hž}B >i2Gxr//GMyr+?4OP(?h?!sʫIįeeOKK,"WOCE؆/7 gCLHقmҫkj>3}:uh:׮0zjjي#Fƒ?tWݵ9X ^LHhEg>4sdkA/1ReeUuu: ;i<`@ mR<ϳ+Wl?K))Tbcƍ1D &") ES?")/㢇v?5R/ D}E%%l-e^I/]]53®ܹNܮ%.u7OP(*f7y,^.&aG|pqxn/pSݣZ +Lr_}9hȯ5אJ?q82]&qc:}:|h k߁uS[oS(x5pG?5:pov;'h8E"$^.l+ǝw&dk9P@ ZCv;#-bmPL4nսBB@3gHLr o9 IGL<:HG!3PP(B'&d?oP.ڗIq<p;wyᥗ2m)W%? o~ BP(iP5ᵶX'NBxƍ|$63( BO?hv޹Hثگk(mH Bh既 : Bh?4S( BO?BP(OF~LԠOP( l~`·v{W{]l%eֵGϿ%v㣹He."WO BP(-\$I.{MZpE&M&_ݺ]{N0? $( BIF '.ںz~d>s6miy/MD/[7/tElFʖ/X+CG.zHNc}Ukn\bwS'Z=l޻o?{'r#Far BP?KLs *jdvkYMں+WqeO͜Skܪ5k) F,WAq^x15luSg~Sgb1v.BP( uόY*Ϧ͘Yu* NӅT>AnWא ZGQ/x4r|}&3Z@>rmԹiV4_Oow5!JΛyr BP?(Ҍ KK6p#'wm&b$5ĩ;v" iW)3eZu)fr0|6L{Wn$ʪ[BdhRF??{~\x/l- ")9DuEݻwMOVZݮc_y3oWW "BG/r\ /[ts0Y??0:םe,\޽g*ҥF܅},!1t`G=OmҨFٔ?ѷ17k_sVBG3`%Ϥr-_ bINP(O8''77t 06o֣'zsSƌ DP,^t@u_vʕNѩ|Ҕ#Fv=3A=驩i8}Y\loD`s‹999AoĤdgdİ;μN}V"q| Ŝ<Bǖ_P?`G繈-as uFhܯ~L)ij=P0[xb>[0:?n]~=!C/ oNMuuuN ,e7|qLx8eC $E`d~ϴ.U2 @`Q({'5|pAA!ճuv^7?SVMz}608ٲ2L/^3%O<)F#~}n]޳׿ڶ));Ԑ*gUUUyE x 5=-[`&cژ9ċKX?S(gG R[[w++ǣ"B}z}ӧq$iM*Dn|&4а0O8,evII wŪUa^ӷ_dTI9zYP+t2lːH]Sτɓ(zGg#OD|dd`;w6q Asf{l@ B1zf87'5~(qĞ;쿯mw gۏ=~^4GbD<--ӨXF8COk֭crb6Mž,(hm`DޙO~ժ ٜO9'b }R9[+xP(^ v -TS97m J1|H(+B?v 3հ#N]A Htpԣ,sl?ۓ^S!_=r$,_Լ8>U7g4 X9sd@bS9y2])P۱PAp< Vqx( e!cǟGcޫWUwV d [2'X+R._{~'O<~R0ϢP( 9DC|jEI5cc0%jT47(yRڇwrA@1>pO Q( 1Ɵ;<SJVwF?I-J.}'h9͐aa{wq BP(Z>ê揿˫1Wd ;) Bh>lD_?VMm̉i^*!d~w`0?' BPw8@Rӕ)P( B-+W9f,;sͲ'AH`᢮=zrQsrmV5W 1 &[Qqg888Fc'޻򿧃BP( pĤ[7l ~F1֍'LSQYŒpSC./\_kl\<پfE,.!IypMs)rG=Q BP(m޺K+PzaoARӮF[ُ}_ݽw_E]ڕ|,(,v|揈۞(sBP(īke]b]'+D6ŹOړy9쳫֬?eb6Ѵыy\Gc6|{OP(&ֵkٕ e]9y‹%e8[wFT"n#GlnD MBP()8eKjWN0ir,Hf4[F8uqT{b.gxK?l?.ZYQ kM9uu] E0?~rjvʫΘyZ$ rl̙͛8fҤ/X mؽgO@c+JL+/7G=ϡ!_Gow.^G>gI9u̗oيna~0ך¢3f߶CG~U\R_lߩ /;DB"!LM7wѓ{)cƅ˒DrY9]_n7>/_N,+/4eQ-V>ñeˉp4{ {>A ߵ#Y3x˩&'|CȎ:8&<0lx6s0% ٻg+U2rXA(h 0t5|pAAI"ճu!}\l\~'Ox 4&߿<)lhXInވƷmQJTM>{ChM:6'%%Rܶ}GNJGQpӖ-0EfK3#OQ8!xqq[ao?S(v2gӮ\_a<$r=ML3@O>_'<`CCPغ4S'쒒UXIVkYY}2)#G9kjC 3bܶKw0y2ES{K.QSxFo\Tײ#3cÜ&?Y9]M<H6; &$xx` BP ,)-lz$yV_~9=>#H-eFzpǙn5|&c+:GbEe%aV/;g8+g/&$X D>|S+߽waQblB nE_<%O-yT6nwSZ=x銞DFz~bOiљW96 OP8{\OO?v]Ũzsz޽VaQA74, ޥ g}@{ IR˹yyصo$*߾mWh flK ֭ШcA'?d-[ueS(w'8]e[3pFc*1˫ 6&1Oh+^?X]`׮!(cJ#D;vĭxэ3|W]?Vz>(,,|o( Ii8eSм>iPf:&'fS\IP-(N|s=ß_h(L~{Y G`sϗ{nqj{`1; B`/sGcsEťѧbapa,Q ) Bh;urN2$F?Yu붒' BP(+ê{ }7#2,l)S( B_-]|95+8zϚAb%yQi{~VBP( R.;*Mm/]aoGF)SP( ?|ڰ{^]ScBMLV)twnv-+UK\N_=wG>/\cuSp&eϽ{C!jK: HȘ>=^h[X|`ܿ=b$e Q;'LY- =Ïn_. t9t?ΈFdrG0i2iGK3K~@~(.b1q^2kSkYx"&&%ʕ5o=l̙\yi0'M:bh?θ|ke4;`ҥ:u畇_;^M6|dFgEy^ʾ=r$o߾;ol;l҅19X-]34JMq0@@yЁ>;ON7C 7mܭGOc^3.\ˏ ^,_#ϾԴ_ׁ&nf-["?4a~{8&Œ%YVb|AGv;ke=zTPPgxgHN?={yqvƬyj&RBV`oΌ >q0j1sf vf)ؔ[kׯG@񰼜PaǫTWWRwp2 2̂ _0$w~qʝq,3Vyn_Cg5qSo!"ݿɶl)WZսWoFQ{ ?Jr٪* IOKK@ta r0VG ?سw/ܤ yw“)vow~Г'n6f Qm!"?S65< ,kyKSj`G% aBSƕ P!`=@+N_F^0s_<|Ֆ"{rT3]3߉͞ihIMIIɬm߁!YkyEf20&t&զ-[`L?7?4:utB+L䭰wggAD?OĠL6 &4r B%"RÇrn 7| v$X +5 y|.0VJv.`#Im1xfff'}E8!ZKr~ūxt.Ϗ50pf_ #:4,L6{ /,L{#{I#D]@KIPGuV^# CBA7l(?c%?tCx@|,Ѕt c%0VN?~Wϕxfmw&]#żh⬾C5qZnrӼSi͖9/\|L}f3fXwރD,ԃUH~THwVч8&]tB OܝGעsйʅc󔥂KHFF~:N'd3;/#G.~2xس|_j] wb?nDE>0]!!2*:!1<`QNǂOcVk-7nd7O}m_٬1ezN<}8u?^sXrY+c‹W1ʎ2C wbP?Cn栖˩ivgͶԠ)ċݸYY#C@KqLO3Nԃ/-/$"&Ƴu;#ApAmm+YAk'rp`d6:N99aGp*g:"=rt>@ehΡ: uFx7l\u9 . zW)7oPqf :X|,(7 _?Jx^3VrY^xIF$Kc+yl^(=7 ɫcx! (PM6}C >$MY > C3 mRFk./2;b3v|KM/trzW^3rXw~bΘ Iz(D%tV*gW) BPdf]#7Qnd@ھX2vœ7fqI?sphR&N QV^{c'lĜE]<q nzkY\Is!!qeNEA4 b6lam+ϳZi|Tj?BP(N=jzH/# 6`yiWGPͣkKАeR? [xiyM۞d']mjgoʹuBP(3Pꨩg +u<#Os՚^_͘H;+eKAhet~#GrF$'3)in)35.濑+?a?ԓj|dn ߹[w~6wmԢŋ#NnSZP'\߮c_y3oWW"B0r\9fRMrzeiWHp1ȣGY=̲v硫c#HIiQъU_bx^d1hu˶|K'4&Tu;㧾;c^،BNXC|>s Tj_P 8裹󄲱g)-dشys=+'N2f\,"d #׹|SOTV^>iFˢIN]l 2[l9.ܻ?o՜_~5o5wj'O6ad`!I| Y?XКo6oABq?1 !P#FW^Qg~!|ԨCOPXP[[˜Mr~xtSDX>N:}:go׏qpQVӍaifYf ~WZ vi}էoȨ(2rfVY\q]ݿ5l!QFعN_u%j^)S.,Vx1qKMxtoٺsv B$ݣFQ$@B=NU{κ~ŶD $C]A.+ϓg3ԏ=^-32HQ#11xZZ9 ;Qq ׇ ^;IW2 闯fBԖYɉٔCQ-(¤s=ß_h(x^|qjrҨ|Š1t> ǜ$׉2l;uA/,++Үࢬ1ڼDD^!!v1gΘ \̸x tK+ v//wl;M4(N/H=gpp>BP(Pbɉ:vBckmۥ\,q#<TϢP( 9DDO;w|fڽ']uBPosMߔ?  BPwFfeN BP4c+*.>}?(fR@ BP(1Ct9Nm )QOq+r\BP( Xu\e>y2,l=( BۮdyzϚAb%yQ99[-BP( R.;Ǫ22-^ROP( E 6xnN⒙na;qXiYj+W9f,T/7YḄ^VTV-X+ն(9~$*JAr#WP>a"}_N^YuFjԙ(]xI؈܄C le4yIy0-]nݮް+!̽o┩0+e;}B> >bƬo%cq5Fv%K~:t)~UHH73z]~hA@P( ?0"r㿪+WXPXdXLziyh\Isr-g:j-\yD MKMÖy6.1g+3A@cRr2ܭ;?wzf) a?~dX^~wg̼]]m-^lL(rE7o~0gmeeg)]!]n} {؛01Q's}^s _zo ;9 ? Ё>;3MPHS~znSƌ ,{6W{!׹|SOcG)+/4eQ=K.EDg#GUXnl;h7y%GK-'E{^Qu?3?u+7x[ +Y Y:9.mٶ%Q~%eqْH↍J<`s2#y_Fnb'F O9$&Ba) ;֙ e.Xߢ)ޫ7.^x޽{X^1`/ŋ" DEа0t{RR豱g}@y5tFrn^i:c.;&[;GD`KIM?`O?k=o pCFx?v7wllys) aʻq_'7r?Opi cz1˫ inbtL zase|ݵ zZM?>ݾrN2$=W.*~9cvuMLi 3vΝ/Qcbb?\=HtS,[qKIx .grq r?B!LyG'~ -'ԉ*gKb!2`?ų]gɼv J7äuy(,+?P?z(,,{|~{$8&?Ke(2)h^& nDE> Q ɜÞQ*\1|HY$v _YVhWH7YَރkQaHVg %%cy)`9BB0"cΜ1qWXtzA6Ml@e]/aRUȟٲR?xbwsűG88EP(( -, ?_a~m˗;~S,OqA, BMs6^Cڇwr͞;@׵{&f7_AP(l\7O?BP(4(S( Bܽw^e+sRP( Y?Պɵ֌w\RPߠIBP(f-IQOr(yRP( 򿪺{bkvFn<˫''IWOP( Esx!{X55 H62'exU} b=W^r݁-ʼ:_'z>Y?BP(*!t'X]s/p˞}phRYut̙w&NRܠP( kٕ0z\LjEmڎ8);'Ͳˑ}I2:pJ_@U#nj`*?sƫE7iK<: 'L¾nv'ŋKJM[ / 1noڲsnty]"R/ 7o]BP(BB"[YWS gSQYŒ RnW /:,+wG|Ư&N*#C`Z InWSO׭4WܱBÆ1%Sn0K)09} gf]йOP]"LKV*^tY31V?Xts`v'̚7ZjņYP('LsP޽k?~rj˯!#9]e³D讬9mԘ̺~MBtMĀ7G=Ox./uôB4TbiWC{ȴ3I1z j6~H,$[HtBB {ȣB[ײ[G8s6Γmo[g/Tݺm>2V$GW=ֈr7+W:}[V^>iF ecƵP(p>)'77tࠏ36o֣'wsSƌ DP,^t~b0-kș et-]iݿMNN?}ah #G9|dG%6Dv?Hg:*,Z^|W32z!U`*GgF: ;wOθs(l9϶rf}8w?5DdfIDŘt]N=_NM555(wܡSgZ]]K _nNِ$Kdj"ȅ~?Ӻs5@`Q({?Ļt5|pAA!ճuvl>?SV_Nw,~C hW*KL"eYN'O0J߿ձĪVVVfNt"=zk4M2bmh***~SڳP%L2gInbb-MXSnąz| J@1Sϟ:*̴XDMIIɬbm߁$!}qꪪ+*`xe`, 7mSd;6utbOQf{ 2gӮ\_a<r=τnDkÇ=ەbEARYN?F fevII wŪUakYY}v13gBpxȰaF,C"vN=&O&h(Ɔ ?ad+I|4v8g3=聠5cDN6q!]KAx'&{b un]"'/_t2|05Ѧُ,F9ѫRŸ, l&^__Oto?>-a =Г%$&9S(6; C)x1"Btbk/b۬-sYVGxᥗő"Y[ 4.;;['o'#C~ȟI`2vxi ^٬j V>Vt& &B&eL;vCPFwI Įz:s1OڤlB?9D5wj޴WEX2#)d_Iݰq#~͞t=C5w՛$X5s_6 OP-uqzrrgt_67/. 5Q Cw)%{l'N gƘ24*yqt7B]~wM>V`fy[Q5NgvF3S(lإ+'l{?\Y)**r˩-t,Qs"fy5`=yef71Èa޽{,wك92FS\vΈ&m;z7ޏٍ{[/;Dc?E?43f쎝;ь%8gp %oي?6 ?*pe  hol]#FB`1dB!PYP8yW88rY9]|G~F?^s32TG:311xZZ9 ;^e[= _u%jިUL/J:78N|E5191bGo% , dLg0W?y"O.6|Grj4*?=D B1r ^Zx!4MVIB= etSVЮ,`X Nv?B{SR8s{`E,ǜ9c2 r1)_|_9eI|W4-{JEâI5v@/܊Qv, ~YJ}9އ=, B@Y%'nH ^;ivgvjPckmۥ\,TXb` qY B H;?->hP;w|fڽ'P( 6b?wRABP( ) BPABP(?pKe@zeN BP4_V4,N_8&9,AS+ BP(g29,Fɓ?BP(74I!NI BP(؇mHT^ǪWP@c=kغ}G>!r3#q  }ථ|nscG޳f|IVǓ]!Kl\f ײ&O}8jێk=/_?BP(/]z "\M矗k>N:_n3c/UVzܩȼx2=r4JzB @\f `IBexGk]P(8+p3j*dsFwH_lkm)o=Ğk OPrhSNnnA͝g7mܭGOoqႈŋ.xWGbEe%aV/։g$?#C~ȟI`2uGyaO:M\]q%n7e?L]xIm]Zx¤ɜ{rvubR2q}P.[l+rO.ݎ=#{Bd+"Ν^͏Mq] K5tF2/t7B]~wK_hՑb\db[Pt!#|6G{Ÿm?'DŽZhY-G&ohTӱ2?OgzgWP(p'G?zrk]y7#&c1˫+3yL\}HloC,Nv.kuF<'wφ5ߠALi3vΝNe$#Xy_4͐rsP) o,'w"B'p?~!]߸qvD$mWù-׮ Dз0}xYC!]|G~}QXXH732HPAF?q( y}4-go( Igpf:&'fSԍ(-WEqL 3BCwdvKMH>s+NA/s.B5߱Xzo0Μ6}Z%AD>$mF]5aGvxYȃn kϲ .OK@Dne sɀŌ =Vr`BmdžC\ѴޒKoC)Q[)W3<`g9\Bwx( e!cǛ%\VѰ(zRl ]! /gsD'90Fֶ]rϏDžSl81(EP( r^d^;ivg6jPڇwr7@׵{#fǜBP( l\7O?BP(4(S( BO?BP(4(kP( BeKG͝? d#2' BP(1F>}CVtD)?BP(҃͘]zNIԨ'nVOP( EsXu\e>@_ ۻ;q͔) BEz-_O˩i~ˍDrS7~w@hW*a윊ʪ/,8MK a 0Z*GĤ[yp!冂ߵ׏5#z]XtSno ?kӮ}RR2mw!}qL*o14ܴe LިyF$544䞳EeK䭰)3#eΦ]bz<:WzS?]4gH11F|MhmhX&]ve7e׭0r8bbȑm? K3.))VzZ̯ee/2*ʤYP+2lːH]Sτɓ(şgdkC6jOp!!E͆K".D=O^!x1JȔٮMu]nYGg#xRŸ, l&<JǙON z^t'ë&BXif@JEfˍY+B,z1wyZD"=ݣLXV'HNa\r{gyIu;7/ϥᅗ^>G"]#egg{&3C3Xb#ö:rԄI!U9gӶ'kY%&%DaˑH"t ~EQ>‚OȈ?DGϛOPB1?+XπeBC- ?縹)kiii\.XnDj@ih8mPl:Fb{b_ow)^VgD?hO>urO|ngo^ܽ?lla6i7cY"..)YfKJĖm۝}tORCf쎝;q1+Z$X8ĄkXT}s[? grB`1dۢWC!@(#cE=ֶ+HNaܔ%?og.4#QXXH|ĀbDINǍeSD 2[n .n"(DEA11\ueu3#Xhn–1<Itj8R!8CzX "xlVPF0m Ȋ.Ç}"9Eɓ>sϗ{nᲉڏ0|P( 6b?wRg)]NKf4l_BP(4hPP( ? ) BOVmI.3-&8ypAoضVhrO_v퓒Yn۾BMM ǎcX)o14ܴe Lߙ_u3VaaSr14c!^\\V 2gӮ\_!7GG"YCrrY~֙ ǸxY?.,aSFA `ifXf ~WZ v O~QQ&e13gB hȰaF,C"vN=&Oֹ; wwMTg?8;q,--5(vmvɃlLrһvy=h?ZBϋn$|9S(6; C)hx1eBS.+׏2]dl(Śyn 1q=煗^>G"nиlo]}-F?~1!e܁|m'O&xo;qO vKAEaFTtRT9ؑHcع14CN30]]ӧ/[v݌/X^kێj?*z=[{P(Xj׾WH "z?\\V΃ Tz#܈5?rv~,f(=zDaa! >bENj2118/Mrw?QRE&C$oŪ6~s~OǢOx OR. {&%L,,jF恈Ch n:+6|ČY,.~#۟Bڵ?_QY7xsSV9?,n:@}eY;t/GL6~9ŒMz ޾519Fž?AfC N]1VhULRZ)R!8B1cBb|<{ѭbd#hBWT\2 ĩNg¶ߢ׬[ϯ왳qײ{>BFgB{ᄃBLɺmqXI$/n_.n쿂oLp)9=, B@Y%laQ4!#n(z?fhȬ&*=[t~Qjh?5OgȜ5=Z5I_HHΝD=tt:IOVcl)/=?vXb7!EP( bƫJw~49[[Wto/u *p˶-9NGCֽO2̓CKAXf̝?_9sj?RSq B_Esϣ16x?v7ck ֮?pڕqt u?PC(:&N&Z_ &MμuvubR2'>͉) BPG鏝w谰_,6\ 9r5a/|Yg;r#'R-4/=JiT)C@)reBCskJBP( #It{rC7 BP(+;2#ѷ0;)S( Bђ,8p BPӠOP( ? BP(SOP(gNkٕ)kn? BPO򿦿ǟ~C"JgEo9jB;%1!#7nkH,ϰ+O>]PV^>iF uoDH{U5''G_.r}KNuuuN ,e7|qLx8e+[H]#g[kȨ(i]9+]C _(={r-uYD8ٺm{?[V#ru"5R.x -rqnFv={anU2yS'Wr\InވrmMU 3]-0CmڵOJJfmYMM k̪GQҐavAq܁?G9ċK:B>=Zlڕ++,ǣe??RHcbPh9\v!çNβ\ӥaifYf ~8r}-+O~v?rfVY\s2vx}}=yн U =œ%$&9S(6; C)x1%Y5Y/kR.\6.DzAh\vv.v>3>G3XƗqGA/'O&xO_^~AyO`s2#y__FF&FPЊT=^P  ?LP3 ÖjlPxY)ޫ7 @<) aa.PW=K'L"AF2ÈmFعN?f]7/[QÂO'ɧiy?z| bmte߆>sr=??v`Y(({Fv,Q"fy5教t {Ab{b_ow)^VgsC0Y1cw܉YѲKwʴw|W]?MXcJCC 'Oٸw{.#OP~Á2_^ѫ!y MPVn7{6A, 9F5 )?˳Gqv /BԊ|~{y?Ke[됢=Ų5191VخI {?oPd2k1M>s+NA/sB5_|v48snh!cPVH7eO.+xYaGPSnNp "U7 X9sd@bS֗._Wc_6_c!xO?' ~Y/G<.>=D B>KXr'P(Zv)/=?v8f88\Y B H;?)k}yΟ/~]RSq B_5}S4(S( BO?BP()S( BBߐaa{OBP(k8)'WŜm+Wӛ$7#.pKIRP( NyϙfUݺ=!\ZWO8cG8r̸p BP(9s9,m%a#FrwC/&$nڲsnUVZpQ=_mvI9B4uhRKf?ZaܶrcrGNŜ7=4ITP( ?.V\(W~à}̬:w#&Ox#;%K~SPWPhSIy=uH^Bbҭ6~;o+4פ3 |iW\S0vN{) 'N =R[B۝Ml\<1[ݬ,[H^~f{hSӮ4ܞ}Q%&_J)odSuxiW򱠰ȴWkt\𿒒EgS:wέ+w;?uJs@@*`n6GH;G;ۊ==ܑQ<xMAٺMu]n?[KMڶ5V{Fy+|Rr2Zt]aPϢŋML%Ϝ55Ϭ(յ,~W-bnp{s"n wrK~d }!ݳwٷ"vUʃ)?'v䑔gY ?oO,Xw{UKGzW18!1g׾Sg~,Z>]y ·GLzaa!8pcɓY8eS޿?r''L=^,)-JDt~yMQI?'sٜ){Xrӧq4(+/4eQy~뫆] wB<,.)eik(3 5+n߾ =v\{)s5Ƙr*ǞW.յI Ԙp/ $֩CH1^OgމAӠxD91"Y#vvm$S%OŔy8L!}vv*<)s9Vq2Hj_mӾy%=Ϩ$H(&]"ᑝC'#Aw; /"(1Ӽ^$?A|jsUa0N(N ;~n+ j#V ϙ@$?xFahm>BXVr̾މ4(36)\YB xjD::< LyJKK=ʨ 爍=r@18܂MO#jH_q[4UYOcq%t /rVBY%^H˴roupTzdC'#Aw;%W}~BL1~(`cD?;kg p;#igY Aq!|FWh˹7VVka2:w@Ċ¥7TZS?;Hf w/GN%/&IO?p1!c.̪+<^,^ ? v^;"vEm,R2sV"48`EvF owy [!2KI~& +ɏ=0ގh dx@CbD9+(CΉtI޷;Rgl ;)PxcnNN#ܨ|H`u??q)tJC*Ρs#Aw C v)HR˱SyЄZ|H(+۲~t ,\qqe7'BbQ0E /&m7{ejEVh,B?)Z)KL1;HCa"%Z!H 4DDh .ev=]:: B? 10O`@_"T"4P( ? 8Ʋ μAJF- YGu{y-$'HPܩPݡ $ !6g@=.w\2'̾kْ}}^g1?\kvOx5#9tْɟnʖ5#5u$ʌGt;)_-/dž ߴtnA_g?,Gg-?Y #gqa#F=~(aNW}ܶ}ࠡôyY /^8dQvձKkףo*) s}eӊ3e e#F=vܽkæigdEK^o6vڭMw/_j8J˖FD _XfW}|ST\r7٫C#xoM(//5{i4IS+*ּŅ߸i)*8{.XDկ]-y:/\dJpHˆyFż}-])lֲUfVp;{Ұ{o[ ?~BmiY=D:o^7[GO!?xдsl6977?Խxu~ͷ83:naܼPm2a~MoJ3Q7Ҧi6Ϫdz_5c)ćs;{X|?_g {Z]f_|EKܲiZa-"i0\?Oq& %3/;3&lȕ} S:l~-y/~}gCGoAw`;ft1nͤy v]A,],{w iY >߹]`$'xwu|$r媤䔊*C#E,_liD,$H}-~[niYQ½mU39%u5Z:wblVIIٜ;o#6nl6ܽۼUgϞ- vͺu6[PwԩO>̌D~ǎҧOJgQ7 /7qb^WWr.ݺ{?_Mm]>[pJyEߚpR~A#Cߘߚ|'{I՞B\t@]_c:/\NPhMj1R:~B {/n],CUUSk~mR?w[^295b|JpHٵi˖ &\tj{SQYHiӭIMVRF[˱?W{,{s/Oʪ_hNFwD-!AO?c|B *izZW\bOIKҽ^8$)iС/СcMMz v65srt?VaРՀϟ8ז/PT[f [!c]~x?'{αͣOh{wYri[,BަNxLG{{SUoݦftĴlE5ֿNڣ+ |W^.p-Ν?MSZZ|8v\h*e~ΝW'Rg5fՄ x#h) kdOQuXsq_d_ׯ'꼯duҜ/z{R={^4 {0>&j[{UrtsYYޣw*wƸuo_:Z<fos21ş.ķ;tjSrghN\TnנD>zi.@i4Am؀\}E/o4;3|7}U5.VY^1:c{=u_9Zt՘͹4r̬IS5^BJfBDgzVmۭ߰Qz_㫯_{֠f;?DHn/֌&_~?|O]hF¡Oi9O?_T^V]gdJԯ>6_P(IΜ5'xeVWh3;fߺw=rJSҫҦNf-[c7b /1H/}ҲrmlV*{^m;vЮv@3Sc~U=վٺmА2v8yJk14m9?9_?i"۱?s8I[?0'Irϖ~q'a3guL¿ 7g|m~ɧj{(MjW| ]j:czDŽmYrg&؉`1%-]eN]y>LMU:ck$$9?٧ޫӢZ- ]EҾ>C?Vw5Zҫօ|*5,zN5u;kEK?1:XgW3|ڇ#?-ʉVѳs,RTٳ_gYR@t>}fjKpV? Ç,=w[n`Q{j!z9UB?i'8$CotF͚+m |ה\m٦USR+>zfS';p#atX߲+԰;J.h!PC}- `m}qjzKso^~E;uڹk%PTTlVko7abۀ'Nj(-[ٳO߀ggdf_3mb-t-_}P iy١<"vYYyEs7l0irjpjk^]svOP `is^C=~"㉽s7J ˶ffeK6R.{܊StyoΚ33J+W 9< B 3btGLǡ<3L]hJJM_~Mݜ7eNޓSjs;R4MX\5#7nF23wiWzz|6srljK/) 65,~R]Ԅl⃇jOkL:3SMQRb""Rվnʜ ho v:d6cxݬe+^ ػԖZ>r7ؼa r%=&̰Ϩ'2BƎ3tkQ7Wu1ϋ >n>tF ~Ï'$5NX+2fG@lj[/(>lysvڭ]f̨w$aއS>n>TU;up#"ה.VIJJv8J5שZơ]cOЪ yOFFI*Q+ =GzR;wiSoE[zףn؞hmجWTVV>gZ#}UZS|ܔ_6ʕ׮qt,ֻv=:닖2ة7xݪe?z3cKrxL{Į}7~흻uoѺMpHwecn 4Xsq(ڟgUVo)SlOϜ;Z `mvZ-3kB?j!gO(--ӧI%zE/3;${iYEeBSlWS[j[!DZm;J?+Q@AB;`-# !?GMB?`ܭ_5?z[);yvkֲUf͙{Mf˥.xvС靑?L;{ug/^j>Y'N~NpH>"WQYձKWҪ5kqة|ajӡs]Y~;g߁vG䊕J(cnWMXzRCG6K"뀭ڶ4P(-v ӯ/αquFtףcΟ^Q0h\Sj^_PXt >BkoP)>4?$'UU;nشY\;!rJ<~BF*;rl?ۿz:4<}ƨ<)ȱ>o]gKVy*+jWmjrYe9nߋ?]Vo[WhSiuv]g7S}sKѿgfW5GwTUPSjr9>vyKHidT?1 ??m H359i`k2`/Fz.siW2?3* jٯ35Q{~[t"gRҾÆ|*J;qrwE$ ^=&Dc4'jv[{~.XwgԢ?ν8}S8l'I#FlV4u g^\z{}nS v}*`W3¡'HT;~,ڇ#?ʉVѳs,RTٳ_g$9%#+[ XNӧϬRtan,uOY-D=;;=ZY&jkDDŽ?pO9y_JJ9s;u־ci3fܺmG>tȟxsՉZiࠏ?,5-:}_5Wڶ:6::x^'T7~vQZvzax՟u?_EX$)2%-+[|vGe;6l5o2yy%$$6蟷`M4ի#F]a܄mڟ8yJTٵfqU>rԭ۱ rϗ2^_r.++[/\|ٵaj:㖯֩Ȝ*מٺ]?~z|?KKt >gn읻*y1:#MI^=nީviϽ+c%v7[=~")^vSϴK܅>u" :v ;nE0M:~g'0)9y1cu|eŪX\5o82ϿX&U z9«v}Y_N3ywYνK~y7[Yfc41=SMQRb""RU<fu k{//_a6O|P?Q).hu6UzEϽWwQ1!??n+oy䇏˷nr:M["ӑE}mx_g4N&5m]yjxIgA2D?6}ksj ~n2]A?cj6bSNϞhtǮݺN'O_zn*UNݝf7NכLVVL\v~?]zMf͎Xʌ4 ۷߽+SgU4{uy NtZ|*-+r׭ 3{__Dd͝ש\;]BPz44}`]XJjyOK\z$fv?Up.\ii_f-鏎5`f-[I);|W0VY;f8ͺ1Ft:{^9tmѺM~_aKmx_۶w] UMt*Ze,7`Hv2Ӫm;řs5U;\W_њ\}/؉Z_AC}o͵ӛ__^OWYUmF'S& ?_fvIҲ*+Y뉧.#+[ B/+ۦ(?n}s/ѓCޢoRrU/ ѳ~"鷮t=}X'Nᰨ sgu3b?k_SbX?z!u$xLs?:}F n-8o=r;pP KS^_r(-[ٳO߀ggdf~=t5և߶}nݎUjj)SϳiϚ33J+WI瞧.3c;E݌֘onk!PL6͚7M+++[Y]%>x ֬]>C~qKtSyaf5nFx̘02=,|MjO,- {WP}#?˟" >{}tݷ߇2f8ǏoO \ʈQ++cwoͺƷm8|[cM^~E;uڹk%PTTluziːTP,..`&cBei\5~s;Ɨ_4"/ )ftm;܄ger3'L߭gףL;K1:#jC';֣w.((֣gYY%[v{C~q_jj.==t>xH996_ߵ?++/a5#?Oo5lD36??9=,|M*6kYV^޽ʵ? KԖcG? ٳwj?_efjt%jҹegOyyEۀԖvufI}Z' edd4yڌsޝ7k¢bO2Uf͎XBSjA,_դ3s?̻_![f> &x#: iUo.]H Mrj n0x谽/+(*Vṱkxm6Xj'Z,ޟ#V *Ղ2}քX'2=wqX!zz)i<+WS[j+DZm;JQ@A$V# ߅B!x+!BNf:@#VIENDB`gpscorrelate-2.0/doc/fr/000077500000000000000000000000001355604302400152235ustar00rootroot00000000000000gpscorrelate-2.0/doc/fr/command.html000066400000000000000000000127031355604302400175320ustar00rootroot00000000000000 Documentation de GPS Correlate : version ligne de commande

Documentation de GPS Correlate : version ligne de commande


Options des lignes de commande

Usage basique:

gpscorrelate [OPTIONS] -g données_gps.gpx photo1.jpg photo2.jpg ...

Les options sont :

--gps or -g données_gps.gpx Indique le fichier contenant les données GPS
--timeadd or -z +/-XX:[XX] Indique le fuseau horaire des photos. Par exemple +1:00 pour l’heure normale d’Europe centrale (CET : Paris, Bruxelles, Genève…) et +2:00 pour l’heure d’été d’Europe centrale (CEST). Il est possible de le spécifier sous la forme "1", "+1", "1:00" ou "+1:00".
--no-interpolation or -i Désactiver l’interpolation entre les points. Au lieu d’interpoler, le programme « arrondira » au point le plus proche. Si la photo est exactement à mi-distance entre deux points, il choisira le premier.
--verbose or -v Mode verbeux : affiche plus d’informations à l’écran.
--no-write or -n Ne pas écrire les balises EXIF GPS dans le fichier. Utile avec-v pour faire un essai.
--datum or -d "datum" Spécifie le « datum » à inscrire dans les tags GPS EXIF. Par défaut c’est le WGS-84. En fait le format GPX n’est pas sensé contenir autre-chose que du WGS-84, donc n’utilisez cette option qu’en toute connaissance de cause.
--max-dist or -m time Indique l’écart de temps maximum entre un point GPS et une photo pour établir une corrélation. Exprimé en secondes.
--show or -s Montre les données GPS contenues dans les tags EXIF des photos indiquées puis quitte.
--machine or -o Montre les données GPS contenues dans les tags EXIF des photos indiquées puis quitte. Cette option diffère de --show en ceci que la sortie se fera dans un format machine : le CSV. Les champs sont :
"monfichier.jpg","2005:04:23 19:31:00",Latitude,Longitude,Élévation
La première valeur est le nom du fichier tel que passé en paramètre, le second est l’horodatage, et les trois derniers des valeurs signées en virgule flottante.
--remove or -r Retire les tags GPS EXIF des fichiers spécifiés et quitte. Notez que ceci supprime uniquement les tags GPS que le programme peut écrire et non tous les tags GPS EXIF possibles. Tous les autres tags sont laissés inchangés.
--ignore-tracksegs or -t Ignore les balises tracksegment dans le fichier GPX originel et interpole entre deux points de deux segments différents. En général les segments de pistes correspondent à des sessions de journalisation GPS : l’intervalle entre deux segments correspond à une période pendant laquelle le GPS n’est pas allumé ou ne reçoit pas de signal.
--fix-datestamps or -f Avant la version 1.5.2 deux bugs entraînaient l’écriture de fausses valeur pour les tags GPSDateStamp (date) et GPSTimeStamp tag (horaire). Cette option vérifiera chaque fichier et le corrigera éventuellement. Utilisez --no-write pour empêcher l’écriture (simple vérification). Cette option implique également --no-mtime. Vous aurez aussi besoin d’utiliser --timeadd pour préciser la différence entre l’heure UTC et l’heure locale des photos indiquées.
--degmins Avant la version 1.5.3, Longitude et Latitude étaient écrits en DD MM.MM. Depuis la 1.5.3, le format par défaut est DD MM SS.SS, ce qui est plus précis. Utilisez cette option pour forcer l’ancien format.
--photooffset or -O seconds Ce paramètre indique le décalage photo, c’est-à-dire un nombre de secondes à ajouter à l’horodatage de la photo. C’est la différence entre le temps GPS et celui de la photo. Voir Concepts de corrélation GPS pour plus de détail sur son utilisation.

Exemples d’utilisation :

Dans un répertoire remplis de photos :

gpscorrelate -g Test.gpx -z +8 *.jpg

Montrer ou supprimer les tags GPS :

gpscorrelate --show *.jpg
gpscorrelate --remove *.jpg

Et c’est tout… Il n’y a rien à dire de plus sur ce programme qui n’ait été dit dans le document Concepts de corrélation GPS.


Retour au sommaire gpscorrelate-2.0/doc/fr/concepts.html000066400000000000000000000317521355604302400177370ustar00rootroot00000000000000 Documentation de GPS Correlate : les concepts

Documentation de GPS Correlate : les concepts


Étape 1 : Prendre des photos et enregistrer les données GPS.

Avant de pouvoir corréler les photos avec des données GPS, vous devez d’abord avoir quelques photos et quelques données GPS. Ceci implique généralement d’aller quelque part (à pied, à cheval ou en voiture), de prendre des photos, et de prendre un GPS (ou quelque chose faisant office de GPS) avec vous.

La plupart des appareils GPS bon marché ont une fonction « trace » qui enregistre où vous êtes allés. La résolution de ces pistes est très variable – mon Garmin eTrex GPS enregistre jusqu’à 1600 points de données, à environ 20 mètres entre chaque point. Ce qui correspond à environ 500 kilomètres de voyage (en voiture) ou 50 km (à pied) avant d’être à court de mémoire. (Ces chiffres peuvent varier beaucoup, en fonction de nombreux facteurs.)

Les appareils GPS varient également dans leur capacité. Si vous utilisez un GPS qui ne fonctionne que sur un ordinateur, ou avez connecté votre appareil GPS à un ordinateur, vous pouvez enregistrer les données sur celui-ci. Dans ce cas, vous finirez probablement par régler la journalisation à un point par seconde, ce qui représente pas mal de données (rien d’excessif), mais des résultats très précis.

À propos de la prise des photos, quelques rares appareils photo numériques peuvent ajouter des données GPS aux photos elles-mêmes. Si vous en avez un, alors vous n’avez pas besoin de ce programme !

Pour le reste prenez des photos comme vous le feriez normalement. Le programme de corrélation fait correspondre les photos et les données GPS par leur horodatage, de sorte que ce serait une bonne idée de synchroniser l’heure des caméras au GPS avant de commencer à prendre des photos. (Pas l’inverse : le GPS reçoit sa mise à l'heure par les satellites, ce qui signifie qu’il est probablement correct… et de toute façon la plupart des GPS ne vous permettra pas régler l’heure).

Les photos devront être étiquetés avec le système « EXIF » de métadonnées sur photo, y compris la date et l’heure. Ces balises sont intégrées dans les photos elles-mêmes. C’est à peu près standard pour les appareils photo numériques de nos jours, cependant certains appareils numériques très très très vieux (comme l’ancien Mavica Sony disquette dont un membre de ma famille est propriétaire) ne stockent pas les balises EXIF. Ils ne sont pas compatibles avec ce programme. Il y a probablement des façons de contourner cela, mais ceci est un autre sujet. (Donnez-moi une demi-seconde, et je commence à parler de l’écriture d’un script pour récupérer… non, mieux vaut s’arrêter là…)

Lorsque vous avez terminé la séance de photos, téléchargez les photos comme d’habitude et préparez-vous. Rappelez-vous que les manipulations ou éditions ne risquent pas de supprimer les balises EXIF.

Ce que vous devez retenir :

  • Synchronisez l’heure de votre appareil photo à partir de l’heure du GPS. Ne vous posez pas de question, faites-le systématiquement, et ce juste avant votre séance photo.
  • Utilisez un GPS qui peut enregistrer une trace. La plupart le font, même si la qualité et la résolution varie d’un modèle à l’autre.
  • Prenez votre GPS avec vous, et gardez-le près de vous. La précision d’un GPS est de l'ordre du mètre, aussi utilisez-le selon votre convenance.

Étape 2 : Préparer les données GPS

Le programme de correlation GPS accepte les données GPS au format GPX : un format XML ouvert. Le choix format est tout à fait arbitraire et naturellement chaque GPS a son propre format de fichier. Et dans ce sens, ce programme ne fait pas exception.

La manière dont vous obtiendrez les données GPS provenant d’un appareil dépend beaucoup de celui-ci, quoique nombre d’entre eux comportent une connexion USB. Dans quel format ces données seront livrées, là est la grande question. Personnellement, je recommande le logiciel GPSBabel pour convertir en GPX un fichier d’un format propriétaire. GPSBabel peut également télécharger directement depuis les GPS Garmin et Magellan (de telle sorte que vous aurez immédiatement un format GPX et les lots de métadonnées utiles, comme les segments de piste).

Si vous enregistrez les données GPS avec un ordinateur… Et bien, il pourrait être dans n’importe quel format, en fonction de la façon dont il est connecté. Une astuce serait d’identifier les phrases NMEA comme ils sont venus du GPS directement dans un fichier. Une fois l'enregistrement terminé, GPSBabel pourra convertir ces phrases NMEA au format GPX. Habituellement il s’agit d’un point à la seconde, ce qui constituerait de très bons résultats. Mais trimbaler un ordinateur portable pour enregistrer les données risque de ne pas être pratique. Un PDA serait peut-être pratique, mais…

L’autre chose à savoir sur GPX est qu’il stocke les données assez intelligemment, séparant les pistes en « segments de piste ». Cela peut s’expliquer tout simplement par un exemple. Si je conduis à travers un tunnel avec mon GPS, il n’a pas de réception. Mon GPS traduit cette absence de signal en n’enregistrant rien. GPSBabel interprète ceci correctement dans le fichier GPX en séparant les données dans des « segments de piste ». Avant la version 1.1 de GPSBabel, le programme ignorait les segments et extrayait des points dans une seule piste. Donc si une photo avait été prise pendant le moment où il n’y avait pas de données GPS, vous auriez obtenu sans doute un positionnement incorrect. Maintenant, GPS Correlate ne fait plus correspondre une photo entre les segments de piste (vous pouvez toutefois désactiver cette fonctionnalité et revenir à l’ancien comportement).

Ce que vous devez retenir :

  • Quand vous aurez téléchargé les données GPS depuis votre appareil celles-ci pourront être dans n’importe quel format. Convertissez-les avec GPSBabel au format GPX, ou mieux encore utilisez directement GPSBabel pour télécharger les données depuis votre GPS.
  • Dans l’absolu les meilleurs résultats seraient obtenus en enregistrant les données NMEA vers un fichier, puis en convertissant celui-ci en GPX avec GPSBabel. Cela vous donnerait un point à la seconde, ce qui est très précis.
  • GPX est un bon format d’archivage des pistes. En raison de sa nature XML, il sera toujours lisible.
  • Le fichier GPX est subdivisée en « segments de piste ». Ceux-ci définissent les périodes pendant lesquelles le GPS a enregistré des données ou non. Par défaut le programme n’interpole pas entre les segments de piste.

Étape 3 : Préparer la corrélation.

Pour démarrer la corrélation, vous avez besoin de photos et de données GPS. Je suppose que les deux étapes précédentes vous auront permis de constituer une série de fichiers JPEG avec EXIF ainsi qu’un fichier GPX avec la « trace » du chemin que vous avez suivi lorsque vous avez pris les photos.

La dernière chose que vous devez savoir est le fuseau horaire sur lequel l’appareil photo est réglé. Les données GPS sont toujours en temps UTC, aussi pour corréler les photos nous avons besoin de savoir combien de temps ajouter ou retrancher à chaque photo pour aligner le temps des photos sur le temps UTC. Vous devez simplement « connaître » cette valeur et l’indiquer comme paramètre au programme qui se chargera lui-même du calcul.

(Cela suppose évidement que l’appareil est réglé à l’heure locale quand vous prenez les photos. Il peut en être autrement, tant que vous savez la différence entre votre appareil et l’heure UTC. Si vous le voulez vraiment, vous pouvez régler votre appareil photo à l’heure UTC et laisser les choses telles quelles… mais ceci ne serait pas très convivial si vous essayez d’utiliser les données EXIF pour autres choses. Libre à vous.)

Par exemple en France, en Belgique et en Suisse, l’heure est réglée sur l'heure normale d’Europe centrale en hiver (HNEC, +1:00, en anglais Central European Time : CET) et sur l’heure d’été d’Europe centrale en été (HAEC, +2:00, en anglais Central European Summer Time : CEST)

Depuis la version 1.5.4, il y a une option pour ajouter un décalage supplémentaire à chaque photo pour la faire correspondre avec les données GPS (dans le cas où les deux appareils ne seraient pas parfaitement synchronisés).

Exemples de calcul :

Temps GPS de la photo :  10:10:10
Horodatage de la Photo : 10:09:30
GPS - Photo :                 +40

Temps GPS de la photo :  10:10:10
Horodatage de la Photo : 10:11:30
GPS - Photo :                 -80

La valeur ainsi déterminée est à inscrire dans le paramètre « Photo Offset (Compensation photo) ». C’est le temps, en secondes, qui doit être ajouté à l’horodatage des photos avant que la corrélation soit effectuée.

Ce que vous devez retenir :

  • Utilisez l’option « Timezone (fuseau horaire) » pour exprimer l’écart en l’heure locale des photos et l’heure UTC. En heures et minutes, par exemple : +2:00.
  • Depuis la version 1.5.4, vous pouvez affiner le décalage entre l’heure GPS et celle des photos (synchronisation). Utilisez pour cela le paramètre « Photo Offset (compensation photo) ».

Étape 4 : Correlation.

Maintenant il est temps de corréler ! Vous pouvez au choix utiliser la version graphique (facile) ou la version en ligne de commande (utilisable dans un script).

Cependant il y a quelques options à considérer lorsqu’il s’agit de décider comment permettre au programme de déterminer exactement l’endroit où la photo a été prise. Le programme fonctionne à la seconde. Si vous avez un enregistrement par seconde dans la trace GPS, les photos correspondront exactement avec un point ayant le même horodatage. Comme c’est la précision de l’appareil photo et la précision du GPS, vous ne pouvez pas obtenir plus précis avec ce genre d’équipement.

Quand la précision de la trace est moindre (plus d’une seconde entre deux points), il y a quelques options disponibles pour rendre les résultats plus précis. Par défaut, si le programme trouve une photo entre deux points, il fera une interpolation linéaire entre les points pour déterminer en l’emplacement.

Mais peut-être n’aurez-vous pas envie, pour une raison quelconque, de permettre l’interpolation. Si vous désactivez l’interpolation, le programme choisira comme localisation le point horaire le plus proche (le premier des deux si elle est exactement à mi-distance entre deux points.)

Le dernier réglage important est la distance maximale, exprimée en secondes, entre un point GPS et une photo. Par exemple, si deux points de données GPS sont à 15 minutes d’intervalle, et si vous avez pris une photo entre les deux, vous n’accepterez pas nécessairement l’idée que la photo soit positionnée à mi-distance, car vous auriez pu être tout à fait ailleurs. Dans ce cas, réglez la « distance maximale » à la durée maximale que vous souhaitez entre un point enregistré et une photo. Dans l’exemple ci-dessus, vous pouvez la régler à 60 secondes, si vous savez combien de fois votre GPS est susceptible de prendre d’autres points dans la période.

Ce que vous devez retenir :

  • Vous pouvez utiliser la version graphique si c’est cela qui vous convient mieux.
  • Ou bien il y a toujours version en ligne de commande.
  • Par défaut, le programme interpole linéairement. Si cette propriété est désactivée, la photo sera positionnée au point le plus proche.
  • La « distance maximale », en secondes est le temps maximum entre un point GPS et l'horodatage d’une photo pour que celle-ci soit corrélée.

Retour au sommaire gpscorrelate-2.0/doc/fr/corr.png000066400000000000000000001776631355604302400167220ustar00rootroot00000000000000PNG  IHDRb|i pHYs+eIDATxQ@P@-&AI! 0&{fpcXN@rrr~¹mYef:\ffffffnD:VYgb7'q4.4 sݬ+) y4I⺀WɬUunxNF*|*:Y2f` ]5Ⱦ~sm?7r K${nHiz9U_u_3xY~Zb҂?Wy繙ls35 .Ls%S{"N3X6'$k0%7Xl>x[7xPS/{=>Hd;S!)$G\߭)6ŖMlg"ռnzQ&L|[JsT䭁в(pZ$3$X3QvCAfⷍLjAkt*)tg(u#H(0:sGR:UyfgFZL Y.Fxy 7^Ĩf?,NcjlZūFس"ST6z}˚wl'>? 7$f`se2J!&@YQxj~Q#Vunǘ#-P'mUɽJ)HtPM-W-pưX=(eQIWz/vZ"TMR,yq,SlQ݌ʌ8:.JuCV'kqae#$SZSMܠLO7ϰEO`VM#Ӗc4A[$_!So|m\*Q7XPNKbA嶹5+:_zz٥u}ßN@a7UuIܳ b#j"p> /(SK=F)IPA堒$8 Juj|.H(>=`$]1QddtlYQXH;ȕl&n3nyd/VG9)KaaoUB_c5:R Y͋eu LwC[$A|XR mt wӌҲܤk7sx녓 *u)3̜ܩH G!  )H,'8C+X,-LM]vCW ̿_[l*(flwRn Ő@HAA/~5\52ь;]iXUY }۟Wb΁6YKlvj$]Ő@HAA/ ,{\BAM4cvNgZidv9=mqnͺY9sf5C^e(B  xx's+y`;uЌ5AD 4 )@1Aݠᣀ<ek'5 k@Xa 32@x_º|b[렛ƽ`86z+V|oS akDa2÷\ㇳnPNOι[]ضm۶m۶m۶mx_ɻ{tY#w{RL*je%9 48\wJrPa~)bm7oeΖ$L1ӓgS^P*u0UZ+ kQBH+o"Ŋs0cd勗 ZTY(UzĨѯ߼5Mv񃇏L]Q|,rW>^6|2eV\s}- 1nYXzMDQoݾӠQcnTiEVXΙ7D2h}ࡠWI&;vJzkԘ6V"E._uB!:*-ʕR5Rh)FXWV$9ORLYWX(q&zf!WY jnGXVOX+ǎ#n=zڻP\uIZ'8םvZ W\$meTS]D푣fH.]bo m1<}&]xX(BSERJF m#E|닗$H /ODvs:]s}i<Ɠ =ܽ83spkΘ]?p /\ZБȝgEE+{L>Übta֬9sicpir!:*-U8Z6brNJg?B/TYK-i="E9 _9o60&jٕyUÜ>| k![ձKW,FmVSRqںmYA,]xwQE& *.DO"\))ZZV &W!*?g|s)\OXI]=/FSmϔc|ºyVՖq]#aXPT;[a-]|X(" vq.\,kr!1֍6p Nbmh1*}Pj5 --W!3q(\؎'3 C,#bb؏n &ŧ,< @3]3V~eub>}XjAp,Z$B݁5INc<;pM0*Z,[\|{cƍSi7l_s 1L51\Щ3 ` ) #]a[>zᄯ:F0F1\! 'r˟'_~VjByq- &( Lag> | 8Q!ʿIRYr|I9Cp NUX'ǚ vzwWn޺6"F;i Qe`E(aނio4=_:l@cBS;0rqw>f%\LR>\f/[eB +NrW?q͒K% ,2ǚ (fitPaPŚ5Ġ(XZNJo.FX].N5^a2gnj5*iA)M1\$Xyx.!&StҔE5 W)Xof ɞR)b-d" k, ei,Ek{Μ EXA{U)ֲZ$ć K[>V%Q˺V^7˩kbMXGXLRxe jԪ-XsEx<,R DX an+4VA5j_|? EXAz'S,M0r0ɐKGXVmڒ Ҟ9{Ska K(ag2C C`䭶:Ʉ͚"<?\#5n2c>2JwKﲧ&}\BW'+QMT7˳T2(=VHnam[*Ϝ=?~*SFO8wORQA<5 "jZ/\߾cgY}LgΞR6^֐a팂() [* o&o#"8@c"vBJҭ;Ց5I&'ՀwfP61,O;k6۷mass`/^2P:yy3f}ā k.r)ʷlzT׆;-=r7Z1WڥzG+?RQb͖@NzaqK-!ilO5jXC.B/c690hXEM6lV` XT'Qb+R(yv>c=ggtԹ\XٻwaIIF36 ;@/}jj!CiEEeZ܌bMx: b51ĞDumۙgsiap6,5ɮ^1F3}N^>kW3\X|ĚEP( ~JyEe݈4!l:xSR=Ҍ EF"-b=pXqoĚHIw)V( BĺNQ9sUSRR<˜XkGb!d:99e䘱L3N#Pd̸kODdqv¢k9kջ9&VkNsU% BP(X31NQ4峅ܕ!F f#͙y/M 1-۱s'T8;7}{K p_n=z6o.~5!?vcKNRވgϴӴK]PUUwu41l TQbMбp0=o6; +**2w[-hSȥy=v &*:zR` "uҕ)7'O h9}Ҳ2 ^]q71˜ZW]/qYzs,[ _F#ܾ72Kvw$zK n2&NAC8y.PnRpW$=`i,]jmvSqc ~C'>32v}G;ĦxvSs{׺ͤ x_/N+^QQQb5V]{Ꚛ&׎==+mJص{6ݕ1F65-ͿO,4M7w=)9P/F^ۮRHaX_.]E](p@"&x=%+uȍr ]~ oO*++9qK>ɽ'}+?r5ޞڷ@WZLH97K4d\wUkddd>|J}رn`>{紧_~[}ZEE7cq*"F.0 FsO%hA_g9s}҈ N}AU]%??_Wi_HD \86>utYx-IȰX {%9fK&jMKmAϻm5!!]{c$``߉p^c3z^fAx*BwncB|vЇr{G%H Ò<5nq.)*_mۡJkW._.S+<^!@^zbma)_5:WxL1ߖc'L-jw7~Ͼ}0U7Q[8=XfG/Go`3Ϝur6ݻK~QulbuuTTkwB[i;x22,dYgcdsrfPC<qnn.̀axKC_qNNЀ3f`lC0:GfiP<7pS4qnY0gϝC׷{Oiߩ3&۝X=#n߁^"^o x}5ʐP.MKO' {hvsFRNj{Q╜`^OCU;WÏwb-/)LSb,g6>zeb}=2Bd[8L1ho~> ru`iT@IE_0FBbPK%5S䑾 pXujZFAa?kcmCT5j`cXz{(N8%]{icsu4[8yyK iÑ`0c=( Dy2^v1mBo %nF9yz1CAdD vr`xa[/oRkӥ cmͲ ~Ek|471x j3cFOzO^xaN!^܉:5ɋ1ܑ7dW×#zkF n^B]X_n¤JE%zTB~26br1cıLE${-'rY:5N-x}trd5Zhڄ1;s"s mNf;3?…c-ܾ,qqqԁA}X.H6]ڠbX{w+XW~042X5NsbnRZ{6A N~=pB;y9ZE=%Q~Q uP;w< wtBdcaT׋g b!. d[3K1؂=rdCp)Ӧ+E`$Nb^x]l c{͉^=0GCv{&9b6#9߻_1rrB^4iE*gF6{땉5kGB us]0ѐicM(X N=uAFr)UAI`1yI5`Lt.B 3a;y9nZ!]ReO^}дEE-cXF -&jk9OHQrHB9p ˈۀ݆D=4eQRAfS}J=2w܅wcoOsNt6*,zOe;6c&/ ܉5D,bM|S|w]G;=.n&F8]j}2⠌IR}(G+Y_ڻ_+ zWhWG4i.KB!>zj9uyY I q^kשg;v -P (a(&mEC %{'Mtt,&J/G-;oX.E)RSʥvab1ΗfEaM BL7B4yh* 7y->PQyDXǺс!HMޙg ೞ~>0 BZATT O3g6ӒM;Xg G5sn95s8 BPbZEEBP(Lkj|s cAs,`%NTdbRfhP( Bk$'/6mwޓJuVv{z@FB!̞;ȖQHdR*d=yP >r)呣Gׄd7I]Ěp^ /ZL4lݮv0[[ˣuԯ&A{Bɩ!烇<`%NTfVՈ^Qii|`!FB!<ț6oҭ{RrrII ' ĹAz|_^ŋ55Fc(X=(U9PV^Ω(Vb]Q:Cbqs36胦Nfa={fh.?&-,gμQ! nvn6dGiÞ{BAī4o/-REPrxqzFfffDd=u~#&\\sc{f5^F&&Їr<|z1o9'ujIݠĚ)w**M_VmFEEض}^rAƻz9uь3vx2ܞp;cP(y\Z.d199cidb]1wV[&ȨEEŬҴ_bͨ%&{cNDƧzq\\T,B9sB9iZ!NsjPSMw~;w8% zX2WQDWb-zVz%1 Bx+XJ]f DV(k|L!/qĤG1ƸYi wbq2!86 }(} ւ JSco4UnsLϜ={ Z7E>BP(X4=b &cEFf<+f~FT͌{BP(8X(V( BZEEBP( %֢(V( BXNEEEBP( %**J=CP( ǎN#ǎ7&(V( B:2[i7mq6XlĦAiˆm_[ov֨W ܱs^xw,{/?67uĨTd_ՆߕWTylk׹[7z:u邅TbP( B5[;82*m`EzyUqnNivЍN¯@FkCf|l񝄻:vt u%eilO=JE_G+OBP({.p!HV9mݙk7Q%(UX5$* AaR`! *9**:i뛱cOΒk0JkB!LdYju9mz`U_5a4HVN. "+KJK6~Ş7mjkׅKgΝ7+-+7&/p +{ ? Sy9ͱBe7n-dO?%8Wk_<8xҥ( AzVb++/P:;RҚhi>Q&&rg"do@zW_9ygƩ;wqL,k)bḨ%S-\Κ3~oͳ=ptKɂO}/+=[n0i2hpQViIۍc'L8W#:o|~:t$0,{AU]`Ci(Iv)fl^d6ǸZ7m3`Ͼ}h`ꄻwK+))!2a^mx=lڲM#֬aX5 nw1=\b=yYd v[KKF^()o ?wO?_YYWH#F-*5x,)=˘1N c.(,0qlϘ777ƚӧO3J`lp3e+VXkXj6**m߁פoɈѣ~<㜜ܡX+ ksk}N>{ѣ[ֆ|^ڨ1cg͞ bi닡 X&m֪m;w7`W߬suT˃W9F6!+V G/\|0r|F2zBݾ'ZkQNȨvXYh;@MȸJS%V_0`ĄGFL 6 l5{8X[&dƍĶ*V(&ȹqܢ1941øϓmEan7[[̓S7+Kആ725ה9bm|6>>+++mYHǎB׭ߠkBx3Xeq@0fy}%B:[[x9kOmoVfO< 1˥8lBܔtkבXs㙱 ̖f#̤az0.wpc pVO&X3ЄsScN21 hKBPbX(eb}Yţf~l9ʆBP(X=Y #EZX7 0Ě9%􄣺sn,e^( BZa{Z BP( %bڗӁ~뻉Ilߺ]{UGsCP( k%J䯧'5-Ɂ£ĺq@P( k6b\t;#8j=ۘgHYsv#g "+H6Lzs5Ah~~>irc2k%d-? LiYy!֘XM[@vDqR\\\PXƉ4Sg̀(a 42nզmTT4t|Iv09ĺi@1#ʿc#oY9{6;f9~SPRX`_3|0욚M!vxM Mc-b7ӧZ53RR#cHT_xJbsns̈!W1\q2ވ!M.+~udԍʪ**M[**6h|ϲڤcMz6-[Q>skS޽{Z_;(_@Eu~iik8C/مRkB4/aLaUXnS @FO gwp0kBܮ̴&řZf̴ֱ>ز`^r  zWhPm&"`H:C.l+2N^h !62-ȥFšXa~~&bLp,脭\DZAbjA4~6- V᠉@P( %*,-Ⱦ/%(f8Aɘ7eb}];01?,ZıL:S8Y1MP62( BZS O??ZEBP( %֬+ ̮XNظ[֬e.Mˍ(V( ĺFœ -|qW!Lf%5F{ۅF/+{9mڷo۾D={7[df=39*{ _6dĨ|cߋkBP(J*$mqΫpݺavQqo7ZeU5z&edA96 o No}叫%e;ܖޮc߯F *kBP(J*!))u^nڼ&%DflÛAbbk^܌hX % BP/XdU$DTCQU1פ$Mq_vc+޽wџ:}f܄ 'F߈AcK@?8EE+BP(JUBKNI5=i6lNؖ*\Eu#BP(J+Q9{xȤ)X3+c(Ynh{Y&){/? _N%bm-bmN @@ qE BPbC|.IuE AbQs  B1)0 .QMXߌ;~BMM :K"]˾8dvֳ5,+W3;X櫢EBP(z_ܲUr y#5-ynb"qqq,Bv%**XIۍc'L`F_Y1oۡc?] ͙UM-fVY3rV?թk7 %K>}j=x~v zuPfz`EEEn| B5xhz&1M7?{$سo"9]JJJk3,,9[Ix z6zfef{ mE6mقi AkXR{ 1cƍ2ıڝc}0O ?[eee&\"kBBpnXj6**۶G1z4|r;4` Bڜ>y+N>{XǣGnb?f*nP윜ÆYYr^u^Y'ĚY΁W 4%**޹k9Ƅm U //SSS9ŋĚ2s .˿^¢"2=k>geg2둑J_ 3RZV-@=; d+>_+|y{j'pBCh>bi닡XGF(**.++WQiB.ڝ듧NcyĄW=ŗ=Jhƈ܈(]u ۰q#-d* B'/bx+P2҈8I&='mEane/Ju<=Ah|^N` 8Mc{+\E p~ I 7_P`q"_5eٛ nX+ ˜.… uxvΖ}Wx+=Ozfefɓ#\.D ɩixHT_8:5- bL2lD4Sg`";b ϜEa& vpW`wfA('( %x苌DʆX_ <7㿜 y5m> ysk u囕14`$BS 6'Qr*kXMLggeGXX5=̀#k1~|0h0vFmϦ=nZB; B5ة}1м}2ݢ%=&Zɶ`u+yA6b僄D\cn4&@UTTٖDrh r;W( BZEE5#}nǽLϜ=ˆMo_.[n BP(Xת(O`"eb,~Qݹk72ql/ BP(DEEV( BZ**(J_3( BZEEBP( %,b+QĺQBP( %I)ұs;x՚ 5NѶ}eDMzlȉы|ZEuBP(J>w¢1i ]" 8q|:~I8u ٛGX(n:P( BCA&wnj,e۵'qՖo֡yu Mvd7>s}~-ae:/`ezEOޔwulZv܇)Sn{7l޳wtsDO BP(XWUDF߀B[ ,aW -zRq5(_h`17︷gݒCA+* ዿ\aJ֫O_<|ǔ~ /(d[]{2B%/ BP(zz{4mVM[rWPh.m>,;~ +Ti8z:{( b/앑Zܭz+%W1Qhdt9ܡzYsr:etXع<)-bsϦ|7kn^EQl3hcNXa\BF B=)0et'u}ڐX0yg*-+PlId\:ɛ=o|=w^QQgϞw^bR{%Krɒ{Xo1z4F4%0lQ4S#G 3nlfBcmo$ƚ9ZX+\)8Awʫ"a%,$kP(&NLMK? ~]uOJN.))4e 5ʑ-^'yW]{ED L9z]zb w5oC!&LWZM]̗@Yyf@ujZs"KJ$)C)Θ' r.,B|YɅ*ȿiX=?xlǥ-~k<1LsX#@ ĥ/_1UTX4 +i(8C6-gs90\uB1cG//(SSS9e֝ܵ3H/X -'TѕIVĺ@?M% Cx<Vy-S( BuڲڢJIH@j%g*J_d43MgΞ=*/9{ BPb Q]X"20|\$A+oT*Q~>MǂE䖛X G5KM10J `7NP( %8K!% H,Ҧe׫[+ BPbMjf?^},n H69">%CkBP(XRMQJUX+ B_(f _}=j8fYB%3?m-` EST\dݺɁ)iV5!_=Gtڐ8?pW#LYsaXi8/FW\SBP( %pQ%e6~%ǚ]&LZXTrX;BEuBP( % ujZo+ǖ݊cM!a*J#9c!vBPEֳWFF櫩^zKWWVUKASM JH(vdT4$ebqQ3[n?1֣F2mbX;BEu}`aǎb.[ 0"䊊tێ]LݿeB'O [>sViYl4d+!r 1@6ER9ztMHHvNΘqDÇFK]~i||ϜErU=m݆|쿎-̓.WGSkKJU nզmTT4^mw(KqR\\\PXuNjy޴e ٳg=2fG;99C7(bP(3-A gϝ z#֦|z 0Sg̀Z î:[uNcc-1USSJ˪koTL[#?\嵒 MX:˺1PRr^^Qrx;ݹk9& b߉5^VmX -'TѕI_|UZPO7gu(aphVP|A{@cH-I/rmm}+O^djeiOMLJŠ2K~1X&/]׸ ʸf'}#6Mp=Z4f5VQQbuL#>F[ =eIG9f>]H)mCL4r&i^Ւ B~Lcط[6c d4r  zWhPm&"`H:C.lk 8gzѷ>k,D vx}kc4 I-rC\P( k%ĥ׺M͛rϜ={ Ueioz9S( B'/g>byE? HLE+|-7YGu<5 BP/(g䝻#~>(ȁGIZE4W( Bak7c+*$=}璊kBP(J 8p&ѤFDN<5pмY ػHEBP( %քy8OO⛱q6% oC- +y˫gQW#F[PXkBP(Jot'R~=VQQbP( B] X,Ys-[890%5ͽXV[6$`(=?pf'=p0eSnMn#|'K[iBEn6 }N}MW#Fǎ[ {QQbP( W(}>z]NPOf &'Bjf6m/_!w?lbǸ\*驴_o4no .+b*[iBLߊ_P{3ΛiՈk&EmbUX+ BxaPb;=BƕXgdrȼgQdHslܭ:=ia4xg~4x-bD45-$7l6yvI%֍({Orߴ^v/) k~*,b}叫Q>{Ν.kE~Ihq؈&%P)dJϕ{D%^T^+b 8|_y 0%')o}ٳgWK ŋ ;%3"8ܼ|XlXgeO>Cx lx˶P^+<|qIi*<֔XsɭXX`_e+V/++;{mw@fϝWTT%Cn{0cǑ21)h,]ʩ%1rS3YI0zB>e inbbv/s:)0qcN[^W#"+~eO>[p}A/V+WvM%!ETt4+:v7u'O \-ϜUZV&fyė.͂}ƈѣq`H4_[O>5Q}fljjj8w̘Ql_,?m7T#G0{{#{L ޑ2}5+VuiFFEsJlt1W~C?1ɩiL[ B׮3e닡"?|J}رn_ ͘?ӵwxoJ` Bᬿ>Sz՚Dz@ytaT@d7m~f2MISJӟSn/fUZ(VQ}~=vWCvu &`x=&?sjQΙ;!5.-rF׿iFEEz8^K|32k9=?y:}Z.!oزutMHH=:5oe+X y/F'܇B_V+X[TٻNB.7 '?ۄAS|:J!5ǦFj~ٺm;T;bmإ^Yx+?h|Ɂ  oAUfu2s~Ͼ}4%ܽ>UAp#GAn1N9m::qk**Xj6**mw,G<:-Ox ֦-[09'kT:u l@$Z㜜ܡbuc{WJ;/Xk&\tACl1c!C0@c|'mсoVNyoO#@s~'Їr_V+X˽;0`(quNHHw§aWYYYxΝ?pJu˺38{,Sڇ.ͶAwƒFMUbx^bMZAx znGnn.*_V< `XF#~'8mmNKO~BΉ5-ӗP2R{.<w;|:Uoi~hEeĕUmZE=֮dPRU^^QrX;ݹk9f4P_5(?p Ey"BteҼbuc{,b]47 N^lB>k,8_ 6na^ /r<Ǽ z>J[1X; SpFǍs ՠqSq^SBuk]% >~ҭ CfAƒƏvCI^58Ή5_Mcu޷r_Pۣ!߅k [2^N#EnhzFpkkԻ6cѰ￷.12ˉ^xEu<#ȁM.{ғ4 8 N<a~X nȰ$|.:y9'yԋ^f~Q<!GF3&FFc4c-} SdbMc-7ƺY˜q,-X5׬~F3!ϝX&~pE}+X;;>I徲W2{GwgTYqVzY/X 9ʩbCzfApbL?ڢLS獱M^\Ě|P٪wpcY N~=pB;y9ZE˅ԋ^6ܚ9|I)7c_5'3&FcaT $04uutHdCc( yWjZθ1Rc{iDHJ0yx Zt([g CpIgǚqaWk܉5IkfM1ƋQQ>p?y zJ[7K>B e2^o%4|XM BuyP1um kɰBh Ia{X !R֪ Ṉi-LY&Sԓ: #9sͽ \OK2ebͧ u]~ #NfvkrOL*k#G 6Yv,%Mkbp`I)=#Fj]x͘3r>bi֐lNrc{qB/S&dFH6r`f@VpHoOb-*?Kaa\\&>)>xA+~M_yєBJ[l݋'Iz%ּ;mH[=/b-T33aEY(M!7yR_,?24B\b:ґBTu7 Clb3̣Iw @&qtU(&V'MbbXA2\He꼮WGUTX繑X@-gLFLg+%ⵃiPbĚQHF3q-?s,|3[TP( %JUTXç3i-gn Tf fBP(JڲڢJIH@j%g*BP( %uۅ5++DžJt"Fš2(V( B%8K!% H,rեZP( kRI&'Uħd(QZ*V( BĚi<8U.IFȸ;BX,pQ%֮?8؈اi_SbP( B5niX_w'֬AIiw{4*VbZP( PbyqK,]ֹ[w890%5ͤaaݥ+Fb_i֎Qg QlX/םR,ьR&}aQ1U|u>gv=kB1z uk!?R1ΙlZh҄6gޛ0i2mO>!MNn\а{mw8xI3#njom7^okzqg>B/gگZBP( XdBbSLNI.^ 9Bӊ#d_Ph|:/\:v:~kr&hwvNn^ds_G)Sq޻̹r{j5Nu&+="z䊕a#FΜ={LJNaw=CB/ѷ$8t-XeenSLGF߰;xMf) z钱o9͛W2#ϗ;W(9n~0Y $3lgcM5}0w 0dX+,%,u/(KhsZznĤd2\00EݺoҰM ,k[v Xj6**/Ŷ;R\)...(,:s\'żގ oڲ 3u1cGZnѣ~<㜜\>V(u˺Dsdk^E4 0kSg̀ (bK^􃓼B^k~cc-1ݎ"77K@NO;B5{ K$6}9w7> 8Pyik//1PRr^^Qrx;ݹk9& b>iնy>k32둑X+ @xRX[Xu}㿜8y 33όVkWkކj=z13NmO:^"71ќF>|.b- Kɷ+$ B0=B9^xUGc=J}ׇ~xk biJXɓFL lvY@uYumʃIՐ^+ĺ> dj6|)-+iU+&~N5Sm@,,KL2|#WkZkC0cri@#^_b/R`X=1JXW߯]X,lrXPIHeD,LkFTqع?";JTX+ BPb];w!CG|P,+;WkBP(v( ]q3JNIg+.)83xX?)UbP( k'.ԲGG-={zIEHyo¤({ǝrք|5b=vvQKWsJ׮Gnڲc.l^EfGiʷjq^% BP(J!kױFL MNI¿Ͱ7w^ï6Asr~ӄo6们"z䊕9yT;;sx=2lڶT~؈3gϡ!R=s5aGn? /HHL'N{Z 7F#9c!vBPEֳWFFf}UPb e|+NȄwfd޳+96VkO*lؖ/5X`{x[ $5-J&&ײy6sWPH|u"XI#.SN)^.8-$C[̞;o՚v^%Np/iTt@te 5 t?ytmWmwhޢJʌ~يf?oJefegϛ?=/**r%+z]t) ,ٽgїx>er˟|v}yh:ԎiQtG]3fiB5q اEqߨMN= b3 Aǁm2*6 (JkdO7!B5n|";Ufrj!ԔsL=eno=m.}`!FV K(0qՈ^ ii|`-QCPO͛t랔 4e .CF[ k^x)SGc(+ދLFR r*ܗX\wyp0TkxPbL>cO,b˗5Q6uVv3-ln"]78S <2j3'pX ٽ  XˍizzA߬_-4p𐛱FI ҶCv:r o70~}'B y[$$Ug8 $3- [e_~{_> twڍgdfffJdC9[mI0ѷia ^L...͛hNeEW/=2>K]~ijϜEr4uZ~~l>A50mXD`472*SHj18adK3`~aWHu z*BC[V 52sNBAaў}D="y w {A 1g"xG4IbݪMۨh۶KQ3#^PXuNjy޴e ٳgbƬy2SG3xqNN.?E tWVVxݺe]"hsv2*c#ra:c\k^'_3 (31)"֜_b~_B{#;u#t;\ /!85>}kd]Wa~!1p8ޯ% (u`͇ X6i3 *%㩺 OV >_L@EH`MCI^ {A6LxA4au()ټKɷ+$ B0^xy+LFEڣ'~YK=DOtmm`SO'@B_Sv=}'/Q╰,퉓'$,iCGX=ˉ2ookX3FX zH@² 7X̽vZk!C~%8/XQ)k^+ௐcy$|6p v{"cX+& ܅*9% bb=s.לX38WbҲr%X3)ǎع?. cP4OrvDV( eќ+coU?~اkV/%ܽ7!C3zb0_ ɰKh4Wý{hm;R+^_b]]S{o?:s#YXJ#_[DŽ?"(cfT\YnX@G"$敀UCdZn9_ٴMQjIlB!?B&nמj͘icn˂ 1DS.o(;tes׼B{{9<ᐆ=̔+É)ЯO_lKhGc3#fsx=7c$1\uVm֚PQi:FErrfгr* BZEEkRk&MgΞ=*gb/FP( BJk4! -[n糒+]1j&+ BPbRZP( EÁk% BP(tڢU+9SQbP( Buva͊C% \|VAMu UTX+ BpC%UFVrz4xX?5ZP( rHsFGS3$ 䰊 %*J BP?PbMr`):Kpk82mz)L-~:pP.RQbP( k% Nف^Xk% BP(Xگ5vZB%3?m9&ٚFCǎ,Ys-[890%5M&֞oc=n2`1Bgޛ0i2-w<+)ywtz-[;vV-\BλHL q i+ ,ZE222_j %PQ%e6~׶}pwǒ]NW#:et(lrJjaQB/:'M|㭷QV^q=rUL >lșd&% :̕XCyn@>_M?qR.V"* c͏_Ӭyi=w^QQQXa>[Ml)IV:vFӵ!_ah9}Ҳ2ȖD;)_Ww[ŋb5xȘ^A/4U>|(nS#G 3nf_;X۞tn޺ͤ+(D߷Nb 4$;wNb-Bvh=X$릐K]q+zYqI9?ZV)4.bz /1_P8ecaÛV(&NMMK? ~]uOJN.))4e 5ʑ-w^|/K"?o]zmZ+ebrj|E{mX<|m呀I:lqd69}'b-/ .1q_W+crj!ֶ{ĝ }`!"밋{QX4!| b8''whE ŌY!TVVxݺe]"hsvk S/^wr/#f<~VpR; ezAwGcSӧ~Pb=yT&Uݒ!|M ")y$BV :>xeb]K3P;SLF:"*/cmeJʿ#//(SSS9e<ѝܵWWWoqS"$Zh9ܮLzdd! jr3պJ3 |A^a kaa<vW(I(>iX&,KK3L)9RHIIQb]kkdAsl;52?ɶTzM{f̝O@=-=3hp/LCtBbvp/*/XZ[>{6lȴwϣGv'OrMdaqfC 1ڣ'2EC|4bP(&nb">xNe{s'0y޴t9|XM+aY'O11$IXe%v(>xC_g9wڴmJwĚ:=5<&YrrkFV(t'y\Z._;E/?\y&D_y}ny) k'̾B4\_v,:KS-I9qgן,)fdGomm펝;3N"dXT!&z՚5O<11͙Lsˉ(CC0.d]h9 EiBѠ701Kyu7喟9{!W*2IWP( k&Bӄ|,XHn&U8;wƢQK BPbZP( BkBP(JUT,V( B^t*%!ɪ,DEEBP( ]nva͊\n}dXk% BP(7&x0NW.IFbf˶NC/5|EY9{B8u˺Dsl@.)ߩA1Sg̀ @gvMMk^=#;uÒs% ӧOc]Pb-xuܼ|BXK1]rUO6oF07xeycmJ?+//(SSS9e<ѝܵWWWosċ"B Ute##X+ P[mGx.ǐ3OU2<5p/P|WiiM/Zx@uÁBY5ew9vX;/ߗz7t=zFi0nxkkk- X,+aY'O11$IXe% AиϿXxM/68'֬"wWgKBc-chR|^5roc'|HCe!Ub :=L<`,@[kFV([n#ԋk߉\Z3@uXy^ 8`Df(XqA!*MIX3^ع]fi#} *C? nX@G.$vN)ئRX{j9_ٴM9fYBJ:GPw2~պ][6c&A51DS+M^O-#Fr:w@B 8gPHqd93^[b=xX?5Q=*V( BĚi<8U.IFb2ÉްSX`lh(6|#Gިk BXn={edd}Y4E BCقѝXg(VAC;udR׏{ԙkي&|)-B=)0ety}ڐڴмE3gzJirϞ==v%$&%9D߸1b[둑^0B9[V^>o|{h; (P)=nE՞R9ztMHHvNΘq݉\~llUWWCFmP0B9ќX]|6z~yp0/2f_QPbp7jDYyE+WSM0irrJjaQ 񍘛=z>z칈5zdTIiنD 890#^Zzc+}F\H{./KWg`4;!1?qRݪd:c&>1)y!2:}~c6oƺz;v9ƚWUUcw÷N@^F9g _,6-/**⍈ӌ !`޽{N] LOzJlݶ_oZ+Fv5 X7'yq gsL.,*rBÇC^d,pNz=},.xۺMiu}_Pbm>uL 7kl-w YhlƸ>޼u9+($Mz潤׍w68eMz Uۈ5Y܅Psb-7~+؂Rs:{Uk 2Mj ,k>nզmTT4^mw(K 2qz;>+i(8Cuz7+@MMZh9N480\BѠ0cG}W 9}ar8Vcb\*WmB2.j 7a#F 18Is71)!C-+7^&rc}r!֞,tB'֮o,6l܈O#nϴ;=ykxla)G/2!3K޲|(n8P(&nb">xX 큒" ڸ~7~a/'NcHz7ya^6b'yeiOj” vO/TX{ &yqGLeVbeU5reb-n~x db-4XN1cͬc-k;X6-okBAL3>X c6! a}-bM0Fv)9v7'y<..#ox-y^ ̾P(1?sC+*ߴg[ﴀ =Va"#Aau[Bmv!._%p^VsxbfT hK/T-k.xwḠc>reb-nvCm :kF1;w2b3,dXT!f,r՚5 MK|$ܽˠ!Cp:4 jZGci<v( )!N11xVI^^F)}pa}$֦:^ ݣ;w8}+X bD~DZo(2z:& A|#}zg $ :',Ё 90b$#;(RX{j9_ٴM9fWBJ=̴֍WŴ3a^hir25|C.@f/^w#)i2_f&GK}3#XW[]/;C)֖$VbD1Ot+Wx{ BPb]V]|`R5)Jbn'(TbSFQcnޔ[~YB q0K@2BP(XW߯]X,lrXPIHeD,,SE|-7SQW XS( B5R]S[XZq'%#<+i(8Î6_MZh91' r;4`kAaƬ*++y6mʴ0T| @:i{4> 089 fτzci)ʤtS孇RHIIy݉N*|$g ӁkXO#\H]bl1cb qXkx!=#oW0M6~:b-Y?{gѭQC,33cLa633a`ƀS{'h'Oufgf=^X3≣8_|sNVhb1byyd@a=lS^rs0I(^R6fT~֍PTBs0p^`daXsli[:~yX@ fnɋ`x#-bF#32X[[7!a=h0YjzZoݺ},!1VWY Gc|ey9<;'0OXoܼ|ǟ~ҥ*cm3؂D@7&+*2s >E"eYND3gɾ>߸WHaed*pc5a kxژb 뙳g3Ꮫ#}-v10qKѦ5 tʓ{l!oꚚK}'[nB |>l,ކӦxԖF=A,ma8^ڳwj ^n7%&M,i 555FX[O_׬aҲ2vFc4ٿy k% k k?ē(o k!Z ?_~53ZnT)ӦڽŋUU޳]!?<nǟ~3gmR\Bﵵu-KH5ڡì9s@yL*^|yz?` Ν7w~eCM6 =4믿b7mv=aSm_z2ٳg̓]o1[{;k Ba]ϲ+o:2a핵q2FQ M:k,9sqN޲u.O?19dp6'6RaQqfV2j.(TDX?qqx)X=sKqĉj3a-5-=+xR$8CURX=ֳ8.++UZfcH;wgJjA ۶o[$VٽgϩSkl6VXcƵ@X?ē)w\cx i҅8wlᢸk#^ޟ~^$(WTT|d"hIX$$ёyYY-&q9\T@a]27w|Գǘ♾^nܴ~tmC6##$KD6JX=g;ɻGU]ר'zam 7 v=їM${]=y{,톍qBb"|i߾"a-((iAp9\ZaM\X5Sa !;\oa~]&q FX'B k$B!$$-$B!aM$OV7E[JB!֍M|v% k!BD5k_XKX7Duuc֬[j{IXB!$YK Aul\  ԻvپsB!D'ڳw;., Ʈx=]bOHtjN|Ï|{xpy<nȜy/\dVfѻ =ߺͮ={?w>6xU^gtًk֮ Ӵ?_$U}-.QՉI8 PXZ!@:3+_wyg=g]v7pPn^~u͉?_UqBbsZ9(a=w 8F4(T\PXO9zl/"UHX{3  !CwY'tKQ-[j_D'['zoQ|y{ԘK-wU) q4>K\~;o4iU(䚋:Tρ!%%(UW7 { 3!1U^Z'tKo(B?nnP-۶]^#193[_"_3-Nvݨ܈AN;I<^*wh']*$屶йuouIiI"7{sMmm۶m۶m۶m+z?I6gOiMלnw:|;3U^}i|3qSx*Q49b(۶oPW#*n{>zZ7n o]`͛nY'ȁS:t_} 'Ά xϟ~mMtStt;H)v&| Ν7btjJhz6EJzQG?ZmqOw(Z9ݲuuPp1n V7hN^#ʔki \V/>dڲukt$"Ŋ- ̙37/*T̊7=I +ɥv/]P/Z<'Nλ.^r<{[+e8ՍGcS_`/+ɱN- ҭ+Htr*U(ZmX;˜A[X|f9rnܴ2䇟~>rI@;c5k]n=( :}ͷcPѥfZ`ݪM6mEfOw_M"]Vh"]nֽpן3w|E*e(c)E< d ݻn2mڽ{Ν?oNps :Wz̸]:uɓ'@꙳f5mo߱#V0eC2l%ZZwWLY}W\ե[w.Hwi[\\j *  \v7o!aP+ /ZLkSWk`zXG8dө X[|;{C|2Q~h5O*[e'!4ūʑsĉԿ}߫Ol?_%?nxC! ӂ !>~_0#%S-7~<w?<i;I=6&{?t)ڽxk2!Zu?*]HwYNy["#A0,>ťK"T0:3%L(@s?j*_<^PU<(6|PXgRO#yVkV)6]j`mK-@j򕵁IxV@=zԱSgZ` `^Hz`f.J݀%Xa"m },]/E#s)\)+5abKʙkq޺}g!R\T62u ʘ{ *otQj֩K">bj}j u/Rur5;>9zڌ}X vE_ q?xЪ5jAX3ߏQ89֭[􂅋g_|mvGrSVtӧO݋$XFKck׮! fC6}ٳgic0b7n(Mԡ'%Kt;~닗,D2ؒ"ŋ򂜐dwߣS56XG+. v4s 8yWMrN$ F_Qt30d4k6ÄQdҘ3c{:(Y+w$k`WkmM B%ȑ*dAd ,YGօWNfɜeU`e8~X ƎTe5Й:q.*Kq96CJϋɕ\^_3f)+`nj׭k\cZD₠x`uwر(U#WyWj{iD-5˯rO;J"&H 0;qBcr Fhp"}ݏHW"]h" `2 XG_Qt340D0,۞{DŽ{kQk#G(Y 1>'d;UFfFVpsECg7sCVQnu񦦂ebaEo $ll#OC̈sUY˱RJureJ5x6pX(XVfpthp[]AI$ˀիנhٖaZ4_81Dm8,==?<űl!ƕ;]i@%6Xl 0IXss.˘ jED<-D({,i޲EZc{"o`NP@ 6YrO\XBSV^UV@#ȍs=:(5,yH &-J'eq.+ q96[J N^ ޼e~,Ib;~x?p5T]KpL֢/H֎=L=$6h:1;+"{1)V#qPٳ'QȡwF;{lҬYE=֪p.Kщv4s D::Hc`}:(Y+5k̑`mG&94i5>o5k]u,W+zuP`e M 5kRK)ɕ+֤hc.]goJZPK}Nu5cGՏ; ̞3GcOHac CZ0 sLSE=p$, GޅS &8A$+pܩlMkq.*kq6[J N] Pn04h -&/b.@X2:6SvA49iȑ亁6XFK= ݜ?`S&LCet kq<^(IZp`(XB7` 3=*a}թ,hkCٹ=}AwED$,D'<ϭDjvSt* #JӳQM%=MzR[y '"^v-ϲ#ZB1`1nA~b_/X!KVksk~ Clr3̜Uteb &"Hc)`mCuHBuI28]ι\)%:t%: yU|RJRɈP$"/Y8Gmw,,*,,@KBe&©ꏚI:n;L:}tԽOx7?,9!~\[_xU[?>1gsx^kBkϠ+(ӤO̟Ѳ9E<#ֈ5!5'Ě pd)b 5L}̭u; 3XR\R* '|&ݔn | NHL }n7IHLF?5!Ȩh׏|Nhb@ ]VsZF?5!>욺5kX#XĚ ֈ5 ք ֈ5 F?ȱZ)Q3-='է3gkqK8(#ӁX#eXb=fxR^:ϙUPW zΐaçΘ)m7`oj֩+W/x4X+eufm;v6hD3!9y?o&?6 1rII nW>B}/_zTrMĺl?IԐZ6,|U\|DEۜVZ-[T [f&ɴȪ쏕gk$eX[Z/מ3ЮԈ7/_֦]ĺa|$==]sBӺ]3g"v+֪|KݸQZ*+.]֪4ь"X=& +>7k9Vgc_ݵwa/^)fVpBPU"6lbYvZ{.b&۾r*u.b]&`b]c-K2:z\vk˹XX CuuAaV׮[A&O6adCiSB~uuDw1XkX$Ԁ'OU.6c ^cm3eo޹{OebO:fY~5Zc֮vk5]'/O:|.$K6*VD_fmaQ |LW$77Wo9z o2=z7{%yzC.*_v˧v/%KYf "mުu^zXیk?A ׽h>zpf&oq{+zd $W:o$_9{uڈ h7~jn[_Tt2;Z޸ynA06c&ګsm'_X//"XpQ5]kzz{K}X#֟ b 2ԫP&W]rkĚ ֈ5T#&@ bXbMkkX#`XX{@ ??BB#Xϔ7PjTbR2b 5L).)jqxoDҭ!X' I' 5 ֟9DE[eֺ<#XËU ք=Ě ֈ5 F&5b 5!5bMk*b534o&OC5m6vGAu>r_|h6#"f̚ݼUkuulT+99yYոi 'ӝ,ϥA&#FTSF[zŪjFDYn}u._%ۿJVY/>v\ԙlJZJZ6;vĤ;w8 .x82333{?OԬSݻwjKXqcbb[J}%K;޾}+/4e:ݙ=w#25ֵh?:uL%GE0b*y6ĺ<}GYXXMCzP4ڴj&m/YPP/_z5h(7풍7#Eb]PXU7Xoт78Ӷ:Zb=qT=XXTl6͜tcGEqদGooыM=Yl{{VȄIUsp:Ytgjxzlz[Aoiwz޲Ո@s|*U@ri}n Uҭc7Ou# +^ ֊{wڭ ת[o`%֪ʥHU,[Az$:=#_׺ ~X߽NUǟ萤 .] źX#b_0xp79vb_Pتm; ;A22WU-kp;?6k 9J=~{Oùr.ڣ={KźWj+Z2ܵ{̘n={J-\pz7n=n|Mڴp1ҙfKW>~\yx ~Vmv?8YVT{`ɱe:ujӽG>ٰijB\ފ":&V~H ^nϜ;vZSRʬ^%5T_e 7}KfpPn.zvN6efGAn߹ vEܼ|mڬQmJAVZyT(֕Y¹mfehWze'b Z8(5tώ]̊h(l3X fcwY϶KgnѭGOUXcF]XW~zF-vLm۳YVFWksUb)oYVu${o9tH3l¤創Ś'?@ΘͅKV=޽*Td~굵7VųKsA*bX˧ꭞUk֪C>{nʴ./^F&M#ݬeZԦ֭ ]X"b V^GD_m; Iٕ!aйc?#Te7Y^/кj\h]˃͚cis}Xk|tuu7mXzk@s"ĚĚkBk@ZظgaOF}kX6#{!}x5b ¢o;mw85xD5 "$'&%#).}}kX%:?i﨧gx=}欧&Xb]RRZ s~edd=V$'H=qSgΪQmX@O'Nڤy:gyV 9p~%?*֟v5 z_k׫z79/^Zq BGُ1M ֩i8yb_JkXxgweeMNI5gn-l5o%~MQaλl:XٶCdžM8)&6eڴ/[Z?o49cluhuHٴ#GoԸsn~#Itc:5MMuϾX ,~^w~Nɻ߯0xakXIa2/_=~R^ b%j~cm=.(,rߜy-o|-5xXeW^dq޼ҮKm&$$-}2a)ΰ/~oG_h}Z5yi[T8v~-_bǪl޹{Oz7HySװsyEohmj!C˛GxskXk;jۣ[vkS'O~+׮kWA5]a?dh=~´C*S?WˍB֦֧5F6SG_YhZ8iwߗ7[k PMZTcr]f7:6lxiw]eS^ -1\U&k^2c .P#>g{XL$Pg2J]vkkÊuyu>Xymnܼ]><ҭ*"rHe&e Y1'Hw]T:vӧ_|S 6uA!Geϊc/Eb})~XbMk^ A&ЬlRߎ^&o;b Yٹyj <2*:1)uqIiL\V4_D3 qkنVﹾ5TXBk@ A&/KCAbf= XbMb uyQԙ.mBkJp\S:}F%mcIl /4!!uVvNX׬S7%- bMkX:|DٴE;}.K)jԪn٭g/54ik 9~Op8W^ɯk kޢs{uڭN:ue tOFcU:FvvgVfź 5@bo@r݆jtEoɫM ,(,ѻz6lpf}`5Yhڽt8u_ѥ݅&XX@dnnbm3O A~QҀa_v࣠֯w*/ւLmIn^6jF:Zrvf8Jk7njjզjzsXLBk@2p2_ڜ7F^Ѧ{k͚;OƬMcK4nb-`gΝ.sFX@b_ZwUͱYU6]vHh:ad{6:jB`hiԟ(b%Wuԟծp P)>}TRj1hDqIimyamvts朹KpaQqb-6ZVZTLnB.Z%Ϊyhߚyt?_3s ʊQeg$-Z}P;}hչW*DX^_טg̸b k֭^`b~9.mԴِawOZz|C.P.~zgf+; XaN XXXXbMb ެ,L o;b kFxěw~#WoȘx5b ¢o[mw85xD5 "$'&%#).}}kX%:KG7Xb]RRZ 3`Ǽ*AZudS5k٪QfcO|{8yL6]rz;woͮ1FM~ƃ  P}Zot7 ά_7a:H='Obsy|z5#rr"?1"Wb|j5άeW4h$95 a..$'h444}Wܽgڲ% Tg7nl~.O5 ֒AoLo %_t;wM;..ވ6ZkCMOwM+];w1{,9{u6ZP/((=~f*6GEEkܜ'ܵg>-i&j޻o6+<g6O:M3z8oWoII6?ogk>~t;pj})}A[22Ֆ:r:jI8y?]J~X&j [hRK\~f*6뿒Wٳ˟DTlmpQݚ9թM[ڕZ_|;Ӵuڊ۹s{Xbq:tb5SEUXkk߇k˞a;}Jp{9$P'2Q\v0Ĥdҕ'Q5Ȯ={u j2iEkmڟ_'Qoۈ>\kb]XQSGZZzzz_I+ozGN׽:::f1A/mܬVOU} )_fi>.#084ISj2zu E6srϬ\۷UIDDڪPYt9SVZJ;TJsmw%0c,D7&Xʜz+ʾ57 KLLڸi7{%*sxV֚7#nj˒j3o {^g_vACʏ{{? PĩizAakjd:u6EZ6v=-*6Kdlۮ:</_q?I@.ݺר]GGisێ[U֒M7x St^+ADi:f8m,avI TXb]PKٻ*ըιvץxVV/Eb})5[N=J,[^K~2 X#GgBuv'ά:B[&:8$4++[r#ķx):6>ūpGVvn^>!}=NLJXb]\R<'Wo:.>QtzP~̇OC^t8X o߽_#";xxwv mw8ku{īѷb]]u!~5 ֥oCeĚF/Fk@KJJgȀAGsONNX{z k@O?o+X{vbb uqIܼuOyy-۴}կRGvbb7jܵ{4;XٶCdžMj@Ll\NxV.*.IS<}Fl]boڴ>uȨJSR?y'DEd:֬ݷ_AaQLxZUUH|Bb\[icv#GՈ|%Vis6nx5t_PPؠq/jnijb j*O]:rT{5ldi @5\rRk_Pض}U[=?E#>XE}#ѱqU[5!_#XUI7%o(,?d3* ?p Q3ɭϊ5 zūpGVvn^>!}=NLJXb]\R<'Wo:.>Xb$K!|p )JA#{!}_GDwH5baa۷p:=%Wo;/źB<k@KV&d}'OrOE&'Nzzb uIIiu!^!X~5O:]^Xb7 SXTܾc 2qĺTn?//e/^*sL>}o4x æC߰sSRg͙۬e-[͛ ==ٷ__AC,[ k@KH4egie+V9Ffܸi{2έw4h$95ha"mʰM?|(m/{|xDd:u=~z nxZه'$iAjj6;;}xf=~9t>tyBKm&$$wxy㣢5lExVV}?$8Gp&3>t䨵9nM}oO![vO5 ֱ /^;s ydTtbRGҘxi Documentation de GPS Correlate : version graphique

Documentation de GPS Correlate : version graphique


La fenêtre de correlation

La fenêtre de correlation

Mode d'emploi de la fenêtre de correlation

Étape 1 : ajouter des photos

Le bouton « Ajouter des photos… » permet de sélectionner des photos à ajouter à la liste. Vous pouvez sélectionner plusieurs photos en une seule fois à partir de la boîte de dialogue qui s’affiche. Une fois que vous avez choisi les photos que vous voulez, cliquez sur « Ouvrir » pour les sélectionner. Leurs balises EXIF seront examinées puis elles seront ajoutées à la liste. Si elles ont déjà des données GPS EXIF, celles-ci seront affichées dans la fenêtre. Sinon, vous verrez simplement l’horodatage des photos et leur statut.

Sélectionner une photo ou plusieurs photos dans la liste sur la droite et cliquer sur « Retirer » supprime celle(s)-ci de la liste.

Étape 2: Les données GPS

Cliquer sur le bouton « Choisir… » fait apparaître une boîte de dialogue demandant de sélectionner le fichier GPX à partir duquel le programme peut lire des données GPS. Une fois sélectionné il est chargé en mémoire. Pendant le chargement s'affiche une boîte de dialogue vous demandant de patienter puis, le chargement terminé, le nom du fichier apparaît au-dessus du bouton.

Étape 3: Établir les options

La case « Interpoler » définit si oui ou non le programme peut interpoler entre les points GPS. Par défaut, cette case est cochée. Sa désactivation implique au contraire le choix du point GPS le plus proche.

La case « Ne pas écrire » si elle est cochée, empêche l’enregistrement des tags EXIF GPS dans les photos. Cependant, la localisation est affichée dans la liste, ce qui permet de vérifier préalablement les résultats de la corrélation.

La case « Ne pas changer le mtime » si cochée, inhibe la mise à jour de la date de modification des fichiers quand les données EXIF GPS sont enregistrées.

La case « Entre les segments » si elle est cochée, ignore les segments de piste, et permet la correspondance des photos entre des points de segments de piste différents. Normalement les segments de piste correspondent à différentes sessions d’enregistrement du GPS, et l’interpolation entre des segments de piste pourrait bien donner une position ne correspondant à aucune données.

La case « Écrire en DD MM SS.SS » si décochée, va forcer l’écriture de la Longitude et de la Latitude selon l'ancien format DD MM.MM. La valeur par défaut est maintenant d’écrire en DD MM SS.SS

La zone « Écart de temps maximum » indique l’écart de temps maximum entre un point GPS et une photo pour établir une corrélation. Exprimé en secondes.

La zone « Fuseau horaire » spécifie le fuseau horaire utilisé lors de la prise des photos, de sorte que les données de temps de celles-ci puissent être ajustées pour correspondre aux données GPS.

La zone « Décalage des photos » spécifie un décalage en nombre de secondes à ajouter aux photos pour les faire correspondre aux données GPS (synchronisation). Voir la page Documentation de GPS Correlate : les concepts pour comprendre l’intérêt de ce paramètre.

La zone « Datum du GPS » spécifie le système de référence de la source de données GPS et fait l’objet d’un tag EXIF. Par défaut il s'agit du « WGS-84 », et ne devrait pas être changé, dans la mesure où le format GPX n’est pas censé contenir autre chose. N’utilisez cette option qu’en toute connaissance de cause.

Étape 4: Corréler !

Le bouton « Corrélation des photos » permet de démarrer la procédure de corrélation sur les photos sélectionnées avec les données GPS chargées. Si aucune photo n’est sélectionnée, ou s’il n’y a pas de données GPS chargées, une erreur est générée. Dans le cas contraire les photos sont corrélées et vous pouvez voir leur changement de statut dans la liste pendant que le processus se poursuit. Si des photos sont localisées, leurs emplacements sont également indiqués dans la liste des photos.

Autre outil

Le bouton « Suprimer les tags GPS » permet de supprimer des balises GPS sur les photos sélectionnées.

Enregistrement des préférences

Depuis la version 1.5.4, quand vous quitter le programme, vos paramètres sont sauvegardés dans le fichier ~/.gpscorrelaterc. Ils seront rechargés au prochain appel de gpscorrelate. La version en ligne de commande ne fait pas usage de ce fichier.


Retour au sommaire gpscorrelate-2.0/doc/fr/index.html000066400000000000000000000072551355604302400172310ustar00rootroot00000000000000 GPS Correlate

Documentation de GPS Correlate

Écrit par Daniel Foote.
Traduit par Vincent Gay (vgay à vintherine point org)
Voir le document d’origine en anglais

Sommaire

Code source

Travis Continuous Integration Status AppVeyor Continuous Integration Status Cirrus Continuous Integration Status Code coverage status

Le code source est disponible sur Github. Veuillez télécharger la dernière version.

Note importante pour les utilisateurs de versions antérieures à 1.5.2

Avant version 1.5.2, gpscorrelate souffrait d’un bug qui provoquait une erreur dans la préhension des dates. Le résultat était un décalage des mois (janvier à la place de février…décembre à la place de janvier).

Cela n’affectait pas la correspondance avec les photos puisque les données GPS et EXIF étaient converties avec le même bug.

Lors de l’enregistrement des données GPS, les tags GPSTimeStamp et GPSDateStamp étaient écrits avec l’heure GPS UTC et la date correspondante. Les tags DateStamp et TimeStamp étaient enregistrés incorrectement (à cause de deux bugs distincts), à environ un mois de la date réelle. La date et l’heure d’origine de la photo n’étaient pas modifiées.

La version 1.5.2 a introduit une nouvelle option dans la ligne de commande, --fix-datestamps. Utiliser gpscorrelate avec cette option pour une série de fichiers JPEG files incorrectement tagués permet de détecter et de corriger le problème. L’horodatage ne sera modifié que si cela est nécessaire. Vous pouvez utiliser gpscorrelate avec l’option -n (ou --no-write, pas d’écriture) juste pour voir quels sont les fichiers affectés, mais sans faire de correction. Si la correction est effective l’option --no-mtime (ne pas changer la date de modification du fichier) est implicite.

L’option --fix-datestamps nécessite également --timeadd pour indiquer la différence entre l’heure locale de la photo et l’heure UTC.

Plus d’informations

Pour plus d’informations, nouvelles versions, commentaires ou questions, vous pouvez visiter github.com/dfandrich/gpscorrelate. Pour voir le document d’origine, vous pouvez visiter dfandrich.github.io/gpscorrelate.

gpscorrelate-2.0/doc/gpscorrelate-manpage.xml.in000066400000000000000000000500161355604302400220450ustar00rootroot00000000000000 Stefano"> Zacchiroli"> 24 Oct 2019"> 1"> zack@debian.org"> GPSCORRELATE"> &dhpackage; @PACKAGE_VERSION@"> Debian"> GNU"> GPL"> ]>
&dhemail;
&dhfirstname; &dhsurname;, Till Maas 2006-2019 &dhusername; &dhemail;, Till Maas, Dan Fandrich &dhversion; &dhdate;
&dhucpackage; &dhsection; &dhversion; &dhpackage; correlates digital images with GPS data filling EXIF fields &dhpackage; -z --timeadd +/-HH[:MM] -O --photooffset seconds -i --no-interpolation -v --verbose -d --datum datum -n --no-write -R --replace -m --max-dist time -t --ignore-tracksegs -M --no-mtime --degmins -g file.gpx -l --latlong latitude,longitude,elevation image.jpg &dhpackage; -s --show -o --machine image.jpg &dhpackage; -r --remove -M --no-mtime image.jpg &dhpackage; -f --fix-datestamps -z --timeadd +/-HH[:MM] image.jpg &dhpackage; -V --version -h --help DESCRIPTION This manual page documents the &dhpackage; command. There is extended documentation available in HTML format; see below. &dhpackage; is a program that acts on digital images in JPEG format, filling in the EXIF (Exchangeable Image File Format) fields related to GPS (Global Positioning System) information. Source for the GPS data is a GPX (GPS Exchange Format) file, which records GPS location information in an XML-based format. The act of filling those fields is referred to as correlation. If GPS data are available at the precise moment the image was taken (with a 1-second granularity) the GPS data are stored unmodified in EXIF fields. If they are not, linear interpolation of GPS data available at moments before and after the image was taken can be used. A measure of the approximate accuracy of the GPS location reading is preserved when written into the image. OPTIONS These programs follow the usual &gnu; command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. , file.gpx Correlate images using the specified GPX file containing GPS track points. This option can be given many times to specify multiple GPX files. For each photo being correlated, the first file containing a track covering the time the photo was taken will be the one used. All <trk> segments in each file are used. , latitude,longitude[,elevation] Provide a specific geographic coordinate to use for all images instead correlating along a path in a GPX file. The format must be of the general form latitude,longitude,elevation where latitude and longitude must each be in either decimal form, such as -123.45678 or in degrees/minutes/seconds form, such as -123°45'67.8" or -123d45m67s. Providing an elevation is optional. Each component can be separated by commas, spaces or tabs. Note that this option has a known bug in that it does not parse numbers correctly in locales that use other than "." as a decimal separator. , Only show the GPS data already in the given image's EXIF tags instead of correlating them. , Only show the GPS data of the given images in a machine-readable CSV format. Images without GPS tags are ignored. The fields output are file name, date and time, latitude, longitude, elevation, where the first value is the filename, as passed, the second is the timestamp, and the last three are floating point values with an optional leading plus or minus. , Remove all GPS EXIF data from the given images. Note that this only removes the GPS tags that the program could add; it does not delete all possible GPS EXIF tags. All other tags are left alone. , +/-HH[:MM] Time to add to GPS points to make them match the timestamps of the images. GPS timestamps are in UTC; image timestamps are generally in local time. Enter the timezone used when taking the images; e.g., +8 for Perth, Western Australia or -2:30 for St. John's, Newfoundland. This defaults to the UTC offset of the local time zone as of the time of the first image processed (versions before 1.7 defaulted to 00:00). , seconds Time in seconds to add to the photo timestamp to make it match the GPS timestamp. To determine the number of seconds needed, just create a photograph of your GPS device showing the current time and compare it with the timestamp of your photo file. The EXIF time tags in the image are not modified based on this value. , Disable linear interpolation between points. With this flag, the nearest exact point (within --max-dist) is used. Without this flag, photos taken between the time of two recorded GPS coordinates are correlated based on linear interpolation between those two points. , Show slightly more information during the image correlation process, such as the GPS data selected for each image. , datum Specify GPS measurement datum. If not set, WGS-84 is used (TOKYO is another possibility). However, GPX is not supposed to store anything but WGS-84, so this should only ever be needed with the --latlong option. , Do not write the correlated EXIF data back into the image. Useful with --verbose to see what would happen during image correlation. , Overwrite any existing GPS tags in the file. Without this option, any file that already contains GPS tags will be skipped. , time Maximum time in seconds from the photo time which a logged GPS point can refer and still be used for correlation. This defaults to 0, which means to disable this check. Only one of the two points need be within this range for correlation to take place. If the accuracy of the location is paramount and you would rather not correlate a position for a photo at all if the nearest GPS coordinates were recorded too long ago in the past or too far into the future (relative to when the photo was taken), then set this to a nonzero value. , Interpolate between track segments, too. Generally, track segments show multiple sessions of GPS logging; between them is generally when the GPS was not logging. Since interpolation honours the --max-dist flag, even track segments with wide time gaps can safely be used if both flags are set. Without this flag, photos taken within the time gap between two <trkseg> tracks in the GPX file are not correlated. , Do not change the last modification time of changed files. , Fix broken GPS datestamps written with gpscorrelate versions < 1.5.2 by replacing them with the photo's time stamp. Prior to 1.5.2, two bugs wrote the wrong value for the GPSDateStamp and GPSTimeStamp tags. This option will check each supplied filename for the problem and correct it. Use with --no-write to prevent writing these changes (useful for checking for the issue). This option also implies --no-mtime. You will also need to use --timeadd to specify the difference between localtime and UTC time for the supplied photos. Write location as DD MM.MM (instead of the more accurate DD MM SS.SS) as was the default in gpscorrelate versions < 1.5.3. There is no good reason to use this option unless some broken program expects this style. , Only show a summary of options. , Only print the gpscorrelate version number and copyright information. EXAMPLES To correlate all photos in a directory taken in western Europe in the summer (i.e., UTC-2): gpscorrelate -g Test.gpx -z 2 *.jpg To correlate all photos in a directory taken in Italy, switching to UTC-2 or UTC-1 depending on the daylight savings time in effect when the first picture in the list was taken: env TZ=Europe/Rome gpscorrelate -g Test.gpx *.jpg Correlate all photos in a directory from a track spread out over two different track files and taken in the computer's current time zone, interpolating between segments and between files while ignoring photos taken too far away from a recorded point, without changing the file time stamp of the files, while showing details of the process: gpscorrelate -g track1.gpx -g track2.gpx -m 120 -t -M -v *.jpg To correlate a photo taken from a camera with a fast clock (i.e., the clock was 77 seconds ahead of GPS time): gpscorrelate -g Test.gpx -O -77 photo.jpg Show existing GPS tags in a photo: gpscorrelate --show photo.jpg Show existing GPS tags in a photo and output in CSV format: gpscorrelate --show --machine photo.jpg Remove GPS tags from photos: gpscorrelate --remove *.jpg Add a GPS location tag to a photo taken at Ulmer Münster: gpscorrelate -l 48.398620,9.991417,522 -z 2 ulm.jpg EXIT STATUS gpscorrelate returns 0 in case of success, 1 in case of major error (such as a read or write error) and 2 in case of minor error (such as the given GPS track not covering the time of an image). SEE ALSO gpsd1, gpsbabel1, gpxlogger1, cgpxlogger1. The documentation of &dhpackage; in HTML format is available on the filesystem at @DOCDIR@. LICENSE This manual page was initially written by &dhusername; &dhemail; for the &debian; system. It was extended by Till Maas opensource@till.name and Dan Fandrich dan@coneharvesters.com. Permission is granted to copy, distribute and/or modify this document under the terms of the &gnu; General Public License, Version 2 or any later version published by the Free Software Foundation.
gpscorrelate-2.0/doc/gui.html000066400000000000000000000116031355604302400162670ustar00rootroot00000000000000 GPS Correlate Documentation: GUI version

GPS Correlate Documentation: GUI version


The Correlation Window

The Correlation Window

How to use the Correlation Window

Step 1: Add Photos

Clicking the "Add Photos..." button will allow you to select photos to add to the list. You can select multiple photos in one go from the open dialog that appears. Once you have chosen the photos that you want, click "Open" to select the photos. They will be scanned for EXIF tags and added to the list. If they already have GPS EXIF tags, the data from those tags will be shown in the window. Otherwise, you will just see the timestamp from the photo, and the status of the photo.

Selecting a photo or multiple photos from the list on the right and clicking "Remove Photos" will remove these from the list.

Step 2: GPS Data

Clicking the "Choose..." button will bring up a dialog asking the GPX file to read GPS data from. Once you have selected the file or files, it will be loaded into memory. While the loading is proceeding, you will see a dialog asking you to wait while the data is loaded. Once loaded, the name of the file that the data is coming from will be shown above the button.

Step 3: Set options

The "Interpolate" checkbox defines whether or not to interpolate between GPS points. By default, this is checked. Clearing this box makes the algorithm round points.

The "Don't write" checkbox, if checked, will prevent the GPS EXIF tags being written back to the photo. However, the point that is matched will be shown in the list, which allows you to correlate and check the results first.

The "Replace existing tags" checkbox, if checked, will make matches replace any existing tags. Without this option, files that already have GPS tags will not be touched. Unmatched files will not be modified, regardless of this setting.

The "Don't change mtime" checkbox, if checked, will prevent changes to the JPEG files from updating the files mtime.

The "Between Segments" checkbox, if checked, will ignore track segments, and match photos between track segments. Usually a track segment differentiates between multiple GPS data logging sessions, so interpolating between track segments could well be interpolating when there was no GPS data.

The "Write DD MM SS.SS" checkbox, if un-checked, will force the pre 1.5.3 behaviour of writing Longitude and Latitude as DD MM.MM values. The default is now to write values in DD MM SS.SS.

The "Auto time zone" checkbox, if checked, will choose an appropriate value for "Time Zone", based on the local time zone and the time of the first photo in the list to be correlated.

The "Max gap time" box specifies the maximum distance from a point that a photo will be matched. In seconds.

The "Time Zone" box specifies the time zone that the photos were taken in so that the times of the photos can be adjusted to match the GPS data. The format is hours from UTC or HH:MM and may be negative. This can only be specified if "Auto time zone" is unset.

The "Photo Offset" box specifies the number of seconds to add to the photos time to match the GPS data. See the GPS Correlate Concepts documentation to understand this value.

The "GPS Datum" box specifies the Datum of the source GPS data, which is written into the GPS EXIF tags. By default this is "WGS-84", but really should not be changed, as the GPX format is only supposed to store WGS-84 data. However, you can change this if you wish.

Step 4: Correlate!

The "Correlate Photos" button will start the correlation procedure on the selected photos with the loaded GPS data. If no photos are selected or no GPS data is loaded, then an error will be generated. Otherwise, the photos will be correlated and you will see their status change in the list as the process goes on. As photos are matched, their locations are also shown in the photo list.

Other Tools

The "Strip GPS tags" button will remove GPS tags from the selected photos.

The "Help" button will show this documentation.

The "About" button will show basic information about the program.

Saving Settings

As of 1.5.4, when you exit the GUI program, it will save your settings to ~/.config/.gpscorrelaterc (or ~/.gpscorrelaterc). These will be reloaded next time you start gpscorrelate. The command line version does not make use of this file.


Return to the contents gpscorrelate-2.0/doc/index.html000066400000000000000000000111121355604302400166050ustar00rootroot00000000000000 GPS Correlate

GPS Correlate

What is it?

Digital cameras are cool. So is GPS. And, EXIF tags are really cool too.

What happens when you merge the three? You end up with a set of photos taken with a digital camera that are "stamped" with the location at which they were taken.

GPS Correlate takes a GPS track stored by any of a number of GPS devices and phone apps and correlates the time stamp of a digital photo with the location of the track at that same moment. The location of the image is then stamped directly into the image file using the appropriate EXIF GPS tags. The resulting image then contains not just the time the photo was taken but its exact location, too. The location is used by various other applications and services (such as Google Photos) to display a map of where the photo was taken.

A typical use case would be to start a GPS tracking app on the phone in your pocket while taking pictures. After the shoot, download the track in GPX format to your computer along with the photos, then use gpscorrelate to combine the two.

Documentation

Source Code

Travis Continuous Integration Status AppVeyor Continuous Integration Status Cirrus Continuous Integration Status Code coverage status

Source code is available from the Github project. Download the latest release.

Bug Reports

If you've found a problem with gpscorrelate, please open an issue.

Important Note for users before 1.5.2

Prior to version 1.5.2, there was a bug in gpscorrelate that caused gpscorrelate to incorrectly parse dates. The result is that the internal date format was one month out (ie, December was considered as the following January, and January was considered as February).

This did not affect the matching of photos, as the GPX data and the EXIF data were passed through the same buggy conversion.

When writing out GPS data, gpscorrelate wrote a GPSTimeStamp and a GPSDateStamp tag, which had the UTC GPS Time and Date of the match. The DateStamp and TimeStamp tags were written incorrectly (from two distinctly separate bugs), and was around one month ahead of the real time. The original date and time of the photo were not modified.

Version 1.5.2 introduces a new command line option, --fix-datestamps. Running gpscorrelate with this option and then a series of JPEG files that were tagged will detect and correct the problem. This will modify the GPSDateStamp and GPSTimeStamp tag to be correct, but only if this is required. You can run gpscorrelate with the -n (no write) option just to see which files are affected without making any changes. When correcting files, --no-mtime (don't change the mtime of the file) is implied.

When using --fix-datestamps, you will also need to use --timeadd to specify the difference between the photo time and UTC.

More information

For more information, later versions, or bug reports, please visit github.com/dfandrich/gpscorrelate. To see the latest version of this documentation on-line, visit dfandrich.github.io/gpscorrelate.

En Français

gpscorrelate-2.0/exif-gps.cpp000066400000000000000000000507241355604302400163050ustar00rootroot00000000000000/* exif-gps.cpp * Written by Daniel Foote. * Started Feb 2005. * * This file contains routines for reading dates * from exif data, and writing GPS data into the * appropriate photos. * * Uses the libexiv2 library. * From http://home.arcor.de/ahuggel/exiv2/ */ /* Copyright 2005-2019 Daniel Foote, Dan Fandrich. * * This file is part of gpscorrelate. * * gpscorrelate 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. * * gpscorrelate 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 gpscorrelate; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include #include #include "exiv2/image.hpp" #include "exiv2/exif.hpp" #include "exiv2/error.hpp" #include "gpsstructure.h" #include "exif-gps.h" #ifdef DEBUG #include "exiv2/futils.hpp" #define DEBUGLOG(...) fprintf(stderr, __VA_ARGS__) #else #define DEBUGLOG(...) /* no logging */ #endif #define MAX(a,b) (((a)>(b))?(a):(b)) #define MIN(a,b) (((a)<(b))?(a):(b)) /* Debug int main(int argc, char* argv[]) { printf("Starting with write...\n"); struct GPSPoint Foo; Foo.Lat = -41.1234567; Foo.Long = 115.12345; Foo.Elev = 25.12345; Foo.Time = 123456; WriteGPSData(argv[1], &Foo, "WGS-84", 0); printf("Done write, now reading...\n"); int GPS = 0; char* Ret = ReadExifDate(argv[1], &GPS); if (Ret) { printf("Date: %s.\n", Ret); } else { printf("Failed!\n"); } if (GPS) { printf("Includes GPS data!\n"); } else { printf("No GPS data!\n"); } }; */ char* ReadExifDate(const char* File, int* IncludesGPS) { // Open and read the file. Exiv2::Image::AutoPtr Image; try { Image = Exiv2::ImageFactory::open(File); } catch (Exiv2::Error& e) { DEBUGLOG("Failed to open file %s.\n", File); return NULL; } Image->readMetadata(); if (Image.get() == NULL) { DEBUGLOG("Failed to read file %s %s.\n", File, Exiv2::strError().c_str()); return NULL; } Exiv2::ExifData &ExifRead = Image->exifData(); // Read the tag out. Exiv2::Exifdatum& Tag = ExifRead["Exif.Photo.DateTimeOriginal"]; // Check that the tag is not blank. std::string Value = Tag.toString(); if (Value.length() == 0) { // No date/time stamp. // Not good. // Just return - above us will handle it. return NULL; } // Copy the tag and return that. char* Copy = strdup(Value.c_str()); // Check if we have GPS tags. Exiv2::Exifdatum& GPSData = ExifRead["Exif.GPSInfo.GPSLatitude"]; if (GPSData.count() < 3) { // No valid GPS data. *IncludesGPS = 0; } else { // Seems to include GPS data... *IncludesGPS = 1; } // Now return, passing a pointer to the date string. return Copy; // It's up to the caller to free this. } char* ReadExifData(const char* File, double* Lat, double* Long, double* Elev, int* IncludesGPS) { // This function varies in that it reads // much more data than the last, specifically // for display purposes. For the GUI version. // Open and read the file. Exiv2::Image::AutoPtr Image; try { Image = Exiv2::ImageFactory::open(File); } catch (Exiv2::Error& e) { DEBUGLOG("Failed to open file %s.\n", File); return NULL; } Image->readMetadata(); if (Image.get() == NULL) { DEBUGLOG("Failed to read file %s %s.\n", File, Exiv2::strError().c_str()); return NULL; } Exiv2::ExifData &ExifRead = Image->exifData(); // Read the tag out. Exiv2::Exifdatum& Tag = ExifRead["Exif.Photo.DateTimeOriginal"]; // Check that the tag is not blank. std::string Value = Tag.toString(); if (Value.length() == 0) { // No date/time stamp. // Not good. // Just return - above us will handle it. return NULL; } // Copy the tag and return that. char* Copy = strdup(Value.c_str()); // Check if we have GPS tags. *IncludesGPS = 0; Exiv2::Exifdatum GPSData = ExifRead["Exif.GPSInfo.GPSVersionID"]; Value = GPSData.toString(); if (Value.length() == 0) { // No GPS version tag. DEBUGLOG("No GPSVersionID.\n"); // The EXIF spec says that this tag is mandatory if the GPS IFD // exists, but some cameras skip it anyway. } // Read it out and send it up! // What we are trying to do here is convert the // three rationals: // dd/v mm/v ss/v // To a decimal // dd.dddddd... // dd/v is easy: result = dd/v. // mm/v is harder: // mm // -- / 60 = result. // v // ss/v is sorta easy. // ss // -- / 3600 = result // v // Each part is added to the final number. Exiv2::URational RatNum; GPSData = ExifRead["Exif.GPSInfo.GPSLatitude"]; if (GPSData.count() < 3) *Lat = nan("invalid"); else { // This is enough to say it includes GPS data... *IncludesGPS = 1; RatNum = GPSData.toRational(0); *Lat = (double)RatNum.first / (double)RatNum.second; RatNum = GPSData.toRational(1); *Lat = *Lat + (((double)RatNum.first / (double)RatNum.second) / 60); RatNum = GPSData.toRational(2); *Lat = *Lat + (((double)RatNum.first / (double)RatNum.second) / 3600); GPSData = ExifRead["Exif.GPSInfo.GPSLatitudeRef"]; if (strcmp(GPSData.toString().c_str(), "S") == 0) { // Negate the value - Western Hemisphere. *Lat = -*Lat; } } GPSData = ExifRead["Exif.GPSInfo.GPSLongitude"]; if (GPSData.count() < 3) *Long = nan("invalid"); else { RatNum = GPSData.toRational(0); *Long = (double)RatNum.first / (double)RatNum.second; RatNum = GPSData.toRational(1); *Long = *Long + (((double)RatNum.first / (double)RatNum.second) / 60); RatNum = GPSData.toRational(2); *Long = *Long + (((double)RatNum.first / (double)RatNum.second) / 3600); GPSData = ExifRead["Exif.GPSInfo.GPSLongitudeRef"]; if (strcmp(GPSData.toString().c_str(), "W") == 0) { // Negate the value - Western Hemisphere. *Long = -*Long; } } // Finally, read elevation out. This one is simple. GPSData = ExifRead["Exif.GPSInfo.GPSAltitude"]; if (GPSData.count() < 1) *Elev = nan("invalid"); else { RatNum = GPSData.toRational(0); *Elev = (double)RatNum.first / (double)RatNum.second; // Is the altitude below sea level? If so, negate the value. GPSData = ExifRead["Exif.GPSInfo.GPSAltitudeRef"]; if (GPSData.count() >= 1 && GPSData.toLong() == 1) { // Negate the elevation. *Elev = -*Elev; } } // Now return, passing a pointer to the date string. return Copy; // It's up to the caller to free this. } // This function is for the --fix-datestamp option. // DateStamp and TimeStamp should be 12-char strings. char* ReadGPSTimestamp(const char* File, char* DateStamp, char* TimeStamp, int* IncludesGPS) { // This function varies in that it reads // much more data than the last, specifically // for display purposes. For the GUI version. // Open and read the file. Exiv2::Image::AutoPtr Image; try { Image = Exiv2::ImageFactory::open(File); } catch (Exiv2::Error& e) { DEBUGLOG("Failed to open file %s.\n", File); return NULL; } Image->readMetadata(); if (Image.get() == NULL) { DEBUGLOG("Failed to read file %s %s.\n", File, Exiv2::strError().c_str()); return NULL; } Exiv2::ExifData &ExifRead = Image->exifData(); // Read the tag out. Exiv2::Exifdatum& Tag = ExifRead["Exif.Photo.DateTimeOriginal"]; // Check that the tag is not blank. std::string Value = Tag.toString(); if (Value.length() == 0) { // No date/time stamp. // Not good. // Just return - above us will handle it. return NULL; } // Copy the tag and return that. char* Copy = strdup(Value.c_str()); // Check if we have GPS tags. Exiv2::Exifdatum& GPSData = ExifRead["Exif.GPSInfo.GPSVersionID"]; Value = GPSData.toString(); if (Value.length() == 0) { // No GPS data. // Just return. *IncludesGPS = 0; } else { // Seems to include GPS data... *IncludesGPS = 1; Exiv2::URational RatNum1; Exiv2::URational RatNum2; Exiv2::URational RatNum3; // Read out the Time and Date stamp, for correction. GPSData = ExifRead["Exif.GPSInfo.GPSTimeStamp"]; if (GPSData.count() < 3) { *IncludesGPS = 0; return Copy; } RatNum1 = GPSData.toRational(0); RatNum2 = GPSData.toRational(1); RatNum3 = GPSData.toRational(2); snprintf(TimeStamp, 12, "%02d:%02d:%02d", RatNum1.first, RatNum2.first, RatNum3.first); GPSData = ExifRead["Exif.GPSInfo.GPSDateStamp"]; if (GPSData.count() < 3) { *IncludesGPS = 0; return Copy; } if (GPSData.typeId() == Exiv2::signedRational) { // bad type written by old gpscorrelate versions RatNum1 = GPSData.toRational(0); RatNum2 = GPSData.toRational(1); RatNum3 = GPSData.toRational(2); snprintf(DateStamp, 12, "%04d:%02d:%02d", RatNum1.first, RatNum2.first, RatNum3.first); } else snprintf(DateStamp, 12, "%s", GPSData.toString().c_str()); } return Copy; } static void EraseGpsTags(Exiv2::ExifData &ExifInfo) { // Search through, find the keys that we want, and wipe them // Code below submitted by Marc Horowitz Exiv2::ExifData::iterator Iter; for (Exiv2::ExifData::iterator Iter = ExifInfo.begin(); Iter != ExifInfo.end(); ) { if (Iter->key().find("Exif.GPSInfo") == 0) Iter = ExifInfo.erase(Iter); else Iter++; } } /* Converts a floating point number with known significant decimal places * into a string representation of a rational number. * Number must be non-negative. */ static void ConvertToRational(double Number, int Decimals, char *Buf, int BufSize) { // Calculate the appropriate denominator based on the number of // significant figures in the original data point. // Add one to deal with the fact that an even factor of 10 requires // one more digit to represent than the exponent (e.g. 10^3 = 1000 // takes four digits to represent, not the 3 from the exponent). // Cap it at 10^9 to avoid overflow in the EXIF rational data type. double IntDecimals = ceil(log10(Number + 1.0)); double Multiplier = pow(10, MAX(0, MIN(Decimals, 9 - IntDecimals))); int Int = (int)round(Number * Multiplier); snprintf(Buf, BufSize, "%d/%d", Int, (int)Multiplier); } /* Converts a floating point number with known significant decimal places * into a string representation of a set of latitude or longitude rational * numbers. */ static void ConvertToLatLongRational(double Number, int Decimals, char *Buf, int BufSize) { int Deg, Min, Sec; Deg = (int)floor(fabs(Number)); // Slice off after decimal. Min = (int)floor((fabs(Number) - floor(fabs(Number))) * 60); // Now grab just the minutes. double FracPart = ((fabs(Number) - floor(fabs(Number))) * 60) - (double)Min; // Grab the fractional minute. // Calculate the appropriate denominator based on the number of // significant figures in the original data point. Splitting off the // minutes and integer seconds reduces the number of significant // figures by 3.6 (log10(60*60)), so round it down to 3 in order to // preserve the maximum precision. Cap it at 7 to avoid overflow // in the EXIF rational data type. double Multiplier = pow(10, MAX(0, MIN(Decimals - 3, 7))); Sec = (int)round(FracPart * 60 * Multiplier); // Convert to seconds. snprintf(Buf, BufSize, "%d/1 %d/1 %d/%d", Deg, Min, Sec, (int)Multiplier); //printf("New style lat/long: %f -> %d/%d/ %d/%d\n", Number, Deg, Min, Sec, (int)Multiplier); } /* Converts a floating point number into a string representation of a set of * latitude or longitude rational numbers, using the older, not as accurate * style, which nobody should really be using any more. */ static void ConvertToOldLatLongRational(double Number, char *Buf, int BufSize) { int Deg, Min; Deg = (int)floor(fabs(Number)); // Slice off after decimal. Min = (int)floor((fabs(Number) - floor(fabs(Number))) * 6000); snprintf(Buf, BufSize, "%d/1 %d/100 0/1", Deg, Min); //printf("Old style lat/long: %f -> %s\n", Number, Buf); } static void replace(Exiv2::ExifData &exif, Exiv2::ExifKey key, const Exiv2::Value *value) { Exiv2::ExifData::iterator it = exif.findKey(key); if (it != exif.end()) it->setValue(value); else exif.add(key, value); } int WriteGPSData(const char* File, const struct GPSPoint* Point, const char* Datum, int NoChangeMtime, int DegMinSecs) { // Write the GPS data to the file... struct stat statbuf; struct stat statbuf2; struct utimbuf utb; if (NoChangeMtime) stat(File, &statbuf); Exiv2::Image::AutoPtr Image; try { Image = Exiv2::ImageFactory::open(File); } catch (Exiv2::Error& e) { DEBUGLOG("Failed to open file %s.\n", File); return 0; } Image->readMetadata(); if (Image.get() == NULL) { // It failed if we got here. DEBUGLOG("Failed to read file %s %s.\n", File, Exiv2::strError().c_str()); return 0; } Exiv2::ExifData &ExifToWrite = Image->exifData(); // Make sure we're starting from a clean GPS IFD. // There might be lots of GPS tags existing here, since only the // presence of the GPSLatitude tag causes correlation to stop with // "GPS Already Present" error. EraseGpsTags(ExifToWrite); char ScratchBuf[100]; // Do all the easy constant ones first. // GPSVersionID tag: standard says it should be four bytes: 02 02 00 00 // (and, must be present). Exiv2::Value::AutoPtr Value = Exiv2::Value::create(Exiv2::unsignedByte); Value->read("2 2 0 0"); replace(ExifToWrite, Exiv2::ExifKey("Exif.GPSInfo.GPSVersionID"), Value.get()); // Datum: the datum of the measured data. The default is WGS-84. if (*Datum) ExifToWrite["Exif.GPSInfo.GPSMapDatum"] = Datum; // Now start adding data. // ALTITUDE. // If no altitude was found in the GPX file, ElevDecimals will be -1 if (Point->ElevDecimals >= 0) { // Altitude reference: byte "00" meaning "sea level". // Or "01" if the altitude value is negative. Value = Exiv2::Value::create(Exiv2::unsignedByte); if (Point->Elev >= 0) { Value->read("0"); } else { Value->read("1"); } replace(ExifToWrite, Exiv2::ExifKey("Exif.GPSInfo.GPSAltitudeRef"), Value.get()); // And the actual altitude. Value = Exiv2::Value::create(Exiv2::unsignedRational); // 3 decimal points is beyond the limit of current GPS technology int Decimals = MIN(Point->ElevDecimals, 3); ConvertToRational(fabs(Point->Elev), Decimals, ScratchBuf, sizeof(ScratchBuf)); /* printf("Altitude: %f -> %s\n", Point->Elev, ScratchBuf); */ Value->read(ScratchBuf); replace(ExifToWrite, Exiv2::ExifKey("Exif.GPSInfo.GPSAltitude"), Value.get()); } // LATITUDE // Latitude reference: "N" or "S". if (Point->Lat < 0) { // Less than Zero: ie, minus: means // Southern hemisphere. Where I live. ExifToWrite["Exif.GPSInfo.GPSLatitudeRef"] = "S"; } else { // More than Zero: ie, plus: means // Northern hemisphere. ExifToWrite["Exif.GPSInfo.GPSLatitudeRef"] = "N"; } // Now the actual latitude itself. // The original comment read: // This is done as three rationals. // I choose to do it as: // dd/1 - degrees. // mmmm/100 - minutes // 0/1 - seconds // Exif standard says you can do it with minutes // as mm/1 and then seconds as ss/1, but its // (slightly) more accurate to do it as // mmmm/100 than to split it. // We also absolute the value (with fabs()) // as the sign is encoded in LatRef. // Further note: original code did not translate between // dd.dddddd to dd mm.mm - that's why we now multiply // by 60*N - x60 to get minutes, xN to get to mmmm/N. // N is 10^S where S is the number of significant decimal // places. // // Rereading the EXIF standard, it's quite ok to do DD MM SS.SS // Which is much more accurate. This is the new default, unless otherwise // set. Value = Exiv2::Value::create(Exiv2::unsignedRational); if (DegMinSecs) { ConvertToLatLongRational(Point->Lat, Point->LatDecimals, ScratchBuf, sizeof(ScratchBuf)); } else { ConvertToOldLatLongRational(Point->Lat, ScratchBuf, sizeof(ScratchBuf)); } Value->read(ScratchBuf); replace(ExifToWrite, Exiv2::ExifKey("Exif.GPSInfo.GPSLatitude"), Value.get()); // LONGITUDE // Longitude reference: "E" or "W". if (Point->Long < 0) { // Less than Zero: ie, minus: means // Western hemisphere. ExifToWrite["Exif.GPSInfo.GPSLongitudeRef"] = "W"; } else { // More than Zero: ie, plus: means // Eastern hemisphere. Where I live. ExifToWrite["Exif.GPSInfo.GPSLongitudeRef"] = "E"; } // Now the actual longitude itself, in the same way as latitude Value = Exiv2::Value::create(Exiv2::unsignedRational); if (DegMinSecs) { ConvertToLatLongRational(Point->Long, Point->LongDecimals, ScratchBuf, sizeof(ScratchBuf)); } else { ConvertToOldLatLongRational(Point->Long, ScratchBuf, sizeof(ScratchBuf)); } Value->read(ScratchBuf); replace(ExifToWrite, Exiv2::ExifKey("Exif.GPSInfo.GPSLongitude"), Value.get()); // The timestamp. // Make up the timestamp... // The timestamp is taken as the UTC time of the photo. // If interpolation occurred, then this time is the time of the photo. struct tm TimeStamp = *gmtime(&(Point->Time)); Value = Exiv2::Value::create(Exiv2::unsignedRational); snprintf(ScratchBuf, sizeof(ScratchBuf), "%d/1 %d/1 %d/1", TimeStamp.tm_hour, TimeStamp.tm_min, TimeStamp.tm_sec); Value->read(ScratchBuf); replace(ExifToWrite, Exiv2::ExifKey("Exif.GPSInfo.GPSTimeStamp"), Value.get()); // And we should also do a datestamp. snprintf(ScratchBuf, sizeof(ScratchBuf), "%04d:%02d:%02d", TimeStamp.tm_year + 1900, TimeStamp.tm_mon + 1, TimeStamp.tm_mday); ExifToWrite["Exif.GPSInfo.GPSDateStamp"] = ScratchBuf; // Write the data to file. try { Image->writeMetadata(); } catch (Exiv2::Error& e) { DEBUGLOG("Failed to write to file %s.\n", File); return 0; } if (NoChangeMtime) { stat(File, &statbuf2); utb.actime = statbuf2.st_atime; utb.modtime = statbuf.st_mtime; utime(File, &utb); } return 1; } int WriteFixedDatestamp(const char* File, time_t Time) { // Write the GPS data to the file... struct stat statbuf; struct stat statbuf2; struct utimbuf utb; stat(File, &statbuf); Exiv2::Image::AutoPtr Image; try { Image = Exiv2::ImageFactory::open(File); } catch (Exiv2::Error& e) { DEBUGLOG("Failed to open file %s.\n", File); return 0; } Image->readMetadata(); if (Image.get() == NULL) { // It failed if we got here. DEBUGLOG("Failed to read file %s %s.\n", File, Exiv2::strError().c_str()); return 0; } Exiv2::ExifData &ExifToWrite = Image->exifData(); const struct tm TimeStamp = *gmtime(&Time); char ScratchBuf[100]; snprintf(ScratchBuf, sizeof(ScratchBuf), "%04d:%02d:%02d", TimeStamp.tm_year + 1900, TimeStamp.tm_mon + 1, TimeStamp.tm_mday); ExifToWrite.erase(ExifToWrite.findKey(Exiv2::ExifKey("Exif.GPSInfo.GPSDateStamp"))); ExifToWrite["Exif.GPSInfo.GPSDateStamp"] = ScratchBuf; Exiv2::Value::AutoPtr Value = Exiv2::Value::create(Exiv2::unsignedRational); snprintf(ScratchBuf, sizeof(ScratchBuf), "%d/1 %d/1 %d/1", TimeStamp.tm_hour, TimeStamp.tm_min, TimeStamp.tm_sec); Value->read(ScratchBuf); ExifToWrite.erase(ExifToWrite.findKey(Exiv2::ExifKey("Exif.GPSInfo.GPSTimeStamp"))); ExifToWrite.add(Exiv2::ExifKey("Exif.GPSInfo.GPSTimeStamp"), Value.get()); try { Image->writeMetadata(); } catch (Exiv2::Error& e) { DEBUGLOG("Failed to write to file %s.\n", File); return 0; } // Reset the mtime. stat(File, &statbuf2); utb.actime = statbuf2.st_atime; utb.modtime = statbuf.st_mtime; utime(File, &utb); return 1; } int RemoveGPSExif(const char* File, int NoChangeMtime, int NoWriteExif) { struct stat statbuf; struct stat statbuf2; struct utimbuf utb; if (NoChangeMtime) stat(File, &statbuf); // Open the file and start reading. Exiv2::Image::AutoPtr Image; try { Image = Exiv2::ImageFactory::open(File); } catch (Exiv2::Error& e) { DEBUGLOG("Failed to open file %s.\n", File); return 0; } Image->readMetadata(); if (Image.get() == NULL) { // It failed if we got here. DEBUGLOG("Failed to read file %s %s.\n", File, Exiv2::strError().c_str()); return 0; } Exiv2::ExifData &ExifInfo = Image->exifData(); if (ExifInfo.count() == 0) { DEBUGLOG("No EXIF tags in file %s.\n", File); return 0; } EraseGpsTags(ExifInfo); if (!NoWriteExif) { try { Image->writeMetadata(); } catch (Exiv2::Error& e) { DEBUGLOG("Failed to write to file %s.\n", File); return 0; } } if (NoChangeMtime && !NoWriteExif) { stat(File, &statbuf2); utb.actime = statbuf2.st_atime; utb.modtime = statbuf.st_mtime; utime(File, &utb); } return 1; } gpscorrelate-2.0/exif-gps.h000066400000000000000000000031361355604302400157450ustar00rootroot00000000000000/* exif-gps.h * Written by Daniel Foote. * Started Feb 2005. * * This file contains the prototypes for the functions * in exif-gps.cpp. * These are declared extern "C" to prevent name * mangling, as C++ has a habit of doing. */ /* Copyright 2005-2016 Daniel Foote, Dan Fandrich. * * This file is part of gpscorrelate. * * gpscorrelate 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. * * gpscorrelate 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 gpscorrelate; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef __cplusplus extern "C" { #endif char* ReadExifDate(const char* File, int* IncludesGPS); char* ReadExifData(const char* File, double* Lat, double* Long, double* Elevation, int* IncludesGPS); char* ReadGPSTimestamp(const char* File, char* DateStamp, char* TimeStamp, int* IncludesGPS); int WriteGPSData(const char* File, const struct GPSPoint* Point, const char* Datum, int NoChangeMtime, int DegMinSecs); int WriteFixedDatestamp(const char* File, time_t TimeStamp); int RemoveGPSExif(const char* File, int NoChangeMtime, int NoWriteExif); #ifdef __cplusplus } #endif gpscorrelate-2.0/gpscorrelate-gui.svg000066400000000000000000003411231355604302400200500ustar00rootroot00000000000000 image/svg+xml gpscorrelate-gui Icon 2009-04-18 Till Maas <opensource@till.name> The following cliparts from Open Clip Art Library were used: Anonymous: http://openclipart.org/media/files/Anonymous/7187 najsbajs: http://openclipart.org/media/files/najsbajs/3243 Icon for the GUI of gpscorrelate: http://freefoote.dview.net/linux_gpscorr.html S 31° 57'E 115° 51' gpscorrelate-2.0/gpscorrelate.desktop000066400000000000000000000007111355604302400201330ustar00rootroot00000000000000[Desktop Entry] Type=Application Version=1.0 Name=GPSCorrelate GenericName=Geotagging tool Comment=Add coordinates to jpeg images using gpx files Comment[ru]=Добавление геоданных в jpeg фотографии на основе gpx трека TryExec=gpscorrelate-gui Exec=gpscorrelate-gui Terminal=false Categories=Graphics;ImageProcessing;Geography;GTK; Icon=gpscorrelate-gui Keywords=gps;gpx;tracks;correlate;picture;photo;geolocation; gpscorrelate-2.0/gpscorrelate2.glade000066400000000000000000001645211355604302400176320ustar00rootroot00000000000000 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GPSCorrelate 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 2 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Remove Data 0 1 2 1 2 GTK_FILL True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Load Data 0 1 2 GTK_FILL True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 12 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Preview</b> True label_item 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 12 5 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Loaded Files</b> True label_item True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GDK_EXTENSION_EVENTS_ALL True Load GPS data to match to photos. GPS Data tab False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 3 2 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Strip GPS Tags 0 2 3 GTK_FILL True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 12 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-orientation-landscape 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Preview</b> True label_item 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 12 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Photos</b> True label_item True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Remove Photos 0 1 2 1 2 GTK_FILL True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Add Photos 0 1 2 GTK_FILL 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True Choose Photos to match GPS data to Photos tab 1 False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 12 5 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>GPS Data</b> True label_item False True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 12 5 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Photos</b> True label_item True True False True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 12 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Map View</b> True label_item False True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 12 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-orientation-landscape 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Photo Preview</b> True label_item True True True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Assign Point 0 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Clear Point 0 1 False 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True Match Photos to specific waypoints Manual Correlation tab 2 False True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 12 5 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>GPS Data</b> True label_item True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 12 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Interpolate 0 True True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Don't change mtime 0 True 1 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Between Segments 0 True 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 4 2 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False 6 WGS-84 1 2 3 4 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 0 1 2 2 3 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 +8:00 1 2 1 2 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 0 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GPS Datum: 3 4 GTK_FILL True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Photo Offset: 2 3 GTK_FILL True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Time Zone: 1 2 GTK_FILL True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Max gap time: GTK_FILL 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Options</b> True label_item 1 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Dry Run 0 False False 2 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Correlate & Save 0 False False 3 False True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GTK_SHADOW_IN True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 12 5 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Photos</b> True label_item True True 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True Automatic Correlation tab 3 False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True Export tab 4 False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True Set Advanced GPScorrelate options Options tab 5 False True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False GPSCorrelate v2.0 Daniel Foote, (C) 2007. Licenced under the GNU GPL v3. 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK About tab 6 False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 False 1 gpscorrelate-2.0/gpsstructure.h000066400000000000000000000024501355604302400167730ustar00rootroot00000000000000/* gpsstructure.h * Written by Daniel Foote. * Started Feb 2005. * * This file contains the structure that stores * GPS data points. Placed here so that several things * could share it. */ /* Copyright 2005-2012 Daniel Foote, Dan Fandrich. * * This file is part of gpscorrelate. * * gpscorrelate 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. * * gpscorrelate 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 gpscorrelate; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* This data structure describes a single point. */ struct GPSPoint { double Lat; int LatDecimals; double Long; int LongDecimals; double Elev; int ElevDecimals; time_t Time; int EndOfSegment; struct GPSPoint* Next; }; struct GPSTrack { struct GPSPoint* Points; time_t MinTime; time_t MaxTime; }; gpscorrelate-2.0/gpx-read.c000066400000000000000000000214431355604302400157260ustar00rootroot00000000000000/* gpx-read.c * Written by Daniel Foote. * Started Feb 2005. * * This file contains routines to read the XML GPX files, * containing GPS data. */ /* Copyright 2005-2016 Daniel Foote, Dan Fandrich. * * This file is part of gpscorrelate. * * gpscorrelate 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. * * gpscorrelate 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 gpscorrelate; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include "i18n.h" #include "gpx-read.h" #include "unixtime.h" #include "gpsstructure.h" #include "latlong.h" /* Pointers to the first and last points, used during parsing */ static struct GPSPoint* FirstPoint; static struct GPSPoint* LastPoint; static void ExtractTrackPoints(xmlNodePtr Start) { /* The pointer passed to us should be the start * of a heap of trkpt's. So walk though them, * extracting what we need. */ xmlNodePtr Current = NULL; xmlNodePtr CCurrent = NULL; xmlAttrPtr Properties = NULL; const char* Lat; const char* Long; const char* Elev; const char* Time; for (Current = Start; Current; Current = Current->next) { if ((Current->type == XML_ELEMENT_NODE) && (strcmp((const char *)Current->name, "trkpt") == 0)) { /* This is indeed a trackpoint. Extract! */ /* Reset the vars... so we don't get * the data from last run. */ Lat = NULL; Long = NULL; Elev = NULL; Time = NULL; /* To get the Lat and Long, we have to * extract the properties... another * linked list to walk. */ for (Properties = Current->properties; Properties; Properties = Properties->next) { if (strcmp((const char *)Properties->name, "lat") == 0) { Lat = (const char *)Properties->children->content; } if (strcmp((const char *)Properties->name, "lon") == 0) { Long = (const char *)Properties->children->content; } } /* Now, grab the elevation and time. * These are children of trkpt. */ /* Oh, and what's the deal with the * Node->children->content thing? */ for (CCurrent = Current->children; CCurrent; CCurrent = CCurrent->next) { if (strcmp((const char *)CCurrent->name, "ele") == 0) { if (CCurrent->children) Elev = (const char *)CCurrent->children->content; } if (strcmp((const char *)CCurrent->name, "time") == 0) { if (CCurrent->children) Time = (const char *)CCurrent->children->content; } } /* Check that we have all the data. If we're missing something, * then skip this point... NOTE: Elev is not required. */ if (Time == NULL || Long == NULL || Lat == NULL) { /* Missing some data. */ /* TODO: Really should report this upstream... */ continue; } /* Right, now we theoretically have all the data. * Allocate ourselves some memory and go for it... */ if (FirstPoint) { /* Ok, adding to the list... */ LastPoint->Next = (struct GPSPoint*) malloc(sizeof(struct GPSPoint)); LastPoint = LastPoint->Next; LastPoint->Next = NULL; } else { /* This is the first one. */ FirstPoint = (struct GPSPoint*) malloc(sizeof(struct GPSPoint)); FirstPoint->Next = NULL; LastPoint = FirstPoint; } /* Clear the structure first... */ LastPoint->Lat = 0; LastPoint->LatDecimals = 0; LastPoint->Long = 0; LastPoint->LongDecimals = 0; LastPoint->Elev = 0; LastPoint->ElevDecimals = -1; // default meaning no altitude was found LastPoint->Time = 0; LastPoint->EndOfSegment = 0; /* Write the data into LastPoint, which should be a new point. */ LastPoint->Lat = atof(Lat); LastPoint->LatDecimals = NumDecimals(Lat); LastPoint->Long = atof(Long); LastPoint->LongDecimals = NumDecimals(Long); if (Elev) { LastPoint->Elev = atof(Elev); LastPoint->ElevDecimals = NumDecimals(Elev); } LastPoint->Time = ConvertToUnixTime(Time, GPX_DATE_FORMAT, 0, 0); /* Debug... printf("TrackPoint. Lat %s (%f), Long %s (%f). Elev %s (%f), Time %d.\n", Lat, atof(Lat), Long, atof(Long), Elev, atof(Elev), ConvertToUnixTime(Time, GPX_DATE_FORMAT, 0, 0)); printf("Decimals %d %d %d\n", LastPoint->LatDecimals, LastPoint->LongDecimals, LastPoint->ElevDecimals); */ } } /* End For. */ /* Return control to the recursive function... */ } static void FindTrackSeg(xmlNodePtr Start) { /* Go recursive till we find a tag. */ xmlNodePtr Current = NULL; for (Current = Start; Current; Current = Current->next) { if ((Current->type == XML_ELEMENT_NODE) && (strcmp((const char *)Current->name, "trkseg") == 0)) { /* Found it... the children should * all be trkpt's. */ ExtractTrackPoints(Current->children); /* Mark the last point as being the end * of a track segment. */ if (LastPoint) LastPoint->EndOfSegment = 1; } /* And again, with children of this node. */ FindTrackSeg(Current->children); } /* End For */ } /* Determines and stores the min and max times from the GPS track */ static void GetTrackRange(struct GPSTrack* Track) { if (Track->Points == NULL) return; /* Requires us to go through the list and keep * the biggest and smallest. The list should, * however, be sorted. But we do it this way anyway. */ const struct GPSPoint* Fill = NULL; Track->MaxTime = 0; Track->MinTime = Track->Points->Time; for (Fill = Track->Points; Fill; Fill = Fill->Next) { /* Check the Min time */ if (Fill->Time < Track->MinTime) Track->MinTime = Fill->Time; /* Check the Max time */ if (Fill->Time > Track->MaxTime) Track->MaxTime = Fill->Time; } } int ReadGPX(const char* File, struct GPSTrack* Track) { /* Init the libxml library. Also checks version. */ LIBXML_TEST_VERSION xmlDocPtr GPXData; /* Read the GPX data from file. */ GPXData = xmlParseFile(File); if (GPXData == NULL) { fprintf(stderr, _("Failed to parse GPX data from %s.\n"), File); xmlCleanupParser(); return 0; } /* Now grab the "root" node. */ xmlNodePtr GPXRoot; GPXRoot = xmlDocGetRootElement(GPXData); if (GPXRoot == NULL) { fprintf(stderr, _("Invalid GPX file has no root.\n")); xmlFreeDoc(GPXData); xmlCleanupParser(); return 0; } /* Check that this is indeed a GPX - the root node * should be "gpx". */ if (strcmp((const char *)GPXRoot->name, "gpx") == 0) { /* Ok, it is a GPX file. */ } else { /* Not valid. */ fprintf(stderr, _("Invalid GPX file.\n")); xmlFreeDoc(GPXData); xmlCleanupParser(); return 0; } /* Now comes the messy part... walking the tree to find * what we want. * I've chosen to do it with two functions, one of which * is recursive, rather than a clever inside-this-function * walk the tree thing. * * We start by calling the recursive function to look for * tags, and then that function calls another * when it has found one... this sub function then * hauls out the tags with the actual data. * Messy, convoluted, but it seems to work... */ /* As to where to store the data? Again, its messy. * We maintain two global vars, FirstPoint and LastPoint. * FirstPoint points to the first GPSPoint done, and * LastPoint is the last point done, used for the next * point... we use this to build a singly-linked list. */ /* (I think I'll just be grateful for the work that libxml * puts in for me... imagine having to write an XML parser! * Nasty.) */ /* Before we go into this function, we also setlocale to "C". * The GPX def indicates that the decimal separator should be * ".", but certain locales specify otherwise. Which has caused issues. * So we set the locale for this function, and then revert it. */ FirstPoint = NULL; LastPoint = NULL; char* OldLocale = setlocale(LC_NUMERIC, "C"); FindTrackSeg(GPXRoot); setlocale(LC_NUMERIC, OldLocale); /* Clean up stuff for the XML library. */ xmlFreeDoc(GPXData); xmlCleanupParser(); Track->Points = FirstPoint; /* Find the time range for this track */ GetTrackRange(Track); return 1; } void FreeTrack(struct GPSTrack* Track) { /* Free the memory associated with the * GPSPoint list... */ struct GPSPoint* NextFree = NULL; struct GPSPoint* CurrentFree = Track->Points; while (1) { if (CurrentFree == NULL) break; NextFree = CurrentFree->Next; free(CurrentFree); CurrentFree = NextFree; } Track->Points = NULL; } gpscorrelate-2.0/gpx-read.h000066400000000000000000000020521355604302400157260ustar00rootroot00000000000000/* gpx-read.h * Written by Daniel Foote. * Started Feb 2005. * * This file contains prototypes for the functions * in gpx-read.c. */ /* Copyright 2005-2012 Daniel Foote, Dan Fandrich. * * This file is part of gpscorrelate. * * gpscorrelate 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. * * gpscorrelate 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 gpscorrelate; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ struct GPSTrack; int ReadGPX(const char* File, struct GPSTrack* Track); void FreeTrack(struct GPSTrack* Track); gpscorrelate-2.0/gui.c000066400000000000000000001621421355604302400150050ustar00rootroot00000000000000/* gui.c * Written by Daniel Foote. * Started Feb 2005. * * The base of this file was generated with Glade, and then * hand edited by me for some strange reason. * * This file contains the code to create, generate, and look after * a GTK GUI for the photo correlation program. */ /* This is "basically" the GUI version of it. The only other * part of the gui program is main-gui.c, but that ended up * being little more than a "stub" to get the GUI up and running. */ /* Copyright 2005-2019 Daniel Foote, Dan Fandrich. * * This file is part of gpscorrelate. * * gpscorrelate 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. * * gpscorrelate 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 gpscorrelate; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include "i18n.h" #include "gpsstructure.h" #include "gui.h" #include "exif-gps.h" #include "gpx-read.h" #include "correlate.h" /* Declare all our widgets. Global to this module. */ GtkWidget *MatchWindow; GtkWidget *WindowHBox; GtkWidget *ControlsVBox; GtkWidget *AddPhotosFrame; GtkWidget *AddPhotosAlignment; GtkWidget *AddPhotosVBox; GtkWidget *PhotoAddButton; GtkWidget *PhotoRemoveButton; GtkWidget *AddPhotosLabel; GtkWidget *GPSDataFrame; GtkWidget *GPSDataAlignment; GtkWidget *GPSDataVBox; GtkWidget *GPSSelectedLabel; GtkWidget *SelectGPSButton; GtkWidget *GPSDataLabel; GtkWidget *OptionsFrame; GtkWidget *OptionsAlignment; GtkWidget *OptionsVBox; GtkWidget *InterpolateCheck; GtkWidget *NoWriteCheck; GtkWidget *OverwriteCheck; GtkWidget *NoMtimeCheck; GtkWidget *BetweenSegmentsCheck; GtkWidget *DegMinSecsCheck; GtkWidget *AutoTimeZoneCheck; GtkWidget *OptionsTable; GtkWidget *MaxGapTimeLabel; GtkWidget *TimeZoneLabel; GtkWidget *PhotoOffsetLabel; GtkWidget *GPSDatumLabel; GtkWidget *GapTimeEntry; GtkWidget *TimeZoneEntry; GtkWidget *PhotoOffsetEntry; GtkWidget *GPSDatumEntry; GtkWidget *OptionsFrameLable; GtkWidget *CorrelateFrame; GtkWidget *CorrelateAlignment; GtkWidget *CorrelateButton; GtkWidget *CorrelateLabel; GtkWidget *OtherOptionsFrame; GtkWidget *OtherOptionsVBox; GtkWidget *OtherOptionsAlignment; GtkWidget *OtherOptionsLabel; GtkWidget *StripGPSButton; GtkWidget *HelpButton; GtkWidget *AboutButton; GtkWidget *PhotoListVBox; GtkWidget *PhotoListScroll; GtkWidget *PhotoList; #if !GTK_CHECK_VERSION(2, 12, 0) GtkTooltips *tooltips; #endif /* Enum and other stuff for the Photo list box. */ enum { LIST_FILENAME, LIST_LAT, LIST_LONG, LIST_ELEV, LIST_TIME, LIST_STATE, LIST_POINTER, LIST_NOCOLUMNS }; GtkListStore *PhotoListStore; GtkCellRenderer *PhotoListRenderer; GtkTreeViewColumn *FileColumn; GtkTreeViewColumn *LatColumn; GtkTreeViewColumn *LongColumn; GtkTreeViewColumn *ElevColumn; GtkTreeViewColumn *TimeColumn; GtkTreeViewColumn *StateColumn; /* Structure and variables for holding the list of * photos in memory. */ struct GUIPhotoList { char* Filename; char* Time; GtkTreeIter ListPointer; struct GUIPhotoList* Next; }; struct GUIPhotoList* FirstPhoto = NULL; struct GUIPhotoList* LastPhoto = NULL; struct GPSTrack* GPSData; // Array of track entries; empty entry is last int NumTracks; // Number of entries at GPSData static const char* const ConfigDefaults[] = { "interpolate", "true", "dontwrite", "false", "nochangemtime", "false", "betweensegments", "false", "writeddmmss", "true", "maxgap", "0", "timezone", "+0:00", "photooffset", "0", "gpsdatum", "WGS-84", "gpxopendir", "", "photoopendir", "", NULL, NULL }; GKeyFile* GUISettings; char* SettingsFilename; gchar* GPXOpenDir = NULL; gchar* PhotoOpenDir = NULL; static gboolean DestroyWindow(GtkWidget *Widget, GdkEvent *Event, gpointer Data); static void AddPhotosButtonPress(GtkWidget *Widget, gpointer Data); static void AddPhotoToList(const char* Filename); static void RemovePhotosButtonPress( GtkWidget *Widget, gpointer Data ); static void SetListItem(GtkTreeIter* Iter, const char* Filename, const char* Time, double Lat, double Long, double Elev, const char* PassedState, int IncludesGPS); static void SelectGPSButtonPress( GtkWidget *Widget, gpointer Data ); static void CorrelateButtonPress( GtkWidget *Widget, gpointer Data ); static void StripGPSButtonPress( GtkWidget *Widget, gpointer Data ); static void HelpButtonPress( GtkWidget *Widget, gpointer Data ); static void AboutButtonPress( GtkWidget *Widget, gpointer Data ); static void GtkGUIUpdate(void); /* Load settings, insert defaults. */ void LoadSettings(void) { /* Generate the filename. */ const char* UserHomeDir = g_get_user_config_dir(); const int FilenameLength = strlen(UserHomeDir) + 30; SettingsFilename = (char*) malloc(sizeof(char) * FilenameLength); snprintf(SettingsFilename, FilenameLength, "%s%c.gpscorrelaterc", UserHomeDir, G_DIR_SEPARATOR); /* Create a new key file. */ GUISettings = g_key_file_new(); if (!g_key_file_load_from_file(GUISettings, SettingsFilename, G_KEY_FILE_KEEP_COMMENTS, NULL)) { /* Unable to load the file. Oh well. */ } /* Now create all the default settings. */ int i = 0; while (ConfigDefaults[i]) { /* If the setting doesn't exist, set the default. */ if (NULL == g_key_file_get_value(GUISettings, "default", ConfigDefaults[i], NULL)) { g_key_file_set_value(GUISettings, "default", ConfigDefaults[i], ConfigDefaults[i+1]); } i += 2; } /* Fetch the directory settings from the file. */ PhotoOpenDir = g_key_file_get_value(GUISettings, "default", "photoopendir", NULL); GPXOpenDir = g_key_file_get_value(GUISettings, "default", "gpxopendir", NULL); } void SaveSettings(void) { /* Save the settings to file, and deallocate the settings. */ FILE* OutputFile; OutputFile = fopen(SettingsFilename, "w"); if (OutputFile) { gsize SettingsLength = 0; gchar* SettingsString = g_key_file_to_data(GUISettings, &SettingsLength, NULL); fwrite((void*)SettingsString, sizeof(gchar), (size_t)SettingsLength, OutputFile); fclose(OutputFile); g_free(SettingsString); } free(SettingsFilename); } static void timezone_toggle_visibility(GtkWidget *widget, GtkWidget *entry ) { gboolean active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); gtk_widget_set_sensitive(entry, !active); } GtkWidget* CreateMatchWindow (void) { GError *error; gboolean b; /* Load the settings. */ LoadSettings(); #if !GTK_CHECK_VERSION(2, 12, 0) /* Get our tooltips ready. */ tooltips = gtk_tooltips_new (); #endif /* Start with the window itself. */ MatchWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); char title[40]; snprintf(title, sizeof(title), _("GPS Photo Correlate %s"), PACKAGE_VERSION); gtk_window_set_title (GTK_WINDOW (MatchWindow), title); gtk_window_set_default_size (GTK_WINDOW (MatchWindow), 792, -1); g_signal_connect (G_OBJECT (MatchWindow), "delete_event", G_CALLBACK (DestroyWindow), NULL); WindowHBox = gtk_hbox_new (FALSE, 0); gtk_widget_show (WindowHBox); gtk_container_add (GTK_CONTAINER (MatchWindow), WindowHBox); /* The controls side of the window. */ ControlsVBox = gtk_vbox_new (FALSE, 0); gtk_widget_show (ControlsVBox); gtk_box_pack_start (GTK_BOX (WindowHBox), ControlsVBox, FALSE, TRUE, 0); /* Add/remove photos area. */ AddPhotosFrame = gtk_frame_new (NULL); gtk_widget_show (AddPhotosFrame); gtk_box_pack_start (GTK_BOX (ControlsVBox), AddPhotosFrame, FALSE, FALSE, 0); AddPhotosAlignment = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_widget_show (AddPhotosAlignment); gtk_container_add (GTK_CONTAINER (AddPhotosFrame), AddPhotosAlignment); gtk_alignment_set_padding (GTK_ALIGNMENT (AddPhotosAlignment), 0, 4, 12, 4); AddPhotosVBox = gtk_vbox_new (FALSE, 0); gtk_widget_show (AddPhotosVBox); gtk_container_add (GTK_CONTAINER (AddPhotosAlignment), AddPhotosVBox); PhotoAddButton = gtk_button_new_with_mnemonic (_("Add...")); gtk_widget_show (PhotoAddButton); gtk_box_pack_start (GTK_BOX (AddPhotosVBox), PhotoAddButton, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (PhotoAddButton, _("Add photos to be correlated.")); #else gtk_tooltips_set_tip (tooltips, PhotoAddButton, _("Add photos to be correlated."), NULL); #endif g_signal_connect (G_OBJECT (PhotoAddButton), "clicked", G_CALLBACK (AddPhotosButtonPress), NULL); PhotoRemoveButton = gtk_button_new_with_mnemonic (_("Remove")); gtk_widget_show (PhotoRemoveButton); gtk_box_pack_start (GTK_BOX (AddPhotosVBox), PhotoRemoveButton, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (PhotoRemoveButton, _("Remove selected photos from the list.")); #else gtk_tooltips_set_tip (tooltips, PhotoRemoveButton, _("Remove selected photos from the list."), NULL); #endif g_signal_connect (G_OBJECT (PhotoRemoveButton), "clicked", G_CALLBACK (RemovePhotosButtonPress), NULL); AddPhotosLabel = gtk_label_new (_("1. Add Photos")); gtk_widget_show (AddPhotosLabel); gtk_frame_set_label_widget (GTK_FRAME (AddPhotosFrame), AddPhotosLabel); gtk_label_set_use_markup (GTK_LABEL (AddPhotosLabel), TRUE); /* GPS data area */ GPSDataFrame = gtk_frame_new (NULL); gtk_widget_show (GPSDataFrame); gtk_box_pack_start (GTK_BOX (ControlsVBox), GPSDataFrame, FALSE, FALSE, 0); GPSDataAlignment = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_widget_show (GPSDataAlignment); gtk_container_add (GTK_CONTAINER (GPSDataFrame), GPSDataAlignment); gtk_alignment_set_padding (GTK_ALIGNMENT (GPSDataAlignment), 0, 4, 12, 4); GPSDataVBox = gtk_vbox_new (FALSE, 0); gtk_widget_show (GPSDataVBox); gtk_container_add (GTK_CONTAINER (GPSDataAlignment), GPSDataVBox); GPSSelectedLabel = gtk_label_new (_("Read from: No file")); /* FIX ME: Label not appropriately sized/placed for data. */ gtk_widget_show (GPSSelectedLabel); gtk_box_pack_start (GTK_BOX (GPSDataVBox), GPSSelectedLabel, FALSE, FALSE, 0); gtk_label_set_ellipsize(GTK_LABEL(GPSSelectedLabel), PANGO_ELLIPSIZE_END); /*gtk_label_set_width_chars(GTK_LABEL(GPSSelectedLabel), 20); gtk_label_set_line_wrap(GTK_LABEL(GPSSelectedLabel), TRUE);*/ SelectGPSButton = gtk_button_new_with_mnemonic (_("Choose...")); gtk_widget_show (SelectGPSButton); gtk_box_pack_start (GTK_BOX (GPSDataVBox), SelectGPSButton, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (SelectGPSButton, _("Choose GPX file from which to read GPS data. If the GPS data is not in the " "GPX format, use a converter like GPSBabel to convert it to GPX first.")); #else gtk_tooltips_set_tip (tooltips, SelectGPSButton, _("Choose GPX file from which to read GPS data. If the GPS data is not in the " "GPX format, use a converter like GPSBabel to convert it to GPX first."), NULL); #endif g_signal_connect (G_OBJECT (SelectGPSButton), "clicked", G_CALLBACK (SelectGPSButtonPress), NULL); GPSDataLabel = gtk_label_new (_("2. GPS Data")); gtk_widget_show (GPSDataLabel); gtk_frame_set_label_widget (GTK_FRAME (GPSDataFrame), GPSDataLabel); gtk_label_set_use_markup (GTK_LABEL (GPSDataLabel), TRUE); /* Options area. */ OptionsFrame = gtk_frame_new (NULL); gtk_widget_show (OptionsFrame); gtk_box_pack_start (GTK_BOX (ControlsVBox), OptionsFrame, FALSE, FALSE, 0); OptionsAlignment = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_widget_show (OptionsAlignment); gtk_container_add (GTK_CONTAINER (OptionsFrame), OptionsAlignment); gtk_alignment_set_padding (GTK_ALIGNMENT (OptionsAlignment), 0, 4, 12, 4); OptionsVBox = gtk_vbox_new (FALSE, 0); gtk_widget_show (OptionsVBox); gtk_container_add (GTK_CONTAINER (OptionsAlignment), OptionsVBox); InterpolateCheck = gtk_check_button_new_with_mnemonic (_("Interpolate")); gtk_widget_show (InterpolateCheck); gtk_box_pack_start (GTK_BOX (OptionsVBox), InterpolateCheck, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (InterpolateCheck, _("Interpolate between points. If disabled, points will be rounded to " "the nearest recorded point.")); #else gtk_tooltips_set_tip (tooltips, InterpolateCheck, _("Interpolate between points. If disabled, points will be rounded to " "the nearest recorded point."), NULL); #endif gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (InterpolateCheck), g_key_file_get_boolean(GUISettings, "default", "interpolate", NULL)); NoWriteCheck = gtk_check_button_new_with_mnemonic (_("Don't write")); gtk_widget_show (NoWriteCheck); gtk_box_pack_start (GTK_BOX (OptionsVBox), NoWriteCheck, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (NoWriteCheck, _("Don't write EXIF data back to the photos. This is useful for " "testing the settings without modifying the photos.")); #else gtk_tooltips_set_tip (tooltips, NoWriteCheck, _("Don't write EXIF data back to the photos. This is useful for " "testing the settings without modifying the photos."), NULL); #endif gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (NoWriteCheck), g_key_file_get_boolean(GUISettings, "default", "dontwrite", NULL)); OverwriteCheck = gtk_check_button_new_with_mnemonic (_("Replace existing tags")); gtk_widget_show (OverwriteCheck); gtk_box_pack_start (GTK_BOX (OptionsVBox), OverwriteCheck, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (OverwriteCheck, _("Replace any existing GPS tags in the photos.")); #else gtk_tooltips_set_tip (tooltips, OverwriteCheck, _("Replace any existing GPS tags in the photos."), NULL); #endif gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (OverwriteCheck), g_key_file_get_boolean(GUISettings, "default", "replace", NULL)); NoMtimeCheck = gtk_check_button_new_with_mnemonic (_("Don't change mtime")); gtk_widget_show (NoMtimeCheck); gtk_box_pack_start (GTK_BOX (OptionsVBox), NoMtimeCheck, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (NoMtimeCheck, _("Don't change file modification time of the photos.")); #else gtk_tooltips_set_tip (tooltips, NoMtimeCheck, _("Don't change file modification time of the photos."), NULL); #endif gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (NoMtimeCheck), g_key_file_get_boolean(GUISettings, "default", "nochangemtime", NULL)); BetweenSegmentsCheck = gtk_check_button_new_with_mnemonic (_("Between Segments")); gtk_widget_show (BetweenSegmentsCheck); gtk_box_pack_start (GTK_BOX (OptionsVBox), BetweenSegmentsCheck, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (BetweenSegmentsCheck, _("Interpolate between track segments. Generally the data is segmented " "to show where location data was available and not available, but you might " "still want to interpolate between segments.")); #else gtk_tooltips_set_tip (tooltips, BetweenSegmentsCheck, _("Interpolate between track segments. Generally the data is segmented " "to show where location data was available and not available, but you might " "still want to interpolate between segments."), NULL); #endif gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (BetweenSegmentsCheck), g_key_file_get_boolean(GUISettings, "default", "betweensegments", NULL)); DegMinSecsCheck = gtk_check_button_new_with_mnemonic (_("Write DD MM SS.SS")); gtk_widget_show (DegMinSecsCheck); gtk_box_pack_start (GTK_BOX (OptionsVBox), DegMinSecsCheck, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (DegMinSecsCheck, _("Write the latitude and longitude values as DD MM SS.SS; this is " "the new default. The old behaviour was to write it as " "DD MM.MM, which will occur if you uncheck this box.")); #else gtk_tooltips_set_tip (tooltips, DegMinSecsCheck, _("Write the latitude and longitude values as DD MM SS.SS; this is " "the new default. The old behaviour was to write it as " "DD MM.MM, which will occur if you uncheck this box."), NULL); #endif gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (DegMinSecsCheck), g_key_file_get_boolean(GUISettings, "default", "writeddmmss", NULL)); AutoTimeZoneCheck = gtk_check_button_new_with_mnemonic (_("Auto time zone")); gtk_widget_show (AutoTimeZoneCheck); gtk_box_pack_start (GTK_BOX (OptionsVBox), AutoTimeZoneCheck, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (AutoTimeZoneCheck, _("Assume the camera time zone is the same as the local time zone.")); #else gtk_tooltips_set_tip (tooltips, AutoTimeZoneCheck, _("Assume the camera time zone is the same as the local time zone."), NULL); #endif b = g_key_file_get_boolean(GUISettings, "default", "autotimezone", &error); if (error && error->code) b = TRUE; /* Default this to true */ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (AutoTimeZoneCheck), b); OptionsTable = gtk_table_new (4, 2, FALSE); gtk_widget_show (OptionsTable); gtk_box_pack_start (GTK_BOX (OptionsVBox), OptionsTable, TRUE, TRUE, 0); MaxGapTimeLabel = gtk_label_new (_("Max gap time:")); gtk_widget_show (MaxGapTimeLabel); gtk_table_attach (GTK_TABLE (OptionsTable), MaxGapTimeLabel, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (MaxGapTimeLabel), 0, 0.5); TimeZoneLabel = gtk_label_new (_("Time Zone:")); gtk_widget_show (TimeZoneLabel); gtk_table_attach (GTK_TABLE (OptionsTable), TimeZoneLabel, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (TimeZoneLabel), 0, 0.5); PhotoOffsetLabel = gtk_label_new (_("Photo Offset:")); gtk_widget_show (PhotoOffsetLabel); gtk_table_attach (GTK_TABLE (OptionsTable), PhotoOffsetLabel, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (PhotoOffsetLabel), 0, 0.5); GPSDatumLabel = gtk_label_new (_("GPS Datum:")); gtk_widget_show (GPSDatumLabel); gtk_table_attach (GTK_TABLE (OptionsTable), GPSDatumLabel, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (GPSDatumLabel), 0, 0.5); GapTimeEntry = gtk_entry_new (); gtk_widget_show (GapTimeEntry); gtk_table_attach (GTK_TABLE (OptionsTable), GapTimeEntry, 1, 2, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (GapTimeEntry, _("Maximum time \"away\" from a point that the photo can be taken " "yet still match, in seconds. If a photo's time is outside " "this value (from both points on either side), the location will " "not match.")); #else gtk_tooltips_set_tip (tooltips, GapTimeEntry, _("Maximum time \"away\" from a point that the photo can be taken " "yet still match, in seconds. If a photo's time is outside " "this value (from both points on either side), the location will " "not match."), NULL); #endif gtk_entry_set_text (GTK_ENTRY (GapTimeEntry), g_key_file_get_value(GUISettings, "default", "maxgap", NULL)); gtk_entry_set_width_chars (GTK_ENTRY (GapTimeEntry), 7); TimeZoneEntry = gtk_entry_new (); gtk_widget_show (TimeZoneEntry); gtk_table_attach (GTK_TABLE (OptionsTable), TimeZoneEntry, 1, 2, 1, 2, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (TimeZoneEntry, _("The timezone that the camera's time was set to when the photos were " "taken. For example, if a camera is set to AWST or +8:00 hours from UTC, " "enter +8:00 here so that the correct adjustment to the photo's time " "can be made. GPS data is always in UTC.")); #else gtk_tooltips_set_tip (tooltips, TimeZoneEntry, _("The timezone that the camera's time was set to when the photos were " "taken. For example, if a camera is set to AWST or +8:00 hours from UTC, " "enter +8:00 here so that the correct adjustment to the photo's time " "can be made. GPS data is always in UTC."), NULL); #endif gtk_entry_set_text (GTK_ENTRY (TimeZoneEntry), g_key_file_get_value(GUISettings, "default", "timezone", NULL)); gtk_entry_set_width_chars (GTK_ENTRY (TimeZoneEntry), 7); /* Toggle visibility of time zone entry when auto time zone is toggled */ timezone_toggle_visibility(AutoTimeZoneCheck, TimeZoneEntry); g_signal_connect(AutoTimeZoneCheck, "toggled", G_CALLBACK (timezone_toggle_visibility), GTK_ENTRY (TimeZoneEntry)); PhotoOffsetEntry = gtk_entry_new (); gtk_widget_show (PhotoOffsetEntry); gtk_table_attach (GTK_TABLE (OptionsTable), PhotoOffsetEntry, 1, 2, 2, 3, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (PhotoOffsetEntry, _("The number of seconds to add to the photo's time to make it match " "the GPS data. Calculate this with (GPS - Photo). " "Can be negative or positive.")); #else gtk_tooltips_set_tip (tooltips, PhotoOffsetEntry, _("The number of seconds to add to the photo's time to make it match " "the GPS data. Calculate this with (GPS - Photo). " "Can be negative or positive."), NULL); #endif gtk_entry_set_text (GTK_ENTRY (PhotoOffsetEntry), g_key_file_get_value(GUISettings, "default", "photooffset", NULL)); gtk_entry_set_width_chars (GTK_ENTRY (PhotoOffsetEntry), 7); GPSDatumEntry = gtk_entry_new (); gtk_widget_show (GPSDatumEntry); gtk_table_attach (GTK_TABLE (OptionsTable), GPSDatumEntry, 1, 2, 4, 5, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (GPSDatumEntry, _("The datum used for the GPS data. This text here is recorded in the " "EXIF tags as the source datum. WGS-84 is very commonly used.")); #else gtk_tooltips_set_tip (tooltips, GPSDatumEntry, _("The datum used for the GPS data. This text here is recorded in the " "EXIF tags as the source datum. WGS-84 is very commonly used."), NULL); #endif gtk_entry_set_text (GTK_ENTRY (GPSDatumEntry), g_key_file_get_value(GUISettings, "default", "gpsdatum", NULL)); gtk_entry_set_width_chars (GTK_ENTRY (GPSDatumEntry), 7); OptionsFrameLable = gtk_label_new (_("3. Set options")); gtk_widget_show (OptionsFrameLable); gtk_frame_set_label_widget (GTK_FRAME (OptionsFrame), OptionsFrameLable); gtk_label_set_use_markup (GTK_LABEL (OptionsFrameLable), TRUE); /* Correlate button area. */ CorrelateFrame = gtk_frame_new (NULL); gtk_widget_show (CorrelateFrame); gtk_box_pack_start (GTK_BOX (ControlsVBox), CorrelateFrame, FALSE, FALSE, 0); CorrelateAlignment = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_widget_show (CorrelateAlignment); gtk_container_add (GTK_CONTAINER (CorrelateFrame), CorrelateAlignment); gtk_alignment_set_padding (GTK_ALIGNMENT (CorrelateAlignment), 0, 4, 12, 4); CorrelateButton = gtk_button_new_with_mnemonic (_("Correlate Photos")); gtk_widget_show (CorrelateButton); gtk_container_add (GTK_CONTAINER (CorrelateAlignment), CorrelateButton); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (CorrelateButton, _("Begin the correlation process, writing back into the photos' " "EXIF tags (unless Don't write is selected).")); #else gtk_tooltips_set_tip (tooltips, CorrelateButton, _("Begin the correlation process, writing back into the photos' " "EXIF tags (unless Don't write is selected)."), NULL); #endif g_signal_connect (G_OBJECT (CorrelateButton), "clicked", G_CALLBACK (CorrelateButtonPress), NULL); CorrelateLabel = gtk_label_new (_("4. Correlate!")); gtk_widget_show (CorrelateLabel); gtk_frame_set_label_widget (GTK_FRAME (CorrelateFrame), CorrelateLabel); gtk_label_set_use_markup (GTK_LABEL (CorrelateLabel), TRUE); /* Other options area. */ OtherOptionsFrame = gtk_frame_new (NULL); gtk_widget_show (OtherOptionsFrame); gtk_box_pack_start (GTK_BOX (ControlsVBox), OtherOptionsFrame, FALSE, FALSE, 0); OtherOptionsAlignment = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_widget_show (OtherOptionsAlignment); gtk_container_add (GTK_CONTAINER (OtherOptionsFrame), OtherOptionsAlignment); gtk_alignment_set_padding (GTK_ALIGNMENT (OtherOptionsAlignment), 0, 4, 12, 4); OtherOptionsVBox = gtk_vbox_new (FALSE, 0); gtk_widget_show (OtherOptionsVBox); gtk_container_add (GTK_CONTAINER (OtherOptionsAlignment), OtherOptionsVBox); StripGPSButton = gtk_button_new_with_mnemonic (_("Strip GPS tags")); gtk_widget_show (StripGPSButton); gtk_box_pack_start (GTK_BOX (OtherOptionsVBox), StripGPSButton, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (StripGPSButton, _("Strip GPS tags from the selected photos.")); #else gtk_tooltips_set_tip (tooltips, StripGPSButton, _("Strip GPS tags from the selected photos."), NULL); #endif g_signal_connect (G_OBJECT (StripGPSButton), "clicked", G_CALLBACK (StripGPSButtonPress), NULL); HelpButton = gtk_button_new_with_mnemonic (_("Help")); gtk_widget_show (HelpButton); gtk_box_pack_start (GTK_BOX (OtherOptionsVBox), HelpButton, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (HelpButton, _("View help for this application.")); #else gtk_tooltips_set_tip (tooltips, HelpButton, _("View help for this application."), NULL); #endif g_signal_connect (G_OBJECT (HelpButton), "clicked", G_CALLBACK (HelpButtonPress), NULL); AboutButton = gtk_button_new_with_mnemonic (_("About")); gtk_widget_show (AboutButton); gtk_box_pack_start (GTK_BOX (OtherOptionsVBox), AboutButton, FALSE, FALSE, 0); #if GTK_CHECK_VERSION(2, 12, 0) gtk_widget_set_tooltip_text (AboutButton, _("Show information about the program.")); #else gtk_tooltips_set_tip (tooltips, AboutButton, _("Show information about the program."), NULL); #endif g_signal_connect (G_OBJECT (AboutButton), "clicked", G_CALLBACK (AboutButtonPress), NULL); OtherOptionsLabel = gtk_label_new (_("Other Tools")); gtk_widget_show (OtherOptionsLabel); gtk_frame_set_label_widget (GTK_FRAME (OtherOptionsFrame), OtherOptionsLabel); gtk_label_set_use_markup (GTK_LABEL (OtherOptionsLabel), TRUE); /* Photo list box area of the window. */ PhotoListVBox = gtk_vbox_new (FALSE, 0); gtk_widget_show (PhotoListVBox); gtk_box_pack_start (GTK_BOX (WindowHBox), PhotoListVBox, TRUE, TRUE, 0); PhotoListScroll = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (PhotoListScroll); gtk_box_pack_start (GTK_BOX (PhotoListVBox), PhotoListScroll, TRUE, TRUE, 0); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (PhotoListScroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (PhotoListScroll), GTK_SHADOW_IN); /* Get the photo list store ready. */ PhotoListStore = gtk_list_store_new(LIST_NOCOLUMNS, G_TYPE_STRING, /* The Filename */ G_TYPE_STRING, /* Latitude */ G_TYPE_STRING, /* Longitude */ G_TYPE_STRING, /* Elevation */ G_TYPE_STRING, /* The Time */ G_TYPE_STRING, /* The State */ G_TYPE_POINTER); /* Pointer to the matching list item. */ PhotoList = gtk_tree_view_new_with_model (GTK_TREE_MODEL(PhotoListStore)); gtk_widget_show (PhotoList); gtk_container_add (GTK_CONTAINER (PhotoListScroll), PhotoList); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(PhotoList)), GTK_SELECTION_MULTIPLE); /* Prepare the columns. We need columns. Columns are good. */ PhotoListRenderer = gtk_cell_renderer_text_new (); /* File Column. */ FileColumn = gtk_tree_view_column_new_with_attributes (_("File"), PhotoListRenderer, "text", LIST_FILENAME, NULL); gtk_tree_view_column_set_resizable (FileColumn, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW (PhotoList), FileColumn); /* Latitude Column. */ LatColumn = gtk_tree_view_column_new_with_attributes (_("Latitude"), PhotoListRenderer, "text", LIST_LAT, NULL); gtk_tree_view_column_set_resizable (LatColumn, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW (PhotoList), LatColumn); /* Longitude Column. */ LongColumn = gtk_tree_view_column_new_with_attributes (_("Longitude"), PhotoListRenderer, "text", LIST_LONG, NULL); gtk_tree_view_column_set_resizable (LongColumn, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW (PhotoList), LongColumn); /* Elevation Column. */ ElevColumn = gtk_tree_view_column_new_with_attributes (_("Elevation"), PhotoListRenderer, "text", LIST_ELEV, NULL); gtk_tree_view_column_set_resizable (ElevColumn, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW (PhotoList), ElevColumn); /* Time column. */ TimeColumn = gtk_tree_view_column_new_with_attributes (_("Time"), PhotoListRenderer, "text", LIST_TIME, NULL); gtk_tree_view_column_set_resizable (TimeColumn, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW (PhotoList), TimeColumn); /* State column. */ StateColumn = gtk_tree_view_column_new_with_attributes (_("State"), PhotoListRenderer, "text", LIST_STATE, NULL); gtk_tree_view_column_set_resizable (StateColumn, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW (PhotoList), StateColumn); /* Get the track list store ready. * Create the empty terminating entry. */ GPSData = (struct GPSTrack*) calloc(1, sizeof(*GPSData)); NumTracks = 0; /* Final thing: show the window. */ gtk_widget_show(MatchWindow); /* Done! Return a pointer to the window, although we never use it... */ return MatchWindow; } gboolean DestroyWindow(GtkWidget *Widget, GdkEvent *Event, gpointer Data) { (void) Widget; // Unused (void) Event; // Unused (void) Data; // Unused /* Record the settings, and then save them. */ g_key_file_set_boolean(GUISettings, "default", "interpolate", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(InterpolateCheck))); g_key_file_set_boolean(GUISettings, "default", "dontwrite", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(NoWriteCheck))); g_key_file_set_boolean(GUISettings, "default", "replace", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(OverwriteCheck))); g_key_file_set_boolean(GUISettings, "default", "nochangemtime", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(NoMtimeCheck))); g_key_file_set_boolean(GUISettings, "default", "betweensegments", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(BetweenSegmentsCheck))); g_key_file_set_boolean(GUISettings, "default", "writeddmmss", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(DegMinSecsCheck))); g_key_file_set_boolean(GUISettings, "default", "autotimezone", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(AutoTimeZoneCheck))); g_key_file_set_string(GUISettings, "default", "maxgap", gtk_entry_get_text(GTK_ENTRY(GapTimeEntry))); g_key_file_set_string(GUISettings, "default", "timezone", gtk_entry_get_text(GTK_ENTRY(TimeZoneEntry))); g_key_file_set_string(GUISettings, "default", "photooffset", gtk_entry_get_text(GTK_ENTRY(PhotoOffsetEntry))); g_key_file_set_string(GUISettings, "default", "gpsdatum", gtk_entry_get_text(GTK_ENTRY(GPSDatumEntry))); if (GPXOpenDir) g_key_file_set_string(GUISettings, "default", "gpxopendir", GPXOpenDir); if (PhotoOpenDir) g_key_file_set_string(GUISettings, "default", "photoopendir", PhotoOpenDir); SaveSettings(); /* Someone closed the window. */ /* Free the memory we allocated for the photo list. */ struct GUIPhotoList* Free = NULL; struct GUIPhotoList* Free2 = NULL; if (FirstPhoto) { /* Walk through the singly-linked list * freeing stuff. */ Free = FirstPhoto; while (1) { free(Free->Filename); free(Free->Time); Free2 = Free->Next; free(Free); if (Free2 == NULL) break; Free = Free2; } } /* Free the memory for the GPS data, if applicable. */ while (NumTracks > 0) { --NumTracks; FreeTrack(&GPSData[NumTracks]); } free(GPSData); /* Tell GTK that we're done. */ #if GTK_CHECK_VERSION(2, 12, 0) exit(0); #else gtk_exit(0); #endif /* And return FALSE so that GTK knows we have not * vetoed the close. */ return FALSE; } void AddPhotosButtonPress( GtkWidget *Widget, gpointer Data ) { (void) Widget; // Unused (void) Data; // Unused /* Add some photos to this thing. */ GtkWidget *AddPhotosDialog; /* Get the dialog ready. */ AddPhotosDialog = gtk_file_chooser_dialog_new (_("Add Photos..."), GTK_WINDOW(MatchWindow), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(AddPhotosDialog), TRUE); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(AddPhotosDialog), PhotoOpenDir); GtkFileFilter *JpgFilter = gtk_file_filter_new(); if (JpgFilter) { gtk_file_filter_add_pattern(JpgFilter, "*.[jJ][pP][gG]"); gtk_file_filter_add_pattern(JpgFilter, "*.[jJ][pP][eE][gG]"); gtk_file_filter_set_name(JpgFilter, _("JPEG images")); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(AddPhotosDialog), JpgFilter); } GtkFileFilter *AllFilter = gtk_file_filter_new(); if (AllFilter) { gtk_file_filter_add_pattern(AllFilter, "*"); gtk_file_filter_set_name(AllFilter, _("All files")); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(AddPhotosDialog), AllFilter); } /* Run the dialog. */ if (gtk_dialog_run (GTK_DIALOG (AddPhotosDialog)) == GTK_RESPONSE_ACCEPT) { /* Hide the dialog. */ gtk_widget_hide(AddPhotosDialog); /* Haul out the selected files. * We pass them along to another function that will * add them to the internal list and onto the screen. */ /* GTK returns a GSList - a singly-linked list of filenames. */ GSList* FileNames = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER(AddPhotosDialog)); GSList* Run; for (Run = FileNames; Run; Run = Run->next) { /* Show what's happening on the screen. */ GtkGUIUpdate(); /*printf("Filename: %s.\n", (char*)Run->data);*/ /* Call the other function with the filename - this * function adds it to the internal list, and adds it * to the screen display, too. */ AddPhotoToList((char*)Run->data); /* Free the memory passed to us. */ g_free(Run->data); } /* We're done with the list - free it. */ g_slist_free(FileNames); } /* Copy out the directory that the user ended up at. */ g_free(PhotoOpenDir); PhotoOpenDir = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(AddPhotosDialog)); /* Now we're done with the dialog. See you! */ gtk_widget_destroy (AddPhotosDialog); } void AddPhotoToList(const char* Filename) { /* Add the photo to the list. Query out the exif tags * at the same time, too - so we can add them to the * current list. */ /* Note that this function does more than update the GUI: * it also adds it to the internal list, ready to go. */ /* Get ready to read the relevant data. */ GtkTreeIter AddStuff; double Lat, Long, Elev; Lat = Long = Elev = 0; int IncludesGPS = 0; /* Read the EXIF data. */ char *Time = ReadExifData(Filename, &Lat, &Long, &Elev, &IncludesGPS); /* Note: we don't check if Time is NULL here. It is done for * us in SetListItem, and we check again before we attempt * to allocate memory to store "Time" in. */ /* Add the data to the list. */ gtk_list_store_append(PhotoListStore, &AddStuff); SetListItem(&AddStuff, Filename, Time, Lat, Long, Elev, NULL, IncludesGPS); /* Save away the filename and the TreeIter information in the internal * singly-linked list. */ /* We also make a copy of Filename - it won't exist once we return. */ if (FirstPhoto) { /* Already at least one element. Add to it. */ LastPhoto->Next = (struct GUIPhotoList*) malloc(sizeof(struct GUIPhotoList)); LastPhoto = LastPhoto->Next; LastPhoto->Next = NULL; } else { /* No elements. Righto, add one. */ FirstPhoto = (struct GUIPhotoList*) malloc(sizeof(struct GUIPhotoList)); LastPhoto = FirstPhoto; FirstPhoto->Next = NULL; } /* Now that we've allocated memory for the structure, allocate * memory for the strings and then fill them. */ /* Filename first... */ LastPhoto->Filename = strdup(Filename); /* And then Time, after checking for NULLness. */ if (Time) { LastPhoto->Time = strdup(Time); } else { LastPhoto->Time = strdup(_("No EXIF data")); } /* Save the TreeIter as the last step. */ LastPhoto->ListPointer = AddStuff; /* Save the pointer into the data, as well. */ gtk_list_store_set(PhotoListStore, &AddStuff, LIST_POINTER, LastPhoto, -1); /* Free the memory allocated for us. * (ReadExifData allocates and returns memory) */ free(Time); } static void gtk_tree_path_free_(gpointer path, gpointer data) { (void) data; // Unused gtk_tree_path_free((GtkTreePath *)path); } void RemovePhotosButtonPress( GtkWidget *Widget, gpointer Data ) { (void) Widget; // Unused (void) Data; // Unused /* Someone clicked the remove photos button. So make it happen! * First, query out what was selected. */ GtkTreeIter Iter; GtkTreeSelection* Selection; Selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(PhotoList)); GList* Selected = gtk_tree_selection_get_selected_rows(Selection, NULL); /* Sanity check: was anything selected? */ if (Selected == NULL) { /* Nothing is selected. Do nothing. */ return; } /* Count the items on the GList. We need this to be able to * keep a list of items that have been removed from our internal * list, and should be removed from the screen. */ int SelectedCount = 0; GList* Walk; for (Walk = Selected; Walk; Walk = Walk->next) { SelectedCount++; } /* Now get ready to keep a list of Iters that we can * delete. */ GtkTreeIter* RemoveIters = (GtkTreeIter*) malloc(sizeof(GtkTreeIter) * SelectedCount); /* Walk through and remove the items from our internal list. */ struct GUIPhotoList* PhotoWalk = NULL; struct GUIPhotoList* LastPhotoWalk = NULL; struct GUIPhotoList* FreeHold = NULL; struct GUIPhotoList* FreeMe = NULL; int IterCount = 0; for (Walk = Selected; Walk; Walk = Walk->next) { /* Acquire a new Iter for this selected row. */ if (gtk_tree_model_get_iter(GTK_TREE_MODEL(PhotoListStore), &Iter, (GtkTreePath*) Walk->data)) { /* To remove the row from our internal list. * Locate it via the pointer stored. */ gtk_tree_model_get(GTK_TREE_MODEL(PhotoListStore), &Iter, LIST_POINTER, &FreeMe, -1); /* Save the iter for afterwards: we can then remove the * data from the screen. */ /* gtk_list_store_remove(PhotoListStore, &Iter); */ RemoveIters[IterCount] = Iter; IterCount++; /* Now go back through and take it out from our list. */ PhotoWalk = FirstPhoto; LastPhotoWalk = NULL; while (1) { if (PhotoWalk == NULL) break; /*printf("Search: %d / %d.\n", PhotoWalk, FreeMe);*/ /* Check to see if this is the one we want to be rid of. */ if (PhotoWalk == FreeMe) { /* Right. Remove. */ /*printf("Removing: %s.\n", PhotoWalk->Filename);*/ PhotoWalk = PhotoWalk->Next; if (FreeMe == FirstPhoto) { /* Remove the top of the list. */ FreeHold = FreeMe; FirstPhoto = FreeMe->Next; LastPhotoWalk = FreeMe->Next; free(FreeHold->Filename); free(FreeHold->Time); free(FreeHold); break; } else if (FreeMe == LastPhoto) { /* Remove the bottom of the list. */ FreeHold = FreeMe; LastPhoto = LastPhotoWalk; LastPhoto->Next = NULL; free(FreeHold->Filename); free(FreeHold->Time); free(FreeHold); break; } else { /* Remove a middle of the list. */ FreeHold = FreeMe; LastPhotoWalk->Next = FreeHold->Next; free(FreeHold->Filename); free(FreeHold->Time); free(FreeHold); break; } } else { /* Nope, this wasn't what we wanted to delete. * So get ready to look at the next one, keeping * mind of where we were. */ LastPhotoWalk = PhotoWalk; PhotoWalk = PhotoWalk->Next; } } /* End for Walk the photo list. */ } } /* End for Walk the GList. */ /* Now remove the rows from the screen. * By this point, they are no longer in our internal list. */ int i; for (i = 0; i < SelectedCount; i++) { gtk_list_store_remove(PhotoListStore, &RemoveIters[i]); } free(RemoveIters); /* Free the memory used by GList. */ g_list_foreach(Selected, gtk_tree_path_free_, NULL); g_list_free(Selected); /* Debug: walk the photo list tree. */ /*struct GUIPhotoList* List; for (List = FirstPhoto; List; List = List->Next) { printf("List Filename: %s\n", List->Filename); } printf("--------------------------------------------------------------\n");*/ } void SetListItem(GtkTreeIter* Iter, const char* Filename, const char* Time, double Lat, double Long, double Elev, const char* PassedState, int IncludesGPS) { /* Scratch areas. */ char LatScratch[100] = ""; char LongScratch[100] = ""; char ElevScratch[100] = ""; const char* State = NULL; /* Format all the data. */ if (!Time) { /* Not good. Failure. */ Time = ""; State = _("No EXIF data"); } else { /* All ok. Get ready. */ if (IncludesGPS) { State = _("GPS Data Present"); /* In each case below, consider the values * that are invalid for each - if that's the case, * consider the spots as "blank". */ /* Lat can't be greater than 90 degrees. */ if (Lat < 200) { snprintf(LatScratch, sizeof(LatScratch), "%f (%s)", Lat, (Lat < 0) ? _("S") : _("N")); } else { snprintf(LatScratch, sizeof(LatScratch), " "); } /* Long can't be greater than 180 degrees. */ if (Long < 200) { snprintf(LongScratch, sizeof(LongScratch), "%f (%s)", Long, (Long < 0) ? _("W") : _("E")); } else { snprintf(LongScratch, sizeof(LongScratch), " "); } /* Radius of earth ~6000km */ if (Elev > -7000000) { snprintf(ElevScratch, sizeof(ElevScratch), "%.2f%s", Elev, _("m")); } else { snprintf(ElevScratch, sizeof(ElevScratch), " "); } } else { /* Placeholders for the lack of data. */ State = _("Ready"); } } /* Overwrite state with what we want, if needed. */ if (PassedState) State = PassedState; /* And set all the appropriate data. */ gtk_list_store_set(PhotoListStore, Iter, LIST_FILENAME, strrchr(Filename, G_DIR_SEPARATOR)+1, LIST_LAT, LatScratch, LIST_LONG, LongScratch, LIST_ELEV, ElevScratch, LIST_TIME, Time, LIST_STATE, State, -1); } void SetState(GtkTreeIter* Iter, const char* State) { /* Set the state on the item... just the state. */ gtk_list_store_set(PhotoListStore, Iter, LIST_STATE, State, -1); } void SelectGPSButtonPress( GtkWidget *Widget, gpointer Data ) { (void) Widget; // Unused (void) Data; // Unused /* Select and load some GPS data! */ GtkWidget *GPSDataDialog; GtkWidget *ErrorDialog; /* Get the dialog ready... */ GPSDataDialog = gtk_file_chooser_dialog_new (_("Select GPS Data..."), GTK_WINDOW(MatchWindow), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(GPSDataDialog), TRUE); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(GPSDataDialog), GPXOpenDir); GtkFileFilter *GpxFilter = gtk_file_filter_new(); if (GpxFilter) { gtk_file_filter_add_pattern(GpxFilter, "*.[gG][pP][xX]"); gtk_file_filter_set_name(GpxFilter, _("GPX files")); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(GPSDataDialog), GpxFilter); } GtkFileFilter *AllFilter = gtk_file_filter_new(); if (AllFilter) { gtk_file_filter_add_pattern(AllFilter, "*"); gtk_file_filter_set_name(AllFilter, _("All files")); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(GPSDataDialog), AllFilter); } /* Run the dialog... */ if (gtk_dialog_run (GTK_DIALOG (GPSDataDialog)) == GTK_RESPONSE_ACCEPT) { /* Sanity check: free the GPS tracks in case we already have one. * Note: we check this now, because if we cancelled the dialog, * we should run with the old data. */ while (NumTracks > 0) { --NumTracks; FreeTrack(&GPSData[NumTracks]); } /* Hide the "open" dialog. */ gtk_widget_hide(GPSDataDialog); /* Display a dialog so the user knows whats going down. */ ErrorDialog = gtk_message_dialog_new (GTK_WINDOW(MatchWindow), (GtkDialogFlags) (GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL), GTK_MESSAGE_INFO, GTK_BUTTONS_NONE, _("Loading GPS data from file... Won't be a moment...")); gtk_widget_show(ErrorDialog); GtkGUIUpdate(); char *FirstOrBadFileName = NULL; int ReadOk = 1; /* GTK returns a GSList - a singly-linked list of filenames. */ /* Process the result of the dialog... */ GSList* FileNames = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER(GPSDataDialog)); GSList* Run; for (Run = FileNames; Run; Run = Run->next) { /* Read in the new data, but stop trying after the first failure. */ if (ReadOk) { if (FirstOrBadFileName == NULL) { /* If only one file is given, this is it */ FirstOrBadFileName = strdup((char *)Run->data); } else { /* If more than one file is given, say so */ free(FirstOrBadFileName); /* This string must look like a file path */ FirstOrBadFileName = strdup(_(G_DIR_SEPARATOR_S "multiple files")); } ReadOk = ReadGPX((char*)Run->data, &GPSData[NumTracks]); if (ReadOk) { /* Make room for a new end-of-array entry */ ++NumTracks; GPSData = (struct GPSTrack*) realloc(GPSData, sizeof(*GPSData)*(NumTracks+1)); memset(&GPSData[NumTracks], 0, sizeof(*GPSData)); } else { /* If a file could not be read, give the name */ free(FirstOrBadFileName); FirstOrBadFileName = strdup((char *)Run->data); } } /* Free the memory passed to us. */ g_free(Run->data); } /* We're done with the list - free it. */ g_slist_free(FileNames); /* Close the dialog now that we're done. */ gtk_widget_destroy(ErrorDialog); /* Prepare our "scratch" for rewriting labels. */ const size_t ScratchLength = strlen(FirstOrBadFileName) + 100; char* Scratch = (char*) malloc(sizeof(char) * ScratchLength); /* Check if all the data was read ok. */ if (ReadOk) { /* It's all good! * Adjust the label to say so. */ snprintf(Scratch, ScratchLength, _("Read from: %s"), strrchr(FirstOrBadFileName, G_DIR_SEPARATOR)+1); gtk_label_set_text(GTK_LABEL(GPSSelectedLabel), Scratch); } else { /* Not good. Say so. */ /* Set the label... */ snprintf(Scratch, ScratchLength, _("Read from: No file")); gtk_label_set_text(GTK_LABEL(GPSSelectedLabel), Scratch); /* Show an error dialog. */ ErrorDialog = gtk_message_dialog_new (GTK_WINDOW(MatchWindow), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Unable to read file %s for some reason. Please try again."), FirstOrBadFileName); gtk_dialog_run (GTK_DIALOG (ErrorDialog)); gtk_widget_destroy (ErrorDialog); /* Clean up the tracks already read in */ while (NumTracks > 0) { --NumTracks; FreeTrack(&GPSData[NumTracks]); } } /* Clean up... */ free(Scratch); free(FirstOrBadFileName); } /* Make a note of the directory we stopped at. */ g_free(GPXOpenDir); GPXOpenDir = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(GPSDataDialog)); /* Now we're finished with the dialog... free it. */ gtk_widget_destroy (GPSDataDialog); } void CorrelateButtonPress( GtkWidget *Widget, gpointer Data ) { (void) Widget; // Unused (void) Data; // Unused /* We were asked to correlate some photos... make it happen... */ GtkWidget *ErrorDialog; /* Check to see we have everything we need... */ if (FirstPhoto == NULL) { /* No photos... */ ErrorDialog = gtk_message_dialog_new (GTK_WINDOW(MatchWindow), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("No photos selected to match! Please use Add to add photos first!")); gtk_dialog_run (GTK_DIALOG (ErrorDialog)); gtk_widget_destroy (ErrorDialog); return; } if (NumTracks == 0) { /* No GPS data... */ ErrorDialog = gtk_message_dialog_new (GTK_WINDOW(MatchWindow), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("No GPS data loaded! Please select a GPX file to read GPS data from.")); gtk_dialog_run (GTK_DIALOG (ErrorDialog)); gtk_widget_destroy (ErrorDialog); return; } /* Assemble the settings for the correlation run. */ struct CorrelateOptions Options; /* Interpolation. */ /* This is confusing. I should have thought more about the Interpolate * flags in the CorrelateOptions structure. But, if you think about * it for a bit, it can make sense. Enough sense to use. */ Options.NoInterpolate = !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(InterpolateCheck)); /* Write or no write. */ Options.NoWriteExif = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(NoWriteCheck)); /* Force overwrite. */ Options.OverwriteExisting = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(OverwriteCheck)); /* No change MTime. */ Options.NoChangeMtime = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(NoMtimeCheck)); /* Between segments? */ Options.DoBetweenTrkSeg = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(BetweenSegmentsCheck)); /* DD MM.MM or DD MM SS.SS? */ Options.DegMinSecs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(DegMinSecsCheck)); /* Feather time. */ Options.FeatherTime = atof(gtk_entry_get_text(GTK_ENTRY(GapTimeEntry))); /* GPS Datum. */ Options.Datum = strdup(gtk_entry_get_text(GTK_ENTRY(GPSDatumEntry))); /* TimeZone. We may need to extract the timezone from a string. */ Options.AutoTimeZone = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(AutoTimeZoneCheck)); Options.TimeZoneHours = 0; Options.TimeZoneMins = 0; char* TZString = (char*) gtk_entry_get_text(GTK_ENTRY(TimeZoneEntry)); /* Check the string. If there is a colon, then it's a time in xx:xx format. * If not, it's probably just a +/-xx format. In all other cases, * it will be interpreted as +/-xx, which, if given a string, returns 0. */ if (strstr(TZString, ":")) { /* Found colon. Split into two. */ sscanf(TZString, "%d:%d", &Options.TimeZoneHours, &Options.TimeZoneMins); if (Options.TimeZoneHours < 0) Options.TimeZoneMins *= -1; } else { /* No colon. Just parse. */ Options.TimeZoneHours = atoi(TZString); } /* Photo Offset time */ Options.PhotoOffset = atoi(gtk_entry_get_text(GTK_ENTRY(PhotoOffsetEntry))); /* Store the GPS track */ Options.Track = GPSData; /* Walk through the list, correlating, and updating the screen. */ struct GUIPhotoList* Walk; struct GPSPoint* Result; const char* State = _("Internal error"); GtkTreePath* ShowPath; for (Walk = FirstPhoto; Walk; Walk = Walk->Next) { /* Say that we're doing it... */ SetState(&Walk->ListPointer, _("Correlating...")); /* Point to the cell, too... ie, scroll the tree view * to ensure that the one we're playing with can be seen on screen. */ ShowPath = gtk_tree_model_get_path(GTK_TREE_MODEL(PhotoListStore), &Walk->ListPointer); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(PhotoList), ShowPath, NULL, FALSE, 0, 0); gtk_tree_path_free(ShowPath); GtkGUIUpdate(); /* Do the correlation. */ Result = CorrelatePhoto(Walk->Filename, &Options); /* Figure out if it worked. */ if (Result) { /* Result was not null. That means that we * matched to a point. But that's not the whole * story. Read on... */ switch (Options.Result) { case CORR_OK: /* All cool! Exact match! */ State = _("Exact Match"); break; case CORR_INTERPOLATED: /* All cool! Interpolated match. */ State = _("Interpolated Match"); break; case CORR_ROUND: /* All cool! Rounded match. */ State = _("Rounded Match"); break; case CORR_EXIFWRITEFAIL: /* Not cool - matched, not written. */ State = _("Write Failure"); break; } /* Now update the screen with the numbers. */ SetListItem(&Walk->ListPointer, Walk->Filename, Walk->Time, Result->Lat, Result->Long, Result->Elev, State, 1); } else { /* Result was null. This means something * really went wrong. Find out and put that * on the screen. */ if (Options.Result == CORR_GPSDATAEXISTS) { /* Do nothing... */ SetState(&Walk->ListPointer, _("Data Already Present")); continue; } switch (Options.Result) { case CORR_NOMATCH: /* No match: outside data. */ State = _("No Match"); break; case CORR_TOOFAR: /* Too far from any point. */ State = _("Too far"); break; case CORR_NOEXIFINPUT: /* No exif data input. */ State = _("No data"); break; } /* Now update the screen with the changed state. */ SetListItem(&Walk->ListPointer, Walk->Filename, Walk->Time, 0, 0, 0, State, 0); } /* End if Result */ } /* End for Walk the list ... */ free(Options.Datum); } void StripGPSButtonPress( GtkWidget *Widget, gpointer Data ) { (void) Widget; // Unused (void) Data; // Unused /* Someone clicked the Strip GPS Data button. So make it happen! * First, query out what was selected. */ GtkTreeIter Iter; GtkTreeSelection* Selection; Selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(PhotoList)); GList* Selected = gtk_tree_selection_get_selected_rows(Selection, NULL); /* Sanity check: was anything selected? */ if (Selected == NULL) { /* Nothing is selected. Do nothing. */ return; } int NoChangeMtime = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(NoMtimeCheck)); int NoWriteExif = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(NoWriteCheck)); /* Walk through and remove the items from our internal list. */ GList* Walk; struct GUIPhotoList* PhotoData = NULL; GtkTreePath* ShowPath; for (Walk = Selected; Walk; Walk = Walk->next) { /* Get an Iter for this selected row. */ if (gtk_tree_model_get_iter(GTK_TREE_MODEL(PhotoListStore), &Iter, (GtkTreePath*) Walk->data)) { /* Fetch out the data... */ gtk_tree_model_get(GTK_TREE_MODEL(PhotoListStore), &Iter, LIST_POINTER, &PhotoData, -1); } else { /* Unable to get the iter... * Try again, later. */ continue; } /* Say that we're doing it... */ SetState(&PhotoData->ListPointer, _("Stripping...")); /* Point to the cell, too... ie, scroll the tree view * to ensure that the one we're playing with can be seen on screen. */ ShowPath = gtk_tree_model_get_path(GTK_TREE_MODEL(PhotoListStore), &PhotoData->ListPointer); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(PhotoList), ShowPath, NULL, FALSE, 0, 0); gtk_tree_path_free(ShowPath); GtkGUIUpdate(); /* Strip the tags. */ if (RemoveGPSExif(PhotoData->Filename, NoChangeMtime, NoWriteExif)) { SetListItem(&PhotoData->ListPointer, PhotoData->Filename, PhotoData->Time, 200, 200, -7000000, "", 1); } else { SetListItem(&PhotoData->ListPointer, PhotoData->Filename, PhotoData->Time, 200, 200, -7000000, _("Error Stripping"), 1); } } /* End for Walk the GList. */ /* Debug: walk the photo list tree. */ /*struct GUIPhotoList* List; for (List = FirstPhoto; List; List = List->Next) { printf("List Filename: %s\n", List->Filename); } printf("--------------------------------------------------------------\n");*/ } #define HELP_FILE_NAME "gui.html" /* Returns the URL for the correct language-specific help document. */ static const gchar *HelpUrl( void ) { /* Determine the language used by gettext. This way is more accurate than * using nl_langinfo because gettext uses its own language selection * heuristics which don't always match. */ if (strstr(_(""), "Language: fr\n")) { return "file://" PACKAGE_DOC_DIR "/fr/" HELP_FILE_NAME; } return "file://" PACKAGE_DOC_DIR "/" HELP_FILE_NAME; } void HelpButtonPress( GtkWidget *Widget, gpointer Data ) { (void) Data; // Unused GtkWidget *Toplevel = gtk_widget_get_toplevel (Widget); #if GTK_CHECK_VERSION(3, 22, 0) gtk_show_uri_on_window (GTK_WINDOW(Toplevel), HelpUrl(), GDK_CURRENT_TIME, NULL); #else gtk_show_uri (gtk_window_get_screen(GTK_WINDOW(Toplevel)), HelpUrl(), GDK_CURRENT_TIME, NULL); #endif } void AboutButtonPress( GtkWidget *Widget, gpointer Data ) { static const gchar * const authors[] = { "Daniel Foote", "Dan Fandrich", NULL, }; (void) Data; // Unused GtkWidget *Toplevel = gtk_widget_get_toplevel (Widget); gtk_show_about_dialog(GTK_WINDOW(Toplevel), "authors", authors, "comments", _("GPS Correlate attaches EXIF GPS location tags to images."), // The following hex bytes are the copyright symbol in UTF-8 "copyright", _("Copyright \xC2\xA9 2005-2019 Daniel Foote, Dan Fandrich"), "license", "GPL 2+", #if GTK_CHECK_VERSION(3, 0, 0) "license-type", GTK_LICENSE_GPL_2_0, #endif "logo-icon-name", "gpscorrelate-gui", "version", PACKAGE_VERSION, "website", "https://dfandrich.github.io/gpscorrelate/", NULL); } void GtkGUIUpdate(void) { /* Process all GUI events that need to happen. */ /* This lets us "update" the screen while things are * in motion. Might generate slowdowns with heaps of data, * but generally, it's a good thing. */ while (gtk_events_pending ()) gtk_main_iteration (); } gpscorrelate-2.0/gui.h000066400000000000000000000017321355604302400150070ustar00rootroot00000000000000/* gui.h * Written by Daniel Foote. * Started Feb 2005. * * This file contains the function prototypes for the * stuff in gui.c */ /* Copyright 2005-2013 Daniel Foote, Dan Fandrich. * * This file is part of gpscorrelate. * * gpscorrelate 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. * * gpscorrelate 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 gpscorrelate; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ GtkWidget* CreateMatchWindow(void); gpscorrelate-2.0/i18n.h000066400000000000000000000027751355604302400150120ustar00rootroot00000000000000/* i18n.h * * This file contains internationalization macros and includes */ /* * Copyright © 2001 Lutz Müller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef ENABLE_NLS # include # undef _ # define _(String) gettext (String) # ifdef gettext_noop # define N_(String) gettext_noop (String) # else # define N_(String) (String) # endif #else # define textdomain(String) (String) # define gettext(String) (String) # define ngettext(String1,String2,Count) (Count==1?String1:String2) # define dgettext(Domain,Message) (Message) # define dcgettext(Domain,Message,Type) (Message) # define bindtextdomain(Domain,Directory) (Domain) # define bind_textdomain_codeset(Domain,Codeset) (Domain) # define _(String) (String) # define N_(String) (String) #endif #define TEXTDOMAIN "gpscorrelate" gpscorrelate-2.0/latlong.c000066400000000000000000000151331355604302400156560ustar00rootroot00000000000000/* latlong.c * Written by Daniel Fandrich. * Started Mar 2016. * * This file contains routines to parse latitude/longitude. */ /* Copyright 2016 Daniel Fandrich. * * This file is part of gpscorrelate. * * gpscorrelate 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. * * gpscorrelate 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 gpscorrelate; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include "gpsstructure.h" #include "latlong.h" /* TODO: support locales that use other than "." as the decimal separator */ /* Returns the number of decimal places in the given decimal number string This does not support exponential notation. */ int NumDecimals(const char *Decimal) { const char *Dec = strchr(Decimal, '.'); if (Dec) { return strspn(Dec+1,"0123456789"); } return 0; } /* Parses a human-readable latitude, longitude and optionally elevation in decimal form e.g. 12.3456 -123.45678 1234.56 */ #define DEC_DELIMS " \t," #define DEC_NUMS "-+.0123456789" static int ParseLatLongDecimal(const char *latlongstr, struct GPSPoint* point) { char *num; char *str = strdup(latlongstr); if (!str) goto err; errno = 0; /* set by strtod */ /* Latitude */ num = strtok(str, DEC_DELIMS); if (!str || !point || !num || strlen(num) != strspn(num, DEC_NUMS)) goto err; point->Lat = strtod(num, NULL); if (errno || point->Lat > 90 || point->Lat < -90) goto err; point->LatDecimals = NumDecimals(num); /* Longitude */ num = strtok(NULL, DEC_DELIMS); if (!num || strlen(num) != strspn(num, DEC_NUMS)) goto err; point->Long = strtod(num, NULL); if (errno || point->Long > 180 || point->Long < -180) goto err; point->LongDecimals = NumDecimals(num); /* Elevation */ num = strtok(NULL, DEC_DELIMS); if (!num || strlen(num) != strspn(num, DEC_NUMS)) { /* No elevation given */ point->Elev = 0; point->ElevDecimals = -1; /* default meaning no altitude was found */ } else { point->Elev = strtod(num, NULL); if (errno) goto err; point->ElevDecimals = NumDecimals(num); } point->Time = 0; point->EndOfSegment = 0; point->Next = NULL; free(str); return 1; err: free(str); return 0; } #define D_DIGITS "-+0123456789" #define M_DIGITS "0123456789" #define S_DIGITS ".0123456789" /* *endstr returns the character after the last one used, or in some * circumstances, two after the last one used */ static double ParseDMS(char *latlongstr, char **endstr, int *dec) { double dms, ms; char *num; errno = 0; /* set by strtod */ /* Skip leading spaces and commas. Skipping commas at the beginning of the latitude isn't really very good, but GIGO. */ while (*latlongstr == ' ' || *latlongstr == '\t' || *latlongstr == ',') ++latlongstr; /* Degrees The degrees symbol (\xc2\xb0 in UTF-8) only makes sense in UTF-8 locales, but should be pretty harmless in other locales. Conveniently, \xb0 is also the degrees symbol in all ISO 8859/X locales that have the character, so it will work almost everywhere without additional work. */ num = strtok(latlongstr, "d\xc2\xb0"); if (!num || strlen(num) != strspn(num, D_DIGITS)) return NAN; dms = strtod(num, NULL); if (errno) return NAN; /* Minutes The \xb0 here is a hack to allow the degrees symbol to work in the previous strtok call; it's the second of the two UTF-8 bytes representing that code point that will appear as the first character here. Unfortunately, it appears that strtok doesn't handle UTF-8 properly, even in a UTF-8 locale. */ num = strtok(NULL, "m'\xb0 "); if (!num || strlen(num) != strspn(num, M_DIGITS)) return NAN; ms = strtod(num, NULL); if (errno || ms >= 60) return NAN; dms = dms + ms/60.0 * (2*(dms>0)-1); /* Seconds */ num = strtok(NULL, "s\" \t,"); if (!num || strlen(num) != strspn(num, S_DIGITS)) return NAN; ms = strtod(num, NULL); if (errno || ms >= 60) return NAN; dms = dms + ms/3600.0 * (2*(dms>0)-1); *endstr = num + strlen(num) + 1; /* The whole minutes and seconds add almost 4 decimals, but by the time the number is converted to decimal and back, 3 works better */ *dec = NumDecimals(num) + 3; return dms; } /* Parses a human-readable latitude, longitude and optionally elevation in degrees minutes seconds form e.g. 12d34'56.7" */ static int ParseLatLongDMS(const char *latlongstr, struct GPSPoint* point) { char *endstr; /* Copy the string but add an extra NIL at the end due to ParseDMS' potentially returning that character */ char *str = (char *)calloc(strlen(latlongstr)+2, 1); int dec; if (!str) goto err; strcpy(str, latlongstr); /* Latitude */ point->Lat = ParseDMS(str, &endstr, &dec); if (isnan(point->Lat) || point->Lat > 90 || point->Lat < -90) goto err; point->LatDecimals = dec; /* Longitude */ point->Long = ParseDMS(endstr, &endstr, &dec); if (isnan(point->Long) || point->Long > 180 || point->Long < -180) goto err; point->LongDecimals = dec; /* Elevation */ if (!*endstr) { /* No elevation given */ point->Elev = 0; point->ElevDecimals = -1; /* default meaning no altitude was found */ } else { errno = 0; /* set by strtod */ point->Elev = strtod(endstr, NULL); if (errno) goto err; point->ElevDecimals = NumDecimals(endstr); } point->Time = 0; point->EndOfSegment = 0; point->Next = NULL; free(str); return 1; err: free(str); return 0; } int ParseLatLong(const char *latlongstr, struct GPSPoint* point) { if (!ParseLatLongDecimal(latlongstr, point)) if (!ParseLatLongDMS(latlongstr, point)) return 0; return 1; } /* Make a track from a single point */ int MakeTrackFromLatLong(const struct GPSPoint* latlong, struct GPSTrack* track) { struct GPSPoint* p1 = (struct GPSPoint*)malloc(sizeof(struct GPSPoint)); struct GPSPoint* p2 = (struct GPSPoint*)malloc(sizeof(struct GPSPoint)); if (!p1 || !p2) { free(p1); free(p2); return 0; } memcpy(p1, latlong, sizeof(*p1)); p1->Time = track->MinTime = 0; p1->Next = p2; memcpy(p2, latlong, sizeof(*p2)); p2->Time = track->MaxTime = INT_MAX; p2->Next = NULL; p2->EndOfSegment = 1; track->Points = p1; return 1; } gpscorrelate-2.0/latlong.h000066400000000000000000000003161355604302400156600ustar00rootroot00000000000000#include int ParseLatLong(const char *latlongstr, struct GPSPoint* point); int MakeTrackFromLatLong(const struct GPSPoint* latlong, struct GPSTrack* track); int NumDecimals(const char *Decimal); gpscorrelate-2.0/main-command.c000066400000000000000000000524271355604302400165650ustar00rootroot00000000000000/* main-command.c * Written by Daniel Foote. * Started Feb 2005. * * Command line program to match GPS data and Photo EXIF timestamps * together, to figure out where you were at the time. * Writes the output back into the GPS exif tags. */ /* Copyright 2005-2019 Daniel Foote, Dan Fandrich. * * This file is part of gpscorrelate. * * gpscorrelate 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. * * gpscorrelate 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 gpscorrelate; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include "i18n.h" #include "gpsstructure.h" #include "exif-gps.h" #include "unixtime.h" #include "gpx-read.h" #include "latlong.h" #include "correlate.h" #define GPS_EXIT_WARNING 2 /* Command line options structure. */ static const struct option program_options[] = { { "gps", required_argument, 0, 'g' }, { "latlong", required_argument, 0, 'l' }, { "timeadd", required_argument, 0, 'z'}, { "no-interpolation", no_argument, 0, 'i'}, { "help", no_argument, 0, 'h'}, { "verbose", no_argument, 0, 'v'}, { "datum", required_argument, 0, 'd'}, { "no-write", no_argument, 0, 'n'}, { "replace", no_argument, 0, 'R'}, { "max-dist", required_argument, 0, 'm'}, { "show", no_argument, 0, 's'}, { "machine", no_argument, 0, 'o'}, { "remove", no_argument, 0, 'r'}, { "ignore-tracksegs", no_argument, 0, 't'}, { "no-mtime", no_argument, 0, 'M'}, { "version", no_argument, 0, 'V'}, { "fix-datestamps", no_argument, 0, 'f'}, { "degmins", no_argument, 0, 'p'}, { "photooffset", required_argument, 0, 'O'}, { 0, 0, 0, 0 } }; /* Function to print the version - near the top for easy modification. */ static void PrintVersion(const char* ProgramName) { printf(_("%s, ver. %s. %s\n"), ProgramName, PACKAGE_VERSION, _("Copyright (C) 2005-2019 Daniel Foote, Dan Fandrich")); } /* Function to print the usage info. */ static void PrintUsage(const char* ProgramName) { printf(_("Usage: %s [options] file.jpg ...\n"), ProgramName); puts( _("-g, --gps file.gpx Specifies GPX file with GPS data")); puts( _("-l, --latlong LAT,LONG[,E] Specifies latitude/longitude/elevation directly")); puts( _("-z, --timeadd +/-HH[:MM] Time to add to GPS data to make it match photos")); puts( _("-i, --no-interpolation Disable interpolation between points; interpolation\n" " is linear, points rounded if disabled")); puts( _("-d, --datum DATUM Specify measurement datum (defaults to WGS-84)")); puts( _("-n, --no-write Do not write the EXIF data. Useful with --verbose")); puts( _("-R, --replace Overwrite any GPS tags already in the image file")); puts( _("-m, --max-dist SECS Max time outside points that photo will be matched")); puts( _("-s, --show Just show the GPS data from the given files")); puts( _("-o, --machine Similar to --show but with machine-readable output")); puts( _("-r, --remove Strip GPS tags from the given files")); puts( _("-t, --ignore-tracksegs Interpolate between track segments, too")); puts( _("-M, --no-mtime Don't change mtime of modified files")); puts( _("-f, --fix-datestamps Fix broken GPS datestamps written with ver. < 1.5.2")); puts( _(" --degmins Write location as DD MM.MM (was default before v1.5.3)")); puts( _("-O, --photooffset SECS Offset added to photo time to make it match the GPS")); puts( _("-h, --help Display this help message")); puts( _("-v, --verbose Show more detailed output")); puts( _("-V, --version Display version information")); } /* CSV escape a string by doubling quotation marks. * A pointer to a malloced string is returned which must be freed by the caller. */ static char *CsvEscape(const char *str) { char *newstr = (char*)malloc(strlen(str)*2+1); // worst-case size char *cpy = newstr; if (!newstr) return newstr; do { *cpy = *str; if (*cpy++ == '"') *cpy++ = '"'; } while (*str++); return newstr; } /* Display the information from an existing file. */ static int ShowFileDetails(const char* File, int MachineReadable) { double Lat, Long, Elev; int IncludesGPS = 0; Lat = Long = 0; Elev = NAN; /* Elevation is optional, so this means it's missing */ char* Time = ReadExifData(File, &Lat, &Long, &Elev, &IncludesGPS); int rc = 1; char* OldLocale = NULL; if (MachineReadable) { OldLocale = setlocale(LC_NUMERIC, "C"); } if (Time) { if (IncludesGPS) { /* Display the data as CSV if we want * it machine readable. */ if (MachineReadable) { char *EscapedFile = CsvEscape(File); if (!EscapedFile) { fprintf(stderr, _("Out of memory.\n")); exit(EXIT_FAILURE); } printf("\"%s\",\"%s\",%f,%f,", EscapedFile, Time, Lat, Long); if (!isnan(Elev)) printf("%.3f", Elev); printf("\n"); free(EscapedFile); } else { printf(_("%s: %s, Lat %f, Long %f, Elevation "), File, Time, Lat, Long); if (!isnan(Elev)) printf("%.3f", Elev); else printf(_("(unknown)")); printf(".\n"); } } else { /* Don't display anything if we want machine * readable data and there is no data. */ if (!MachineReadable) { printf(_("%s: %s, No GPS Data.\n"), File, Time); } } } else { /* Say that there was no data & return error, except if we want * machine readable output */ if (!MachineReadable) { printf(_("%s: No EXIF data.\n"), File); rc = 0; } } free(Time); if (MachineReadable) { setlocale(LC_NUMERIC, OldLocale); } return rc; } /* Remove all GPS exif tags from a file. Not really that useful, but... */ static int RemoveGPSTags(const char* File, int NoChangeMtime, int NoWriteExif) { if (RemoveGPSExif(File, NoChangeMtime, NoWriteExif)) { printf(_("%s: Removed GPS tags.\n"), File); return 1; } else { printf(_("%s: Tag removal failure.\n"), File); return 0; } } /* Fix GPSDatestamp tags, if they were incorrect, as found with versions * earlier than 1.5.2. */ static int FixDatestamp(const char* File, int AdjustmentHours, int AdjustmentMinutes, int NoWriteExif) { /* Read the timestamp data. */ char DateStamp[12]; char TimeStamp[12]; char CombinedTime[24]; int IncludesGPS = 0; char* OriginalDateStamp = NULL; int rc = 1; OriginalDateStamp = ReadGPSTimestamp(File, DateStamp, TimeStamp, &IncludesGPS); if (OriginalDateStamp == NULL) { printf(_("%s: No EXIF data.\n"), File); rc = 0; } else if (IncludesGPS == 0) { printf(_("%s: No GPS data.\n"), File); rc = 0; } else { /* Check the timestamp. */ time_t PhotoTime = ConvertToUnixTime(OriginalDateStamp, EXIF_DATE_FORMAT, AdjustmentHours, AdjustmentMinutes); snprintf(CombinedTime, sizeof(CombinedTime), "%s %s", DateStamp, TimeStamp); time_t GPSTime = ConvertToUnixTime(CombinedTime, EXIF_DATE_FORMAT, 0, 0); if (PhotoTime != GPSTime) { /* Timestamp is wrong. Fix it. * Should be photo time - this also corrects * GPSTimestamp, which was wrong too. */ if (!NoWriteExif) { rc = WriteFixedDatestamp(File, PhotoTime); } char PhotoTimeFormat[100]; char GPSTimeFormat[100]; strftime(PhotoTimeFormat, sizeof(PhotoTimeFormat), "%a %b %d %H:%M:%S %Y UTC", gmtime(&PhotoTime)); strftime(GPSTimeFormat, sizeof(GPSTimeFormat), "%a %b %d %H:%M:%S %Y UTC", gmtime(&GPSTime)); printf(_("%s: Wrong timestamp:\n Photo: %s\n" " GPS: %s\n Corrected: %s\n"), File, PhotoTimeFormat, GPSTimeFormat, PhotoTimeFormat); } else { /* Inside the range. Do nothing! */ printf(_("%s: Timestamp is OK: Photo %s (localtime), GPS %s (UTC).\n"), File, OriginalDateStamp, CombinedTime); } } free(OriginalDateStamp); return rc; } int main(int argc, char** argv) { /* Initialize locale & gettext */ setlocale (LC_ALL, ""); (void) bindtextdomain(TEXTDOMAIN, PACKAGE_LOCALE_DIR); (void) textdomain(TEXTDOMAIN); /* If you didn't pass any arguments... */ if (argc == 1) { PrintVersion(argv[0]); PrintUsage(argv[0]); exit(EXIT_SUCCESS); } /* Parse our command line options. */ /* But first, some variables to store stuff in. */ int c; struct GPSTrack* Track = NULL;/* Array of lists of GPS waypoints. The final entry of all 0 signals the end. */ int NumTracks = 0; /* Number of track structures at Track, not including the terminating entry. */ int HaveTimeAdjustment = 0; /* Whether -z option was given. */ int TimeZoneHours = 0; /* Integer version of the timezone. */ int TimeZoneMins = 0; char* Datum = NULL; /* Datum of input GPS data. */ int Interpolate = 1; /* Do we interpolate? By default, yes. */ int NoWriteExif = 0; /* Do we not write to file? By default, no. */ int OverwriteExisting = 0; /* Do we overwrite existing tags? By default, no */ int ShowDetails = 0; /* Do we show lots of details? By default, no. */ int FeatherTime = 0; /* The "feather" time, in seconds. 0 = disabled. */ int ShowOnlyDetails = 0; int MachineReadable = 0; int RemoveTags = 0; int DoBetweenTrackSegs = 0; int NoChangeMtime = 0; int FixDatestamps = 0; int DegMinSecs = 1; int PhotoOffset = 0; struct GPSPoint LatLong; /* Create the empty terminating array entry */ Track = (struct GPSTrack*) calloc(1, sizeof(*Track)); if (!Track) { fprintf(stderr, _("Out of memory.\n")); exit(EXIT_FAILURE); } while (1) { /* Call getopt to do all the hard work * for us... */ c = getopt_long(argc, argv, "g:z:il:hvd:m:nsortRMVfO:", program_options, 0); if (c == -1) break; /* Determine what getopt saw. */ switch (c) { case 'g': /* This parameter specifies the GPS data. * It or 'l' must be present at least once. */ if (optarg) { int HaveTrack; /* Read the XML file into memory and extract the "points". */ printf(_("Reading GPS Data...")); fflush(stdout); HaveTrack = ReadGPX(optarg, &Track[NumTracks]); printf("\n"); if (!HaveTrack) { exit(EXIT_FAILURE); } /* Make room for a new end-of-array entry */ ++NumTracks; Track = (struct GPSTrack*) realloc(Track, sizeof(*Track)*(NumTracks+1)); if (!Track) { fprintf(stderr, _("Out of memory.\n")); exit(EXIT_FAILURE); } memset(&Track[NumTracks], 0, sizeof(*Track)); } break; case 'l': /* This parameter specifies a direct latitude/longitude coordinate to use for all images. It or 'g' must be present at least once. */ if (!ParseLatLong(optarg, &LatLong)) { printf(_("Error parsing location.\n")); exit(EXIT_FAILURE); } if (!MakeTrackFromLatLong(&LatLong, &Track[NumTracks])) { printf(_("Out of memory\n")); exit(EXIT_FAILURE); } /* Make room for a new end-of-array entry */ ++NumTracks; Track = (struct GPSTrack*) realloc(Track, sizeof(*Track)*(NumTracks+1)); if (!Track) { printf(_("Out of memory\n")); exit(EXIT_FAILURE); } memset(&Track[NumTracks], 0, sizeof(*Track)); break; case 'z': /* This parameter specifies the time to add to the * GPS data to make it match the timezone for * the photos. */ /* We only store it here, convert it to numbers later. */ if (optarg) { /* Break up the adjustment and convert to numbers. */ if (strstr(optarg, ":")) { /* Found colon. Split into two. */ sscanf(optarg, "%d:%d", &TimeZoneHours, &TimeZoneMins); if (TimeZoneHours < 0) TimeZoneMins *= -1; } else { /* No colon. Just parse. */ TimeZoneHours = atoi(optarg); } HaveTimeAdjustment = 1; } break; case 'O': if (optarg) { PhotoOffset = atoi(optarg); } break; case 'i': /* This option disables interpolation. */ Interpolate = 0; break; case 'v': /* This option asks us to show more info. */ PrintVersion(argv[0]); ShowDetails = 1; break; case 'd': /* This option specifies a Datum, if other than WGS-84. */ if (optarg) { Datum = strdup(optarg); } break; case 'n': /* This option specifies not to write to file. */ NoWriteExif = 1; break; case 'R': /* This option specifies to overwrite existing GPS tags. */ OverwriteExisting = 1; break; case 'm': /* This option gives us the allowable "feather" time. */ if (optarg) { FeatherTime = atoi(optarg); } break; case 'h': /* Display the help/usage information. And then quit. */ PrintUsage(argv[0]); exit(EXIT_SUCCESS); break; case 'V': /* Display version information, and then quit. */ PrintVersion(argv[0]); printf(_("This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n")); exit(EXIT_SUCCESS); break; case 'f': /* Fix Datestamps. */ FixDatestamps = 1; break; case 's': /* Show the data in the photos. Mark this. */ ShowOnlyDetails = 1; break; case 'o': /* Show the data in the photos, machine readable. */ ShowOnlyDetails = 1; MachineReadable = 1; break; case 'r': /* Remove GPS tags from the file. Mark this. */ RemoveTags = 1; break; case 't': /* Interpolate between track segments. */ DoBetweenTrackSegs = 1; break; case 'M': NoChangeMtime = 1; break; case 'p': /* Write in old DegMins format. */ DegMinSecs = 0; break; case '?': /* Unrecognised option. Or, missing argument. */ /* The user has already been informed, so just exit. */ exit(EXIT_FAILURE); break; default: /* Unrecognised code that getopt returned anyway. * Oops... */ break; } /* End switch(c) */ } /* End While(1) */ /* Check to see if the user passed some files to work with. Not much * good if they didn't. */ if (optind < argc) { /* You passed some files. Handy! */ } else { /* Hmm. It seems there were no other files... that doesn't work. */ fprintf(stderr, _("At least one image file name must be given.\n")); exit(EXIT_FAILURE); } /* If we only wanted to display info on the passed photos, do so now. */ if (ShowOnlyDetails) { int result = 1; while (optind < argc) { result = ShowFileDetails(argv[optind++], MachineReadable) && result; } exit(result ? EXIT_SUCCESS : EXIT_FAILURE); } /* If we wanted to delete tags, do this now. */ if (RemoveTags) { int result = 1; while (optind < argc) { result = RemoveGPSTags(argv[optind++], NoChangeMtime, NoWriteExif) && result; } exit(result ? EXIT_SUCCESS : EXIT_FAILURE); } /* If we wanted to fix datestamps, do this now. * This is to fix incorrect GPSDateStamp values written by versions * earlier than 1.5.2. */ if (FixDatestamps) { if (!HaveTimeAdjustment) { fprintf(stderr, _("A time offset must be given with the -z option to fix photos.\n")); exit(EXIT_FAILURE); } int result = 1; while (optind < argc) { result = FixDatestamp(argv[optind++], TimeZoneHours, TimeZoneMins, NoWriteExif) && result; } exit(result ? EXIT_SUCCESS : EXIT_FAILURE); } /* Set up any other command line options... */ if (!Datum) { Datum = strdup("WGS-84"); } if (!NumTracks) { /* GPS Data was not read correctly... */ /* Tell the user we are bailing. * Not really required, seeing as ReadGPX should * inform the user anyway... but, doesn't hurt! */ fprintf(stderr, _("Cannot continue since no GPS data is available.\n")); exit(EXIT_FAILURE); } /* Print a legend for the matching process. * If we're not being verbose. Otherwise, this would be pointless. */ if (!ShowDetails) { printf(_("Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far\n" " w = Write Fail, ? = No EXIF date, ! = GPS already present\n")); } /* Set up our options structure for the correlation function. */ struct CorrelateOptions Options; Options.NoWriteExif = NoWriteExif; Options.OverwriteExisting = OverwriteExisting; Options.NoInterpolate = (Interpolate ? 0 : 1); Options.AutoTimeZone = !HaveTimeAdjustment; Options.TimeZoneHours = TimeZoneHours; Options.TimeZoneMins = TimeZoneMins; Options.FeatherTime = FeatherTime; Options.Datum = Datum; Options.DoBetweenTrkSeg = DoBetweenTrackSegs; Options.NoChangeMtime = NoChangeMtime; Options.DegMinSecs = DegMinSecs; Options.PhotoOffset = PhotoOffset; Options.Track = Track; /* Make it all look nice and pretty... so the user knows what's going on. */ printf(_("\nCorrelate: ")); if (ShowDetails) printf("\n"); /* A few variables that we'll require later. */ struct GPSPoint* Result; char* File; /* Including stats on what happened. */ int MatchExact = 0; int MatchInter = 0; int MatchRound = 0; int NotMatched = 0; int WriteFail = 0; int TooFar = 0; int NoDate = 0; int GPSPresent = 0; /* Now it is time to correlate the photos. Feed one in at a time, and * see what happens.*/ /* We already checked to make sure that files were passed on the * command line, so just go for it... */ /* printf("Remaining non-option arguments: %d.\n", argc - optind); */ while (optind < argc) { File = argv[optind++]; /* Pass the file along to Correlate and see what happens. */ Result = CorrelatePhoto(File, &Options); /* Was result NULL? */ if (Result) { /* Result not null. But what did happen? */ if (Options.Result == CORR_OK) { MatchExact++; if (ShowDetails) { printf(_("%s: Exact match: "), File); } else { printf("."); } } if (Options.Result == CORR_INTERPOLATED) { MatchInter++; if (ShowDetails) { printf(_("%s: Interpolated: "), File); } else { printf("/"); } } if (Options.Result == CORR_ROUND) { MatchRound++; if (ShowDetails) { printf(_("%s: Rounded: "), File); } else { printf("<"); } } if (Options.Result == CORR_EXIFWRITEFAIL) { WriteFail++; if (ShowDetails) { printf(_("%s: EXIF write failure: "), File); } else { printf("w"); } } if (ShowDetails) { /* Print out the "point". */ printf(_("Lat %f, Long %f, Elev "), Result->Lat, Result->Long); if (Result->ElevDecimals >=0) printf("%.3f.\n", Result->Elev); else printf(_("(unknown).\n")); } free(Result); /* Ok, that's all from this part... */ } else { /* We got nothing back. One of a few errors. */ if (Options.Result == CORR_NOMATCH) { NotMatched++; if (ShowDetails) { printf(_("%s: No match.\n"), File); } else { printf("-"); } } if (Options.Result == CORR_TOOFAR) { TooFar++; if (ShowDetails) { printf(_("%s: Too far from nearest point.\n"), File); } else { printf("^"); } } if (Options.Result == CORR_NOEXIFINPUT) { NoDate++; if (ShowDetails) { printf(_("%s: No EXIF date tag present.\n"), File); } else { printf("?"); } } if (Options.Result == CORR_GPSDATAEXISTS) { GPSPresent++; if (ShowDetails) { printf(_("%s: GPS Data already present.\n"), File); } else { printf("!"); } } /* Handled all those errors, now... */ } /* End if Result. */ /* Display the character code immediately */ fflush(stdout); /* And, once we've got here, we've finished with that file. * We can now do the next one. Now wasn't that too easy? */ } /* End while parse command line files. */ /* Right, so now we're done. That really wasn't that hard. Right? */ /* Add a new line if we were doing the not-show-details thing. */ if (!ShowDetails) { printf("\n"); } /* Print details of what happened. */ printf(_("\nCompleted correlation process.\n")); if (ShowDetails) /* This has to be shown at the end in case auto time zone * was used, since it isn't known before the first file * is processed. */ printf(_("Used time zone offset %d:%02d\n"), Options.TimeZoneHours, abs(Options.TimeZoneMins)); printf(_("Matched: %5d (%d Exact, %d Interpolated, %d Rounded).\n"), MatchExact + MatchInter + MatchRound, MatchExact, MatchInter, MatchRound); printf(_("Failed: %5d (%d Not matched, %d Write failure, %d Too Far,\n"), NotMatched + WriteFail + TooFar + NoDate + GPSPresent, NotMatched, WriteFail, TooFar); printf(_(" %d No Date, %d GPS Already Present.)\n"), NoDate, GPSPresent); /* Clean up! */ while (NumTracks > 0) { --NumTracks; FreeTrack(&Track[NumTracks]); } free(Track); free(Datum); if (WriteFail) /* A write failure is considered serious */ return EXIT_FAILURE; /* Other failures aren't necessarily bad, depending on the input, * so provide a different return code to distinguish them. */ return(NotMatched + TooFar + NoDate + GPSPresent ? GPS_EXIT_WARNING : EXIT_SUCCESS); } gpscorrelate-2.0/main-gui.c000066400000000000000000000035101355604302400157200ustar00rootroot00000000000000/* main-gui.c * Written by Daniel Foote. * Started Feb 2005. * * GTK GUI program to correlate photos with GPS data. * Uses common parts of a command line version of the same. * Just this time, with a pretty GUI to make it all simple and easy. */ /* Although I did not start out with a clear idea of the contents * of this file, I had thought it would be a little more than a "stub" * to get the GUI up and running. However, this seems to work for me! * All the action really happens in gui.c. */ /* Copyright 2005-2019 Daniel Foote, Dan Fandrich. * * This file is part of gpscorrelate. * * gpscorrelate 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. * * gpscorrelate 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 gpscorrelate; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include "i18n.h" #include "gui.h" int main(int argc, char* argv[]) { /* Initialize gettext (gtk_init initializes the locale) */ (void) bindtextdomain(TEXTDOMAIN, PACKAGE_LOCALE_DIR); (void) textdomain(TEXTDOMAIN); (void) bind_textdomain_codeset(TEXTDOMAIN, "UTF-8"); /* Get GTK ready, as appropriate. * (We ignore passed parameters) */ gtk_init(&argc, &argv); /* Create and show the window. */ CreateMatchWindow(); /* Start the main loop. And we're off! */ gtk_main(); return 0; } gpscorrelate-2.0/po/000077500000000000000000000000001355604302400144655ustar00rootroot00000000000000gpscorrelate-2.0/po/Makefile000066400000000000000000000440731355604302400161350ustar00rootroot00000000000000# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.18.2 GETTEXT_MACRO_VERSION = 0.18 # # Modified by Dan Fandrich to be independent of GNU autoconf, at the price of # requiring GNU make to run. PACKAGE = gpscorrelate VERSION = PACKAGE_BUGREPORT = SHELL = /bin/sh srcdir = . top_srcdir = .. prefix = /usr/local exec_prefix = ${prefix} datarootdir = ${prefix}/share datadir = ${datarootdir} localedir = ${datarootdir}/locale gettextsrcdir = $(datadir)/gettext/po INSTALL = install -c INSTALL_DATA = ${INSTALL} -m 644 # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # ${SHELL} ./install-sh does not start with $(SHELL), so we add it. # In automake >= 1.10, /bin/mkdir -p is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) ${SHELL} $(srcdir)/install-sh -d install_sh = $(SHELL) ${SHELL} $(srcdir)/install-sh MKDIR_P = mkdir -p mkdir_p = $(MKDIR_P) GMSGFMT = msgfmt MSGFMT = msgfmt XGETTEXT = xgettext MSGMERGE = msgmerge MSGMERGE_UPDATE = $(MSGMERGE) --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter # These functions are available in GNU make ALL_LINGUAS = $(patsubst %.po,%,$(notdir $(wildcard $(srcdir)/*.po))) POFILES = $(patsubst %,%.po,$(ALL_LINGUAS)) GMOFILES = $(patsubst %,%.gmo,$(ALL_LINGUAS)) UPDATEPOFILES = $(patsubst %,%.po-update,$(ALL_LINGUAS)) DUMMYPOFILES = $(patsubst %,%.nop,$(ALL_LINGUAS)) DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = $(patsubst %,$(top_srcdir)/,$(shell cat POTFILES.in)) CATALOGS = $(patsubst %,%.gmo,$(ALL_LINGUAS)) # Makevars gets inserted here. (Don't remove this line!) include $(srcdir)/Makevars .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: all-yes all-yes: stamp-po all-no: # Ensure that the gettext macros and this Makefile.in.in are in sync. CHECK_MACRO_VERSION = \ test "$(GETTEXT_MACRO_VERSION)" = "0.18" \ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version 0.18" 1>&2; \ exit 1; \ } # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot @$(CHECK_MACRO_VERSION) test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. # The determination of whether the package xyz is a GNU one is based on the # heuristic whether some file in the top level directory mentions "GNU xyz". # If GNU 'find' is available, we avoid grepping through monster files. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if { if (LC_ALL=C find --version) 2>/dev/null | grep GNU >/dev/null; then \ LC_ALL=C find -L $(top_srcdir) -maxdepth 1 -type f -size -10000000c -exec grep 'GNU gpscorrelate' /dev/null '{}' ';' 2>/dev/null; \ else \ LC_ALL=C grep 'GNU gpscorrelate' $(top_srcdir)/* 2>/dev/null; \ fi; \ } | grep -v 'libtool:' >/dev/null; then \ package_gnu='GNU '; \ else \ package_gnu=''; \ fi; \ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --package-name="$${package_gnu}gpscorrelate" \ --package-version=$(VERSION) \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ esac test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) \ && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \ *) \ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \ esac; \ }; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-yes if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-yes if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-yes if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ *) \ $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ esac; \ }; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: # Recreate Makefile by invoking config.status. Explicitly invoke the shell, # because execution permission bits may not work on the current file system. # Use /bin/sh, which is the shell determined by autoconf for the use by its # scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient. #Makefile: Makefile.in.in Makevars $(top_builddir)/config.status POTFILES.in # cd $(top_builddir) \ # && /bin/sh ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header gpscorrelate-2.0/po/Makevars000066400000000000000000000034651355604302400161710ustar00rootroot00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = gpscorrelate # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ --from-code=utf-8 # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Daniel Foote, Dan Fandrich # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = dan@coneharvesters.com # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = gpscorrelate-2.0/po/POTFILES.in000066400000000000000000000000401355604302400162340ustar00rootroot00000000000000gpx-read.c gui.c main-command.c gpscorrelate-2.0/po/de.po000066400000000000000000000462201355604302400154210ustar00rootroot00000000000000# Translation template for gpscorrelate # Copyright (C) 2005-2019 Daniel Foote, Dan Fandrich # This file is distributed under the same license as the gpscorrelate package. # Dan Fandrich , 2013. # #: gui.c:1594 msgid "" msgstr "" "Project-Id-Version: gpscorrelate 2.0\n" "Report-Msgid-Bugs-To: dan@coneharvesters.com\n" "POT-Creation-Date: 2019-10-23 23:01+0200\n" "PO-Revision-Date: 2018-07-21 14:20+0200\n" "Last-Translator: Dan Fandrich \n" "Language-Team: deutsch\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gpx-read.c:229 #, c-format msgid "Failed to parse GPX data from %s.\n" msgstr "Analyse der GPX-Daten von %s fehlgeschlagen.\n" #: gpx-read.c:240 #, c-format msgid "Invalid GPX file has no root.\n" msgstr "Ungültige GPX-Datei hat keine Wurzel.\n" #: gpx-read.c:253 #, c-format msgid "Invalid GPX file.\n" msgstr "Ungültige GPX-Datei.\n" #: gui.c:266 #, c-format msgid "GPS Photo Correlate %s" msgstr "GPS Foto korrelieren %s" #: gui.c:296 msgid "Add..." msgstr "Hinzufügen…" #: gui.c:300 gui.c:302 msgid "Add photos to be correlated." msgstr "Fotos zum korrelieren hinzufügen." #: gui.c:307 msgid "Remove" msgstr "Entfernen" #: gui.c:311 gui.c:313 msgid "Remove selected photos from the list." msgstr "Die ausgewählten Fotos aus der Liste entfernen." #: gui.c:318 msgid "1. Add Photos" msgstr "1. Fotos hinzufügen" #: gui.c:337 gui.c:1302 #, c-format msgid "Read from: No file" msgstr "Gelesen aus: Keine Datei" #: gui.c:344 msgid "Choose..." msgstr "Auswählen…" #: gui.c:349 gui.c:353 msgid "" "Choose GPX file from which to read GPS data. If the GPS data is not in the " "GPX format, use a converter like GPSBabel to convert it to GPX first." msgstr "" "Wähle eine GPX-Datei, aus der die GPS-Daten gelesen werden sollen. Wenn die " "GPS-Daten nicht im GPX-Format sind, benutze ein Konverter wie z.B. GPSBabel, " "um sie ins GPX-Format zu konvertieren." #: gui.c:359 msgid "2. GPS Data" msgstr "2. GPS-Daten" #: gui.c:378 msgid "Interpolate" msgstr "Interpolieren" #: gui.c:383 gui.c:387 msgid "" "Interpolate between points. If disabled, points will be rounded to the " "nearest recorded point." msgstr "" "Interpolieren zwischen Punkten. Falls es deaktiviert ist, werden die Punkte " "auf dem nächsten aufgenommenen Punkt gerundet." #: gui.c:392 msgid "Don't write" msgstr "Nicht schreiben" #: gui.c:397 gui.c:401 msgid "" "Don't write EXIF data back to the photos. This is useful for testing the " "settings without modifying the photos." msgstr "" "Die EXIF-Daten nicht in die Fotos schreiben. Hiermit kann man die Auswirkung " "von Einstellungen testen, ohne die Fotos zu ändern." #: gui.c:406 msgid "Replace existing tags" msgstr "Existierende GPS-Metadaten ersetzen" #: gui.c:410 gui.c:412 msgid "Replace any existing GPS tags in the photos." msgstr "Existierende GPS-Metadaten in den Fotos ersetzen." #: gui.c:416 msgid "Don't change mtime" msgstr "Änderungsdatum nicht ändern" #: gui.c:421 gui.c:424 msgid "Don't change file modification time of the photos." msgstr "Änderungsdatum der Fotos nicht ändern." #: gui.c:428 msgid "Between Segments" msgstr "Zwischen Segmente" #: gui.c:433 gui.c:438 msgid "" "Interpolate between track segments. Generally the data is segmented to show " "where location data was available and not available, but you might still " "want to interpolate between segments." msgstr "" "Zwischen Track-Segmente interpolieren. Normalerweise sind die Daten in " "Segmente aufgeteiltund zeigen, wo GPS-Daten verfügbar waren und wo nicht. " "Man kann auch zwischen den Segmenten interpolieren." #: gui.c:444 msgid "Write DD MM SS.SS" msgstr "Schreibe GG MM SS.SS" #: gui.c:449 gui.c:454 msgid "" "Write the latitude and longitude values as DD MM SS.SS; this is the new " "default. The old behaviour was to write it as DD MM.MM, which will occur if " "you uncheck this box." msgstr "" "Breitengrad und Längengrad werden per Default als GG MM SS.SS geschrieben. " "Wenn diese Einstellung deaktiviert wird, werden sie im Format GG MM.MM " "geschrieben, welches in früheren Versionen verwendet wurde." #: gui.c:460 msgid "Auto time zone" msgstr "Automatische Zeitzone" #: gui.c:465 gui.c:468 msgid "Assume the camera time zone is the same as the local time zone." msgstr "" "Nehme an, dass die Kamerazeitzone dieselbe ist wie die lokale Zeitzone." #: gui.c:479 msgid "Max gap time:" msgstr "Max. Zeitlücke:" #: gui.c:486 msgid "Time Zone:" msgstr "Zeitzone:" #: gui.c:493 msgid "Photo Offset:" msgstr "Zeitverschiebung des Fotos:" #: gui.c:500 msgid "GPS Datum:" msgstr "GPS Datum:" #: gui.c:514 gui.c:520 msgid "" "Maximum time \"away\" from a point that the photo can be taken yet still " "match, in seconds. If a photo's time is outside this value (from both points " "on either side), the location will not match." msgstr "" "Maximale Zeitlücke (in Sekunden) außer einem Punkt, in dem das Foto gemacht " "werden kann und dennoch übereinstimmen kann. Wenn der Zeitversatz eines " "Fotozeites (von beiden Punkte auf jeder Seite) höher ist, wird es nicht " "übereinstimmen." #: gui.c:535 gui.c:541 msgid "" "The timezone that the camera's time was set to when the photos were taken. " "For example, if a camera is set to AWST or +8:00 hours from UTC, enter +8:00 " "here so that the correct adjustment to the photo's time can be made. GPS " "data is always in UTC." msgstr "" "Die festgelegte Zeitzone der Kamera, als die Fotos gemacht wurden. Zum " "Beispiel, wenn eine Kamera in CEST oder +2:00 Stunden vom UTC festgelegt " "ist, gebe hier +2:00 ein, so dass die richtige Justierung gemacht werden " "kann. GPS-Daten sind immer in UTC." #: gui.c:561 gui.c:566 msgid "" "The number of seconds to add to the photo's time to make it match the GPS " "data. Calculate this with (GPS - Photo). Can be negative or positive." msgstr "" "Die Sekundenanzahl, die zur Fotozeit addiert werden muss, damit es mit den " "GPS-Daten übereinstimmt. Rechne es als (GPS-Zeit - Fotozeit). Es kann " "negativ oder positiv sein." #: gui.c:580 gui.c:584 msgid "" "The datum used for the GPS data. This text here is recorded in the EXIF tags " "as the source datum. WGS-84 is very commonly used." msgstr "" "Das Datum, dass als GPS-Datum benutzt worden ist. Dieser Text wird als das " "Quelldatum in den EXIF-Felder aufgenommen. WGS-84 wird sehr häufig benutzt." #: gui.c:590 msgid "3. Set options" msgstr "3. Einstellungen festlegen" #: gui.c:605 msgid "Correlate Photos" msgstr "Fotos korrelieren" #: gui.c:610 gui.c:614 msgid "" "Begin the correlation process, writing back into the photos' EXIF tags " "(unless Don't write is selected)." msgstr "" "Korrelation beginnen. Die EXIF-Felder der Fotos werden geändert, außer wenn " "„Nicht schreiben“ ausgewählt ist." #: gui.c:620 msgid "4. Correlate!" msgstr "4. Korrelieren" #: gui.c:639 msgid "Strip GPS tags" msgstr "GPS-Metadaten entfernen" #: gui.c:644 gui.c:647 msgid "Strip GPS tags from the selected photos." msgstr "GPS-Metadaten aus den ausgewählten Fotos entfernen." #: gui.c:652 msgid "Help" msgstr "Hilfe" #: gui.c:657 gui.c:660 msgid "View help for this application." msgstr "Hilfe zu dieser Anwendung anzeigen." #: gui.c:665 msgid "About" msgstr "Über" #: gui.c:670 gui.c:673 msgid "Show information about the program." msgstr "Informationen über dieses Programm anzeigen." #: gui.c:678 msgid "Other Tools" msgstr "Extras" #: gui.c:714 msgid "File" msgstr "Datei" #: gui.c:721 msgid "Latitude" msgstr "Breitengrad" #: gui.c:728 msgid "Longitude" msgstr "Längengrad" #: gui.c:735 msgid "Elevation" msgstr "Höhe" #: gui.c:742 msgid "Time" msgstr "Zeit" #: gui.c:749 msgid "State" msgstr "Status" #: gui.c:842 msgid "Add Photos..." msgstr "Fotos hinzufügen…" #: gui.c:855 msgid "JPEG images" msgstr "JPEG-Bilder" #: gui.c:861 gui.c:1209 msgid "All files" msgstr "Alle Dateien" #: gui.c:952 gui.c:1119 msgid "No EXIF data" msgstr "Keine EXIF-Daten" #: gui.c:1124 msgid "GPS Data Present" msgstr "GPS-Daten sind vorhanden" #: gui.c:1132 msgid "S" msgstr "S" #: gui.c:1132 msgid "N" msgstr "N" #: gui.c:1140 msgid "W" msgstr "W" #: gui.c:1140 msgid "E" msgstr "O" #: gui.c:1147 msgid "m" msgstr "m" #: gui.c:1153 msgid "Ready" msgstr "Bereit" #: gui.c:1190 msgid "Select GPS Data..." msgstr "GPS-Daten wählen…" #: gui.c:1203 msgid "GPX files" msgstr "GPX-Dateien" #: gui.c:1233 msgid "Loading GPS data from file... Won't be a moment..." msgstr "GPS-Daten werden aus den Dateien gelesen. Bitte warten…" #: gui.c:1259 msgid "multiple files" msgstr "mehrere Dateien" #: gui.c:1297 #, c-format msgid "Read from: %s" msgstr "Gelesen aus: %s" #: gui.c:1309 #, c-format msgid "Unable to read file %s for some reason. Please try again." msgstr "Fehler beim Lesen der Datei %s. Versuche es bitte noch einmal." #: gui.c:1352 msgid "No photos selected to match! Please use Add to add photos first!" msgstr "Keine Fotos zur Übereinstimmung ausgewählt. Zuerst Fotos hinzufügen." #: gui.c:1365 msgid "No GPS data loaded! Please select a GPX file to read GPS data from." msgstr "" "Keine GPS-Daten geladen. Wähle einen GPX-Datei, woraus GPS-Daten gelesen " "werden können." #: gui.c:1429 msgid "Internal error" msgstr "Interner Fehler" #: gui.c:1434 msgid "Correlating..." msgstr "Korrelieren…" #: gui.c:1457 msgid "Exact Match" msgstr "Exakte Übereinstimmung" #: gui.c:1461 msgid "Interpolated Match" msgstr "Interpolierte Übereinstimmung" #: gui.c:1465 msgid "Rounded Match" msgstr "Gerundeter Übereinstimmung" #: gui.c:1469 msgid "Write Failure" msgstr "Fehler beim Schreiben" #: gui.c:1483 msgid "Data Already Present" msgstr "Daten bereits vorhanden" #: gui.c:1490 msgid "No Match" msgstr "Keine Übereinstimmung" #: gui.c:1494 msgid "Too far" msgstr "Zu weit" #: gui.c:1498 msgid "No data" msgstr "Keine Daten" #: gui.c:1553 msgid "Stripping..." msgstr "Entfernen…" #: gui.c:1570 msgid "Error Stripping" msgstr "Fehler beim Entfernen" #: gui.c:1629 msgid "GPS Correlate attaches EXIF GPS location tags to images." msgstr "GPS Correlate fügt Bildern EXIF GPS-Standort-Metadaten bei." #: gui.c:1631 msgid "Copyright © 2005-2019 Daniel Foote, Dan Fandrich" msgstr "Copyright © 2005-2019 Daniel Foote, Dan Fandrich" #: main-command.c:74 #, c-format msgid "%s, ver. %s. %s\n" msgstr "%s, Ver. %s. %s\n" #: main-command.c:76 msgid "Copyright (C) 2005-2019 Daniel Foote, Dan Fandrich" msgstr "Copyright © 2005-2019 Daniel Foote, Dan Fandrich" #: main-command.c:82 #, c-format msgid "Usage: %s [options] file.jpg ...\n" msgstr "Aufruf: %s [Optionen] Datei.jpg ...\n" #: main-command.c:83 msgid "-g, --gps file.gpx Specifies GPX file with GPS data" msgstr "-g, --gps datei.gpx Gibt GPX-Datei mit GPS-Daten an" #: main-command.c:84 msgid "" "-l, --latlong LAT,LONG[,E] Specifies latitude/longitude/elevation directly" msgstr "" "-l, --latlong Breit.,Läng.[,Höhe] Gibt Breitengrad/Längengrad/Höhe direkt an" #: main-command.c:85 msgid "" "-z, --timeadd +/-HH[:MM] Time to add to GPS data to make it match photos" msgstr "" "-z, --timeadd +/-HH[:MM] Zeit, dass zu den GPS-Daten addiert werden muss,\n" " um mit den Fotos zu übereinstimmen" #: main-command.c:86 msgid "" "-i, --no-interpolation Disable interpolation between points; " "interpolation\n" " is linear, points rounded if disabled" msgstr "" "-i, --no-interpolation Deaktiviere Interpolation zwischen Punkte;\n" " Interpolation ist linear, Punkte werden geerundet " "wenn\n" " deaktiviert" #: main-command.c:88 msgid "-d, --datum DATUM Specify measurement datum (defaults to WGS-84)" msgstr "-d, --datum DATUM Gibt GPS Datum an (Standard ist WGS-84)" #: main-command.c:89 msgid "" "-n, --no-write Do not write the EXIF data. Useful with --verbose" msgstr "" "-n, --no-write Nicht die EXIF-Daten schreiben. Nützlich mit --" "verbose" #: main-command.c:90 msgid "" "-R, --replace Overwrite any GPS tags already in the image file" msgstr "" "-R, --replace Existierende GPS-Metadaten in Dateien überschreiben" #: main-command.c:91 msgid "" "-m, --max-dist SECS Max time outside points that photo will be matched" msgstr "" "-m, --max-dist SEK Max. Zeitlücke außer den Punkten, dass\n" " übereingestimmt wird" #: main-command.c:92 msgid "-s, --show Just show the GPS data from the given files" msgstr "" "-s, --show Nur GPS-Daten aus den angegebenen Dateien zeigen" #: main-command.c:93 msgid "" "-o, --machine Similar to --show but with machine-readable output" msgstr "" "-o, --machine Ähnlich zu --show aber mit maschinenlesbare Ausgabe" #: main-command.c:94 msgid "-r, --remove Strip GPS tags from the given files" msgstr "" "-r, --remove GPS-Metadaten aus den angegebenen Dateien entfernen" #: main-command.c:95 msgid "-t, --ignore-tracksegs Interpolate between track segments, too" msgstr "-t, --ignore-tracksegs Interpolieren auch Zwischen Track-Segmente" #: main-command.c:96 msgid "-M, --no-mtime Don't change mtime of modified files" msgstr "" "-M, --no-mtime Nicht Änderungsdatum von veränderte Dateien ändern" #: main-command.c:97 msgid "" "-f, --fix-datestamps Fix broken GPS datestamps written with ver. < 1.5.2" msgstr "" "-f, --fix-datestamps GPS-Datumsstempel, die von < V.1.5.2 geschrieben\n" " worden sind, reparieren" #: main-command.c:98 msgid "" " --degmins Write location as DD MM.MM (was default before " "v1.5.3)" msgstr "" " --degmins Ort als GG MM.MM schreiben (war vor V.1.5.3 " "Standard)" #: main-command.c:99 msgid "" "-O, --photooffset SECS Offset added to photo time to make it match the GPS" msgstr "" "-O, --photooffset SEK Zeitversatz, dass zur Fotozeit addiert werden " "muss,\n" " damit es mit dem GPS übereinstimmt" #: main-command.c:100 msgid "-h, --help Display this help message" msgstr "-h, --help Hilfetext anzeigen" #: main-command.c:101 msgid "-v, --verbose Show more detailed output" msgstr "-v, --verbose Detailliertere Ausgabe anzeigen" #: main-command.c:102 msgid "-V, --version Display version information" msgstr "-V, --version Versionsinformationen anzeigen" #: main-command.c:148 main-command.c:314 main-command.c:352 #, c-format msgid "Out of memory.\n" msgstr "Kein Speicherplatz mehr.\n" #: main-command.c:159 #, c-format msgid "%s: %s, Lat %f, Long %f, Elevation " msgstr "%s: %s, Breitengrad %f, Längengrad %f, Höhe " #: main-command.c:164 #, c-format msgid "(unknown)" msgstr "(unbekannt)" #: main-command.c:173 #, c-format msgid "%s: %s, No GPS Data.\n" msgstr "%s: %s, Keine GPS-Daten.\n" #: main-command.c:182 main-command.c:225 #, c-format msgid "%s: No EXIF data.\n" msgstr "%s: Keine EXIF-Daten.\n" #: main-command.c:201 #, c-format msgid "%s: Removed GPS tags.\n" msgstr "%s: GPS-Metadaten entfernt.\n" #: main-command.c:204 #, c-format msgid "%s: Tag removal failure.\n" msgstr "%s: Fehler beim Löschen eines Feldes.\n" #: main-command.c:228 #, c-format msgid "%s: No GPS data.\n" msgstr "%s: Keine GPS-Daten.\n" #: main-command.c:254 #, c-format msgid "" "%s: Wrong timestamp:\n" " Photo: %s\n" " GPS: %s\n" " Corrected: %s\n" msgstr "" "%s: Falscher Zeitstempel:\n" " Foto: %s\n" " GPS: %s\n" " Korrigiert: %s\n" #: main-command.c:259 #, c-format msgid "%s: Timestamp is OK: Photo %s (localtime), GPS %s (UTC).\n" msgstr "%s: Zeitstempel ok: Foto %s (Lokalzeit), GPS %s (UTC).\n" #: main-command.c:338 #, c-format msgid "Reading GPS Data..." msgstr "GPS-Daten werden gelesen..." #: main-command.c:364 #, c-format msgid "Error parsing location.\n" msgstr "Fehler beim Parsen des Standorts.\n" #: main-command.c:369 main-command.c:378 #, c-format msgid "Out of memory\n" msgstr "Kein Speicherplatz mehr.\n" #: main-command.c:450 #, c-format msgid "" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" msgstr "" "Dieses Program ist freie Software; Angaben zu den Bedingungen, unter\n" "denen das Programm kopiert werden darf, stehen im Quelltext.\n" "Es gibt keine Gewährleistung, das schließt auch MARKTFÄHIGKEIT oder\n" "die ERFÜLLUNG EINES BESTIMMTEN ZWECKES ein.\n" #: main-command.c:501 #, c-format msgid "At least one image file name must be given.\n" msgstr "Mindestens eine Fotodatei benötigt.\n" #: main-command.c:534 #, c-format msgid "A time offset must be given with the -z option to fix photos.\n" msgstr "" "Ein Zeitversatz durch -z ist erforderlich, um den Zeitpunkt festzulegen.\n" #: main-command.c:558 #, c-format msgid "Cannot continue since no GPS data is available.\n" msgstr "Kann nicht weitermachen, da keine GPS-Daten verfügbar sind.\n" #: main-command.c:566 #, c-format msgid "" "Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far\n" " w = Write Fail, ? = No EXIF date, ! = GPS already present\n" msgstr "" "Legende: . = Ok, / = Interpoliert, < = Gerundet, - = Keine Übereinstimmung\n" " ^ = Zu weit, w = Fehler beim Schreiben, ? = Kein EXIF Zeitfeld,\n" " ! = GPS-Daten schon vorhanden\n" #: main-command.c:588 #, c-format msgid "" "\n" "Correlate: " msgstr "" "\n" "Korrelieren: " #: main-command.c:624 #, c-format msgid "%s: Exact match: " msgstr "%s: Exakte Übereinstimmung: " #: main-command.c:634 #, c-format msgid "%s: Interpolated: " msgstr "%s: Interpoliert: " #: main-command.c:644 #, c-format msgid "%s: Rounded: " msgstr "%s: Gerundet: " #: main-command.c:654 #, c-format msgid "%s: EXIF write failure: " msgstr "%s: Fehler beim Schreiben der EXIF-Daten: " #: main-command.c:662 #, c-format msgid "Lat %f, Long %f, Elev " msgstr "Breitengrad %f, Längengrad %f, Höhe " #: main-command.c:667 #, c-format msgid "(unknown).\n" msgstr "(unbekannt).\n" #: main-command.c:678 #, c-format msgid "%s: No match.\n" msgstr "%s: Keine Übereinstimmung.\n" #: main-command.c:688 #, c-format msgid "%s: Too far from nearest point.\n" msgstr "%s: Zu weit entfernt vom nächsten Punkt.\n" #: main-command.c:698 #, c-format msgid "%s: No EXIF date tag present.\n" msgstr "%s: Kein EXIF Zeitfeld vorhanden.\n" #: main-command.c:708 #, c-format msgid "%s: GPS Data already present.\n" msgstr "%s: GPS-Daten bereits vorhanden.\n" #: main-command.c:733 #, c-format msgid "" "\n" "Completed correlation process.\n" msgstr "" "\n" "Korrelation ist abgeschlossen.\n" #: main-command.c:738 #, c-format msgid "Used time zone offset %d:%02d\n" msgstr "Verwendeter Zeitversatz %d:%02d\n" #: main-command.c:740 #, c-format msgid "Matched: %5d (%d Exact, %d Interpolated, %d Rounded).\n" msgstr "Übereingestimmt: %5d (%d Genau, %d Interpoliert, %d Gerundet).\n" #: main-command.c:743 #, c-format msgid "Failed: %5d (%d Not matched, %d Write failure, %d Too Far,\n" msgstr "" "Fehler: %5d (%d Nicht übereingestimmt, %d Fehler beim Schreiben, %d Zu " "weit,\n" #: main-command.c:746 #, c-format msgid " %d No Date, %d GPS Already Present.)\n" msgstr " %d Kein Datum, %d GPS-Daten bereits vorhanden.)\n" gpscorrelate-2.0/po/fr.po000066400000000000000000000466241355604302400154500ustar00rootroot00000000000000# French translation for gpscorrelate # Copyright (C) 2005-2019 Daniel Foote, Dan Fandrich # This file is distributed under the same license as the gpscorrelate package. # Vincent Gay , 2013. # #: gui.c:1594 msgid "" msgstr "" "Project-Id-Version: gpscorrelate 2.0\n" "Report-Msgid-Bugs-To: dan@coneharvesters.com\n" "POT-Creation-Date: 2019-10-23 23:01+0200\n" "PO-Revision-Date: 2013-01-15 13:58+0100\n" "Last-Translator: Vincent Gay \n" "Language-Team: français\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.4\n" #: gpx-read.c:229 #, c-format msgid "Failed to parse GPX data from %s.\n" msgstr "Impossible d'analyser les données GPX depuis %s.\n" #: gpx-read.c:240 #, c-format msgid "Invalid GPX file has no root.\n" msgstr "Erreur : Le fichier GPX n'a pas de racine.\n" #: gpx-read.c:253 #, c-format msgid "Invalid GPX file.\n" msgstr "Fichier GPX invalide.\n" #: gui.c:266 #, c-format msgid "GPS Photo Correlate %s" msgstr "Corrélation GPS Photo %s" #: gui.c:296 msgid "Add..." msgstr "Ajouter…" #: gui.c:300 gui.c:302 msgid "Add photos to be correlated." msgstr "Ajouter des photo à correler." #: gui.c:307 msgid "Remove" msgstr "Retirer" #: gui.c:311 gui.c:313 msgid "Remove selected photos from the list." msgstr "Retirer les photos sélectionnées de la liste." #: gui.c:318 msgid "1. Add Photos" msgstr "1. Ajouter des photos" #: gui.c:337 gui.c:1302 #, c-format msgid "Read from: No file" msgstr "Lecture depuis : pas de fichier" #: gui.c:344 msgid "Choose..." msgstr "Choisir…" #: gui.c:349 gui.c:353 msgid "" "Choose GPX file from which to read GPS data. If the GPS data is not in the " "GPX format, use a converter like GPSBabel to convert it to GPX first." msgstr "" "Choisissez un fichier GPX à partir duquel seront lues les données GPS. Si " "les données GPS ne sont pas au format GPX utilisez un convertisseur tel que " "GPSBabel." #: gui.c:359 msgid "2. GPS Data" msgstr "2. Données GPS" #: gui.c:378 msgid "Interpolate" msgstr "Interpoler" #: gui.c:383 gui.c:387 msgid "" "Interpolate between points. If disabled, points will be rounded to the " "nearest recorded point." msgstr "" "Interpolation entre les points. Si cette option est désactivée la " "correlation sera arrondie au point le plus proche." #: gui.c:392 msgid "Don't write" msgstr "Ne pas écrire" #: gui.c:397 gui.c:401 msgid "" "Don't write EXIF data back to the photos. This is useful for testing the " "settings without modifying the photos." msgstr "" "Ne pas écrire les données EXIF dans les photos. C'est utile pour tester les " "paramètres sans modifier les photos." #: gui.c:406 msgid "Replace existing tags" msgstr "Remplacer les tags existants" #: gui.c:410 gui.c:412 msgid "Replace any existing GPS tags in the photos." msgstr "Remplacer les tags GPS existants sur les photos." #: gui.c:416 msgid "Don't change mtime" msgstr "Ne pas changer le mtime" #: gui.c:421 gui.c:424 msgid "Don't change file modification time of the photos." msgstr "Ne pas changer la date de modification des fichiers photo." #: gui.c:428 msgid "Between Segments" msgstr "Entre les segments" #: gui.c:433 gui.c:438 msgid "" "Interpolate between track segments. Generally the data is segmented to show " "where location data was available and not available, but you might still " "want to interpolate between segments." msgstr "" "Interpoler entre les segments de piste. En général les données sont " "segmentées afin d'indiquer les périodes pendant lesquelles étaient " "disponibles ou non, mais vous pouvez quand-même vouloir interpoler entre des " "segments. " #: gui.c:444 msgid "Write DD MM SS.SS" msgstr "Écrire en DD MM SS.SS" #: gui.c:449 gui.c:454 msgid "" "Write the latitude and longitude values as DD MM SS.SS; this is the new " "default. The old behaviour was to write it as DD MM.MM, which will occur if " "you uncheck this box." msgstr "" "Écrire latitude et longitude en DD MM SS.SS ; c'est le comportement par " "défaut. Depuis, le précédent étant DD MM.MM, ce que vous pouvez rétablir en " "décochant cette case." #: gui.c:460 msgid "Auto time zone" msgstr "Fuseau horaire automatique" #: gui.c:465 gui.c:468 msgid "Assume the camera time zone is the same as the local time zone." msgstr "" "Supposer que le fuseau horaire de la caméra est le même que le fuseau " "horaire local." #: gui.c:479 msgid "Max gap time:" msgstr "Écart de temps maximum :" #: gui.c:486 msgid "Time Zone:" msgstr "Fuseau horaire :" #: gui.c:493 msgid "Photo Offset:" msgstr "Décalage des photos :" #: gui.c:500 msgid "GPS Datum:" msgstr "Datum du GPS :" #: gui.c:514 gui.c:520 msgid "" "Maximum time \"away\" from a point that the photo can be taken yet still " "match, in seconds. If a photo's time is outside this value (from both points " "on either side), the location will not match." msgstr "" "Écart de temps maximum, en secondes, pour lier un point GPS à une photo. Si " "l'horodatage d'une photo est distant de n'importe quel point d'une valeur " "supérieure, aucune correspondance ne sera établie." #: gui.c:535 gui.c:541 msgid "" "The timezone that the camera's time was set to when the photos were taken. " "For example, if a camera is set to AWST or +8:00 hours from UTC, enter +8:00 " "here so that the correct adjustment to the photo's time can be made. GPS " "data is always in UTC." msgstr "" "Le fuseau horaire sur lequel l'appareil photo était réglé quand les photos " "ont été prises. Par exemple +1:00 pour l’heure normale d’Europe centrale " "(CET : Paris, Bruxelles, Genève…) et +2:00 pour l’heure d’été d’Europe " "centrale (CEST). L'heure du GPS est toujours en temps unniversel (UTC)." #: gui.c:561 gui.c:566 msgid "" "The number of seconds to add to the photo's time to make it match the GPS " "data. Calculate this with (GPS - Photo). Can be negative or positive." msgstr "" "Le nombre de secondes à ajouter au temps des photos pour les faire " "correspondre aux données GPS. Égal à (GPS - Photo). Peut être négatif ou " "positif." #: gui.c:580 gui.c:584 msgid "" "The datum used for the GPS data. This text here is recorded in the EXIF tags " "as the source datum. WGS-84 is very commonly used." msgstr "" "Le datum utilisé dans les données GPS. Cette valeur sera enregistrée dans " "les tags EXIF en tant que datum source. WSG-84 est communément utilisé." #: gui.c:590 msgid "3. Set options" msgstr "3. Options" #: gui.c:605 msgid "Correlate Photos" msgstr "Corrélation des photos" #: gui.c:610 gui.c:614 msgid "" "Begin the correlation process, writing back into the photos' EXIF tags " "(unless Don't write is selected)." msgstr "" "Début du processus de correlation, écriture dans les photos si l'option " "n'est pas désactivée, sauf si Ne pas écrire est sélectionné." #: gui.c:620 msgid "4. Correlate!" msgstr "4. Correlation !" #: gui.c:639 msgid "Strip GPS tags" msgstr "Suprimer les tags GPS" #: gui.c:644 gui.c:647 msgid "Strip GPS tags from the selected photos." msgstr "Suprimer les tags GPS des photos sélectionnées." #: gui.c:652 msgid "Help" msgstr "Aide" #: gui.c:657 gui.c:660 msgid "View help for this application." msgstr "Affiche l'aide pour cette application." #: gui.c:665 msgid "About" msgstr "À propos" #: gui.c:670 gui.c:673 msgid "Show information about the program." msgstr "Afficher des informations sur le programme." #: gui.c:678 msgid "Other Tools" msgstr "Autres outils" #: gui.c:714 msgid "File" msgstr "Fichier" #: gui.c:721 msgid "Latitude" msgstr "Latitude" #: gui.c:728 msgid "Longitude" msgstr "Longitude" #: gui.c:735 msgid "Elevation" msgstr "Altitude" #: gui.c:742 msgid "Time" msgstr "Date-Heure" #: gui.c:749 msgid "State" msgstr "État" #: gui.c:842 msgid "Add Photos..." msgstr "Ajouter des photos…" #: gui.c:855 msgid "JPEG images" msgstr "Images JPEG" #: gui.c:861 gui.c:1209 msgid "All files" msgstr "Tous les fichiers" #: gui.c:952 gui.c:1119 msgid "No EXIF data" msgstr "Pas de données EXIF" #: gui.c:1124 msgid "GPS Data Present" msgstr "Données GPS présentes" #: gui.c:1132 msgid "S" msgstr "S" #: gui.c:1132 msgid "N" msgstr "N" #: gui.c:1140 msgid "W" msgstr "O" #: gui.c:1140 msgid "E" msgstr "E" #: gui.c:1147 msgid "m" msgstr "m" #: gui.c:1153 msgid "Ready" msgstr "Prêt" #: gui.c:1190 msgid "Select GPS Data..." msgstr "Sélection des données GPS…" #: gui.c:1203 msgid "GPX files" msgstr "Fichiers GPX" #: gui.c:1233 msgid "Loading GPS data from file... Won't be a moment..." msgstr "Chargement des données GPS depuis le fichier… Ce ne sera pas long…" #: gui.c:1259 msgid "multiple files" msgstr "Fichiers multiples" #: gui.c:1297 #, c-format msgid "Read from: %s" msgstr "Lecture depuis : %s" #: gui.c:1309 #, c-format msgid "Unable to read file %s for some reason. Please try again." msgstr "" "Lecture du fichier %s impossible pour une raison inconnue. Essayez de " "nouveau SVP." #: gui.c:1352 msgid "No photos selected to match! Please use Add to add photos first!" msgstr "Aucune photo sélectionnée ! Ajoutez d'abord des photos SVP !" #: gui.c:1365 msgid "No GPS data loaded! Please select a GPX file to read GPS data from." msgstr "" "Aucube donnée GPS chargée ! Sélectionnez un fichier contenant des données " "GPS." #: gui.c:1429 msgid "Internal error" msgstr "Erreur interne" #: gui.c:1434 msgid "Correlating..." msgstr "Correlation en cours…" #: gui.c:1457 msgid "Exact Match" msgstr "Correspondance exacte" #: gui.c:1461 msgid "Interpolated Match" msgstr "Correspondance interpolée" #: gui.c:1465 msgid "Rounded Match" msgstr "Correspondance arrondie" #: gui.c:1469 msgid "Write Failure" msgstr "Echec de l'écriture" #: gui.c:1483 msgid "Data Already Present" msgstr "Données déjà présentes" #: gui.c:1490 msgid "No Match" msgstr "Aucune correspondance" #: gui.c:1494 msgid "Too far" msgstr "Trop loin" #: gui.c:1498 msgid "No data" msgstr "Pas de données" #: gui.c:1553 msgid "Stripping..." msgstr "Suppression…" #: gui.c:1570 msgid "Error Stripping" msgstr "Erreur pendant la suppression" #: gui.c:1629 msgid "GPS Correlate attaches EXIF GPS location tags to images." msgstr "GPS Correlate attache des tags de position GPS EXIF aux images." #: gui.c:1631 msgid "Copyright © 2005-2019 Daniel Foote, Dan Fandrich" msgstr "Copyright © 2005-2019 Daniel Foote, Dan Fandrich" #: main-command.c:74 #, c-format msgid "%s, ver. %s. %s\n" msgstr "%s, ver. %s. %s\n" #: main-command.c:76 msgid "Copyright (C) 2005-2019 Daniel Foote, Dan Fandrich" msgstr "Copyright © 2005-2019 Daniel Foote, Dan Fandrich" #: main-command.c:82 #, c-format msgid "Usage: %s [options] file.jpg ...\n" msgstr "Usage: %s [options] fichier.jpg ...\n" #: main-command.c:83 msgid "-g, --gps file.gpx Specifies GPX file with GPS data" msgstr "" "-g, --gps fichier.gpx Indique le fichier GPX contenant les données GPS" #: main-command.c:84 msgid "" "-l, --latlong LAT,LONG[,E] Specifies latitude/longitude/elevation directly" msgstr "" "-l, --latlong LAT,LONG[,É] Indiquer la latitude/longitude/élévation " "directement" #: main-command.c:85 msgid "" "-z, --timeadd +/-HH[:MM] Time to add to GPS data to make it match photos" msgstr "" "-z, --timeadd +/-HH[:MM] Décalage horaire à ajouter aux données GPS pour\n" " correspondre aux photos." #: main-command.c:86 msgid "" "-i, --no-interpolation Disable interpolation between points; " "interpolation\n" " is linear, points rounded if disabled" msgstr "" "-i, --no-interpolation Désactive l'interpolation linéaire entre les " "points;\n" " arrondit au point le plus proche" #: main-command.c:88 msgid "-d, --datum DATUM Specify measurement datum (defaults to WGS-84)" msgstr "-d, --datum DATUM Spécifie le datum (WGS-84 par défaut)" #: main-command.c:89 msgid "" "-n, --no-write Do not write the EXIF data. Useful with --verbose" msgstr "" "-n, --no-write Ne pas écrire les données EXIF. Utile avec\n" " l'option --verbose" #: main-command.c:90 msgid "" "-R, --replace Overwrite any GPS tags already in the image file" msgstr "" "-R, --replace Effacer et remplacer les tags GPS déjà présentés\n" " dans l'image" #: main-command.c:91 msgid "" "-m, --max-dist SECS Max time outside points that photo will be matched" msgstr "" "-m, --max-dist SECS Écart de temps maximum entre un point GPS et une\n" " photo pour établir une corrélation." #: main-command.c:92 msgid "-s, --show Just show the GPS data from the given files" msgstr "" "-s, --show Seulement montrer les données GPS des fichiers " "indiqués" #: main-command.c:93 msgid "" "-o, --machine Similar to --show but with machine-readable output" msgstr "-o, --machine Similaire à --show mais en format machine " #: main-command.c:94 msgid "-r, --remove Strip GPS tags from the given files" msgstr "-r, --remove Retirer les tags GPS des fichiers indiqués" #: main-command.c:95 msgid "-t, --ignore-tracksegs Interpolate between track segments, too" msgstr "" "-t, --ignore-tracksegs Interpoler également entre les segments de piste" #: main-command.c:96 msgid "-M, --no-mtime Don't change mtime of modified files" msgstr "" "-M, --no-mtime Ne pas changer la date de dernière modification\n" " des fichiers" #: main-command.c:97 msgid "" "-f, --fix-datestamps Fix broken GPS datestamps written with ver. < 1.5.2" msgstr "" "-f, --fix-datestamps Corrige les erreurs d'horodatage des version\n" " antérieures à 1.5.2" #: main-command.c:98 msgid "" " --degmins Write location as DD MM.MM (was default before " "v1.5.3)" msgstr "" " --degmins Écrit la position en DD MM.MM (format par défaut\n" " avant la version 1.5.3)" #: main-command.c:99 msgid "" "-O, --photooffset SECS Offset added to photo time to make it match the GPS" msgstr "" "-O, --photooffset SECS Décalage (en secondes) à ajouter au temps des " "photos\n" " pour les caler sur le GPS" #: main-command.c:100 msgid "-h, --help Display this help message" msgstr "-h, --help Affiche le message d'aide" #: main-command.c:101 msgid "-v, --verbose Show more detailed output" msgstr "-v, --verbose Affichage détaillé en sortie" #: main-command.c:102 msgid "-V, --version Display version information" msgstr "-V, --version Affiche les information de version" #: main-command.c:148 main-command.c:314 main-command.c:352 #, c-format msgid "Out of memory.\n" msgstr "Manque de mémoire.\n" #: main-command.c:159 #, c-format msgid "%s: %s, Lat %f, Long %f, Elevation " msgstr "%s: %s, Lat %f, Long %f, Altitude " #: main-command.c:164 #, c-format msgid "(unknown)" msgstr "(inconnu)" #: main-command.c:173 #, c-format msgid "%s: %s, No GPS Data.\n" msgstr "%s: %s, Aucune donnée GPS.\n" #: main-command.c:182 main-command.c:225 #, c-format msgid "%s: No EXIF data.\n" msgstr "%s : Aucune donnée EXIF.\n" #: main-command.c:201 #, c-format msgid "%s: Removed GPS tags.\n" msgstr "%s : Tags GPS retirés.\n" #: main-command.c:204 #, c-format msgid "%s: Tag removal failure.\n" msgstr "%s : Echec du retrait des tags.\n" #: main-command.c:228 #, c-format msgid "%s: No GPS data.\n" msgstr "%s : Aucune donnée GPS.\n" #: main-command.c:254 #, c-format msgid "" "%s: Wrong timestamp:\n" " Photo: %s\n" " GPS: %s\n" " Corrected: %s\n" msgstr "" "%s: Mauvais horodatage :\n" " Photo: %s\n" " GPS: %s\n" " Corrigé: %s\n" #: main-command.c:259 #, c-format msgid "%s: Timestamp is OK: Photo %s (localtime), GPS %s (UTC).\n" msgstr "%s: Horodatage OK: Photo %s (heure locale), GPS %s (UTC).\n" #: main-command.c:338 #, c-format msgid "Reading GPS Data..." msgstr "Lecture des données GPS..." #: main-command.c:364 #, c-format msgid "Error parsing location.\n" msgstr "Erreur lors de l'analyse de l'emplacement.\n" #: main-command.c:369 main-command.c:378 #, c-format msgid "Out of memory\n" msgstr "Manque de mémoire.\n" #: main-command.c:450 #, c-format msgid "" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" msgstr "" "Ce programme est un logiciel libre ; voir les sources pour les conditions " "de\n" "reproduction. Il n'y a AUCUNE GARANTIE ; pas même la garantie implicite " "qu'il\n" "est DE QUALITÉ LOYALE ET MARCHANDE ou APPROPRIÉ POUR UN BUT PARTICULIER.\n" #: main-command.c:501 #, c-format msgid "At least one image file name must be given.\n" msgstr "Au moins un fichier est nécessaire.\n" #: main-command.c:534 #, c-format msgid "A time offset must be given with the -z option to fix photos.\n" msgstr "Vous devez indiquer le décalage horaire des photos avec l'option -z.\n" #: main-command.c:558 #, c-format msgid "Cannot continue since no GPS data is available.\n" msgstr "Impossible de continuer car il n'y a pas de données GPS.\n" #: main-command.c:566 #, c-format msgid "" "Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far\n" " w = Write Fail, ? = No EXIF date, ! = GPS already present\n" msgstr "" "Legend: . = Ok, / = Interpolatée, < = Arrondi, - = Pas de correspondance,\n" " ^ = Trop loin, w = Echec de l'écriture, ? = Pas de date EXIF,\n" " ! = Données GPS déjà présentes.\n" #: main-command.c:588 #, c-format msgid "" "\n" "Correlate: " msgstr "" "\n" "Corrélation : " #: main-command.c:624 #, c-format msgid "%s: Exact match: " msgstr "%s : Correspondance exacte : " #: main-command.c:634 #, c-format msgid "%s: Interpolated: " msgstr "%s : Interpolée(s): " #: main-command.c:644 #, c-format msgid "%s: Rounded: " msgstr "%s : Arrondie(s): " #: main-command.c:654 #, c-format msgid "%s: EXIF write failure: " msgstr "%s : Echec de l'écriture des données Exif :" #: main-command.c:662 #, c-format msgid "Lat %f, Long %f, Elev " msgstr "Lat %f, Long %f, Alti " #: main-command.c:667 #, c-format msgid "(unknown).\n" msgstr "(inconnu).\n" #: main-command.c:678 #, c-format msgid "%s: No match.\n" msgstr "%s : Pas de correspondance.\n" #: main-command.c:688 #, c-format msgid "%s: Too far from nearest point.\n" msgstr "%s: Trop loin du point le plus proche.\n" #: main-command.c:698 #, c-format msgid "%s: No EXIF date tag present.\n" msgstr "%s: Date absente dans les tags EXIF.\n" #: main-command.c:708 #, c-format msgid "%s: GPS Data already present.\n" msgstr "%s: Données GPS déjà présentes.\n" #: main-command.c:733 #, c-format msgid "" "\n" "Completed correlation process.\n" msgstr "" "\n" "Processus de corrélation terminé.\n" #: main-command.c:738 #, c-format msgid "Used time zone offset %d:%02d\n" msgstr "Décalage de fuseau horaire utilisé %d:%02d\n" #: main-command.c:740 #, c-format msgid "Matched: %5d (%d Exact, %d Interpolated, %d Rounded).\n" msgstr "Correspondances : %5d (%d Exactes, %d Interpolatées, %d Arrondies).\n" #: main-command.c:743 #, c-format msgid "Failed: %5d (%d Not matched, %d Write failure, %d Too Far,\n" msgstr "" "Échec : %5d (%d Pas de correspondance, %d Problème d'écriture, %d Trop " "loin,\n" #: main-command.c:746 #, c-format msgid " %d No Date, %d GPS Already Present.)\n" msgstr " %d Pas de date, %d Données GPS déjà présentes.)\n" gpscorrelate-2.0/po/remove-potcdate.sin000066400000000000000000000006601355604302400203000ustar00rootroot00000000000000# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } gpscorrelate-2.0/po/ru.po000066400000000000000000000436651355604302400154710ustar00rootroot00000000000000# Russian translation for gpscorrelate # Copyright (C) 2005-2019 Daniel Foote, Dan Fandrich # This file is distributed under the same license as the gpscorrelate package. # Nikolay Korotkiy , 2019. # #: gui.c:1594 msgid "" msgstr "" "Project-Id-Version: gpscorrelate 2.0\n" "Report-Msgid-Bugs-To: dan@coneharvesters.com\n" "POT-Creation-Date: 2019-10-23 23:01+0200\n" "PO-Revision-Date: 2019-03-18 10:12+0300\n" "Last-Translator: Nikolay Korotkiy \n" "Language-Team: russian\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gpx-read.c:229 #, c-format msgid "Failed to parse GPX data from %s.\n" msgstr "Не удалось прочитать GPX данные из %s.\n" #: gpx-read.c:240 #, c-format msgid "Invalid GPX file has no root.\n" msgstr "Неверный GPX файл не имеет корня.\n" #: gpx-read.c:253 #, c-format msgid "Invalid GPX file.\n" msgstr "Неверный GPX файл.\n" #: gui.c:266 #, c-format msgid "GPS Photo Correlate %s" msgstr "GPS Photo Correlate %s" #: gui.c:296 msgid "Add..." msgstr "Добавить..." #: gui.c:300 gui.c:302 msgid "Add photos to be correlated." msgstr "Добавить фотографии для привязки." #: gui.c:307 msgid "Remove" msgstr "Удалить" #: gui.c:311 gui.c:313 msgid "Remove selected photos from the list." msgstr "Удалить выбранные фотографии из списка." #: gui.c:318 msgid "1. Add Photos" msgstr "1. Добавить фотографии" #: gui.c:337 gui.c:1302 #, c-format msgid "Read from: No file" msgstr "Читать из: нет файла" #: gui.c:344 msgid "Choose..." msgstr "Выбрать..." #: gui.c:349 gui.c:353 msgid "" "Choose GPX file from which to read GPS data. If the GPS data is not in the " "GPX format, use a converter like GPSBabel to convert it to GPX first." msgstr "" "Выберите GPX файл, из которого нужно прочитать GPS данные. Если GPS данные " "не в GPX формате, воспользуйтесь конвертером, таким как GPSBabel, чтобы " "сначала преобразовать их в GPX." #: gui.c:359 msgid "2. GPS Data" msgstr "2. GPS данные" #: gui.c:378 msgid "Interpolate" msgstr "Интерполировать" #: gui.c:383 gui.c:387 msgid "" "Interpolate between points. If disabled, points will be rounded to the " "nearest recorded point." msgstr "" "Интерполировать между точками. Если выключено, будет использована ближайшая " "записанная устройством точка." #: gui.c:392 msgid "Don't write" msgstr "Не сохранять" #: gui.c:397 gui.c:401 msgid "" "Don't write EXIF data back to the photos. This is useful for testing the " "settings without modifying the photos." msgstr "" "Не записывать EXIF данные фотографий. Полезно для тестирования настроек без " "изменения фотографий." #: gui.c:406 msgid "Replace existing tags" msgstr "Заменить существующие теги" #: gui.c:410 gui.c:412 msgid "Replace any existing GPS tags in the photos." msgstr "Заменить уже существующие теги у фотографий." #: gui.c:416 msgid "Don't change mtime" msgstr "Не изменять mtime" #: gui.c:421 gui.c:424 msgid "Don't change file modification time of the photos." msgstr "Не обновлять время изменения файлов." #: gui.c:428 msgid "Between Segments" msgstr "Между сегментами" #: gui.c:433 gui.c:438 msgid "" "Interpolate between track segments. Generally the data is segmented to show " "where location data was available and not available, but you might still " "want to interpolate between segments." msgstr "" "Интерполировать между сегментами трека. Обычно сегментирование указывает на " "то, что данные о местоположении были недоступны, но возможно вы все равно " "хотите интерполировать между ними." #: gui.c:444 msgid "Write DD MM SS.SS" msgstr "В формате DD MM SS.SS" #: gui.c:449 gui.c:454 msgid "" "Write the latitude and longitude values as DD MM SS.SS; this is the new " "default. The old behaviour was to write it as DD MM.MM, which will occur if " "you uncheck this box." msgstr "" "Записывать широту и долготу в формате DD MM SS.SS; это новое поведение по " "умолчанию. Предыдущим форматом было DD MM.MM, чтобы его использовать " "выключите данную опцию." #: gui.c:460 msgid "Auto time zone" msgstr "Автоматически определять часовой пояс" #: gui.c:465 gui.c:468 msgid "Assume the camera time zone is the same as the local time zone." msgstr "" "Предполагать, что часовой пояс камеры совпадает с местным часовым поясом." #: gui.c:479 msgid "Max gap time:" msgstr "Макс. промежуток времени:" #: gui.c:486 msgid "Time Zone:" msgstr "Часовой пояс:" #: gui.c:493 msgid "Photo Offset:" msgstr "Смещение фотографии:" #: gui.c:500 msgid "GPS Datum:" msgstr "GPS датум:" #: gui.c:514 gui.c:520 msgid "" "Maximum time \"away\" from a point that the photo can be taken yet still " "match, in seconds. If a photo's time is outside this value (from both points " "on either side), the location will not match." msgstr "" "Максимальное удаление по времени (в секундах) от точки, когда фотография " "могла быть сделана, но все еще считаемое совпадением. Если время фотографии " "выходит за пределы этого значения (из обеих точек с обеих сторон), " "местоположение будет считаться не совпадающим." #: gui.c:535 gui.c:541 msgid "" "The timezone that the camera's time was set to when the photos were taken. " "For example, if a camera is set to AWST or +8:00 hours from UTC, enter +8:00 " "here so that the correct adjustment to the photo's time can be made. GPS " "data is always in UTC." msgstr "" "Часовой пояс, на который было установлено время камеры, когда были сделаны " "фотографии. Например, если для камеры установлено значение MSK или +3:00 " "часов от UTC, введите здесь +3:00, чтобы можно было правильно определить " "время фотографии. Данные GPS всегда в UTC." #: gui.c:561 gui.c:566 msgid "" "The number of seconds to add to the photo's time to make it match the GPS " "data. Calculate this with (GPS - Photo). Can be negative or positive." msgstr "" "Количество секунд, добавляемых к времени фотографии, чтобы оно " "соответствовало GPS данным. Рассчитывается с помощью (GPS - Фото). Может " "быть отрицательным или положительным." #: gui.c:580 gui.c:584 msgid "" "The datum used for the GPS data. This text here is recorded in the EXIF tags " "as the source datum. WGS-84 is very commonly used." msgstr "" "Датум, используемый для GPS данных. Этот текст записывается в EXIF теги как " "датум источника. WGS-84 очень широко используется." #: gui.c:590 msgid "3. Set options" msgstr "3. Установить параметры" #: gui.c:605 msgid "Correlate Photos" msgstr "Привязать фотографии" #: gui.c:610 gui.c:614 msgid "" "Begin the correlation process, writing back into the photos' EXIF tags " "(unless Don't write is selected)." msgstr "" "Начать процесс привязки и записи EXIF тегов (если не выбрана опция 'Не " "сохранять')." #: gui.c:620 msgid "4. Correlate!" msgstr "4. Привязать!" #: gui.c:639 msgid "Strip GPS tags" msgstr "Очистить GPS теги" #: gui.c:644 gui.c:647 msgid "Strip GPS tags from the selected photos." msgstr "Очистить GPS теги с выделенных фотографий." #: gui.c:652 msgid "Help" msgstr "Справка" #: gui.c:657 gui.c:660 msgid "View help for this application." msgstr "Вызвать справку для этого приложения." #: gui.c:665 msgid "About" msgstr "О программе" #: gui.c:670 gui.c:673 msgid "Show information about the program." msgstr "Информация о программе." #: gui.c:678 msgid "Other Tools" msgstr "Другие инструменты" #: gui.c:714 msgid "File" msgstr "Файл" #: gui.c:721 msgid "Latitude" msgstr "Широта" #: gui.c:728 msgid "Longitude" msgstr "Долгота" #: gui.c:735 msgid "Elevation" msgstr "Высота" #: gui.c:742 msgid "Time" msgstr "Время" #: gui.c:749 msgid "State" msgstr "Состояние" #: gui.c:842 msgid "Add Photos..." msgstr "Добавить фотографии..." #: gui.c:855 msgid "JPEG images" msgstr "JPEG изображения" #: gui.c:861 gui.c:1209 msgid "All files" msgstr "Все файлы" #: gui.c:952 gui.c:1119 msgid "No EXIF data" msgstr "Нет EXIF данных" #: gui.c:1124 msgid "GPS Data Present" msgstr "GPS данные присутствуют" #: gui.c:1132 msgid "S" msgstr "ю.ш." #: gui.c:1132 msgid "N" msgstr "с.ш." #: gui.c:1140 msgid "W" msgstr "з.д." #: gui.c:1140 msgid "E" msgstr "в.д." #: gui.c:1147 msgid "m" msgstr "м" #: gui.c:1153 msgid "Ready" msgstr "Готово" #: gui.c:1190 msgid "Select GPS Data..." msgstr "Выбрать GPS данные..." #: gui.c:1203 msgid "GPX files" msgstr "GPX файлы" #: gui.c:1233 msgid "Loading GPS data from file... Won't be a moment..." msgstr "Загрузка GPS данных из файла..." #: gui.c:1259 msgid "multiple files" msgstr "несколько файлов" #: gui.c:1297 #, c-format msgid "Read from: %s" msgstr "Читать из: %s" #: gui.c:1309 #, c-format msgid "Unable to read file %s for some reason. Please try again." msgstr "Невозможно прочитать файл %s. Пожалуйста, попробуйте еще раз." #: gui.c:1352 msgid "No photos selected to match! Please use Add to add photos first!" msgstr "" "Не выбрано ни одной фотографии! Пожалуйста, добавьте сначала фотографии." #: gui.c:1365 msgid "No GPS data loaded! Please select a GPX file to read GPS data from." msgstr "GPS данные не загружены! Выберите GPX файл." #: gui.c:1429 msgid "Internal error" msgstr "Внутренняя ошибка" #: gui.c:1434 msgid "Correlating..." msgstr "Привязка..." #: gui.c:1457 msgid "Exact Match" msgstr "Точное совпадение" #: gui.c:1461 msgid "Interpolated Match" msgstr "Интерполированное совпадение" #: gui.c:1465 msgid "Rounded Match" msgstr "Округленное совпадение" #: gui.c:1469 msgid "Write Failure" msgstr "Ошибка записи" #: gui.c:1483 msgid "Data Already Present" msgstr "Данные уже присутствуют" #: gui.c:1490 msgid "No Match" msgstr "Нет совпадений" #: gui.c:1494 msgid "Too far" msgstr "Слишком далеко" #: gui.c:1498 msgid "No data" msgstr "Нет данных" #: gui.c:1553 msgid "Stripping..." msgstr "Очистка..." #: gui.c:1570 msgid "Error Stripping" msgstr "Ошибка очистки" #: gui.c:1629 msgid "GPS Correlate attaches EXIF GPS location tags to images." msgstr "GPS Correlate прикрепляет к изображениям теги местоположения GPS EXIF." #: gui.c:1631 msgid "Copyright © 2005-2019 Daniel Foote, Dan Fandrich" msgstr "Авторские права © 2005-2019 Daniel Foote, Dan Fandrich" #: main-command.c:74 #, c-format msgid "%s, ver. %s. %s\n" msgstr "%s, ver. %s. %s\n" #: main-command.c:76 msgid "Copyright (C) 2005-2019 Daniel Foote, Dan Fandrich" msgstr "Авторские права © 2005-2019 Daniel Foote, Dan Fandrich" #: main-command.c:82 #, c-format msgid "Usage: %s [options] file.jpg ...\n" msgstr "" #: main-command.c:83 msgid "-g, --gps file.gpx Specifies GPX file with GPS data" msgstr "" #: main-command.c:84 msgid "" "-l, --latlong LAT,LONG[,E] Specifies latitude/longitude/elevation directly" msgstr "" #: main-command.c:85 msgid "" "-z, --timeadd +/-HH[:MM] Time to add to GPS data to make it match photos" msgstr "" #: main-command.c:86 msgid "" "-i, --no-interpolation Disable interpolation between points; " "interpolation\n" " is linear, points rounded if disabled" msgstr "" #: main-command.c:88 msgid "-d, --datum DATUM Specify measurement datum (defaults to WGS-84)" msgstr "" #: main-command.c:89 msgid "" "-n, --no-write Do not write the EXIF data. Useful with --verbose" msgstr "" #: main-command.c:90 msgid "" "-R, --replace Overwrite any GPS tags already in the image file" msgstr "" #: main-command.c:91 msgid "" "-m, --max-dist SECS Max time outside points that photo will be matched" msgstr "" #: main-command.c:92 msgid "-s, --show Just show the GPS data from the given files" msgstr "" #: main-command.c:93 msgid "" "-o, --machine Similar to --show but with machine-readable output" msgstr "" #: main-command.c:94 msgid "-r, --remove Strip GPS tags from the given files" msgstr "" #: main-command.c:95 msgid "-t, --ignore-tracksegs Interpolate between track segments, too" msgstr "" #: main-command.c:96 msgid "-M, --no-mtime Don't change mtime of modified files" msgstr "" #: main-command.c:97 msgid "" "-f, --fix-datestamps Fix broken GPS datestamps written with ver. < 1.5.2" msgstr "" #: main-command.c:98 msgid "" " --degmins Write location as DD MM.MM (was default before " "v1.5.3)" msgstr "" #: main-command.c:99 msgid "" "-O, --photooffset SECS Offset added to photo time to make it match the GPS" msgstr "" #: main-command.c:100 msgid "-h, --help Display this help message" msgstr "" #: main-command.c:101 msgid "-v, --verbose Show more detailed output" msgstr "" #: main-command.c:102 msgid "-V, --version Display version information" msgstr "" #: main-command.c:148 main-command.c:314 main-command.c:352 #, c-format msgid "Out of memory.\n" msgstr "" #: main-command.c:159 #, c-format msgid "%s: %s, Lat %f, Long %f, Elevation " msgstr "" #: main-command.c:164 #, c-format msgid "(unknown)" msgstr "" #: main-command.c:173 #, c-format msgid "%s: %s, No GPS Data.\n" msgstr "" #: main-command.c:182 main-command.c:225 #, c-format msgid "%s: No EXIF data.\n" msgstr "" #: main-command.c:201 #, c-format msgid "%s: Removed GPS tags.\n" msgstr "" #: main-command.c:204 #, c-format msgid "%s: Tag removal failure.\n" msgstr "" #: main-command.c:228 #, c-format msgid "%s: No GPS data.\n" msgstr "" #: main-command.c:254 #, c-format msgid "" "%s: Wrong timestamp:\n" " Photo: %s\n" " GPS: %s\n" " Corrected: %s\n" msgstr "" #: main-command.c:259 #, c-format msgid "%s: Timestamp is OK: Photo %s (localtime), GPS %s (UTC).\n" msgstr "" #: main-command.c:338 #, c-format msgid "Reading GPS Data..." msgstr "" #: main-command.c:364 #, c-format msgid "Error parsing location.\n" msgstr "" #: main-command.c:369 main-command.c:378 #, c-format msgid "Out of memory\n" msgstr "" #: main-command.c:450 #, c-format msgid "" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" msgstr "" #: main-command.c:501 #, c-format msgid "At least one image file name must be given.\n" msgstr "" #: main-command.c:534 #, c-format msgid "A time offset must be given with the -z option to fix photos.\n" msgstr "" #: main-command.c:558 #, c-format msgid "Cannot continue since no GPS data is available.\n" msgstr "" #: main-command.c:566 #, c-format msgid "" "Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far\n" " w = Write Fail, ? = No EXIF date, ! = GPS already present\n" msgstr "" #: main-command.c:588 #, c-format msgid "" "\n" "Correlate: " msgstr "" #: main-command.c:624 #, c-format msgid "%s: Exact match: " msgstr "" #: main-command.c:634 #, c-format msgid "%s: Interpolated: " msgstr "" #: main-command.c:644 #, c-format msgid "%s: Rounded: " msgstr "" #: main-command.c:654 #, c-format msgid "%s: EXIF write failure: " msgstr "" #: main-command.c:662 #, c-format msgid "Lat %f, Long %f, Elev " msgstr "" #: main-command.c:667 #, c-format msgid "(unknown).\n" msgstr "" #: main-command.c:678 #, c-format msgid "%s: No match.\n" msgstr "" #: main-command.c:688 #, c-format msgid "%s: Too far from nearest point.\n" msgstr "" #: main-command.c:698 #, c-format msgid "%s: No EXIF date tag present.\n" msgstr "" #: main-command.c:708 #, c-format msgid "%s: GPS Data already present.\n" msgstr "" #: main-command.c:733 #, c-format msgid "" "\n" "Completed correlation process.\n" msgstr "" #: main-command.c:738 #, c-format msgid "Used time zone offset %d:%02d\n" msgstr "" #: main-command.c:740 #, c-format msgid "Matched: %5d (%d Exact, %d Interpolated, %d Rounded).\n" msgstr "" #: main-command.c:743 #, c-format msgid "Failed: %5d (%d Not matched, %d Write failure, %d Too Far,\n" msgstr "" #: main-command.c:746 #, c-format msgid " %d No Date, %d GPS Already Present.)\n" msgstr "" gpscorrelate-2.0/tests/000077500000000000000000000000001355604302400152115ustar00rootroot00000000000000gpscorrelate-2.0/tests/TESTING000066400000000000000000000105341355604302400162540ustar00rootroot00000000000000gpscorrelate Test Framework =========================== The gpscorrelate test suite consists of a simple framework plus test data that allows basic regression tests to be run to validate the gpscorrelate code. It is designed primarily to run tests on the "gpscorrelate" executable but is flexible enough to run other programs as well. The test framework provides the facility to compare the output of the program under test with an expected file, massage that file to make it easier to compare first, perform tests that are expected to fail, and perform arbitrary checks following the test. It is driven by a test parameters file which contains instructions for running that test, plus a data file containing the data expected after running the test. Besides a locally-built version of gpscorrelate and some standard UNIX text utilities found on every system, the test suite also requires the "exiv2" binary executable. TEST FILE FORMAT ================ Each test parameters file has a name of the form testN.param where N is the test number. it consists of a series of variable assignments of the form 'VARIABLE=data'. Several pre-set variables are available for use in the data. Bourne shell quoting rules are in effect, and the order does not matter. These are the variables that can be set in the test parameters file: COMMAND - The command to run to execute the test (mandatory) PRECOMMAND - A command to run before COMMAND (which must have a 0 exit status) POSTCOMMAND - A command to run after COMMAND (which must have a 0 exit status) RESULTCODE - The return status expected by the command (default 0) RESULTFILE - A file containing the expected output of the program; this will be compared to $OUTFILE (default result/testN.result) SEDCOMMAND - A command passed to sed which modifies the output file $OUTFILE; this can be used to remove parts of the file (like absolute paths) that can be inconsistent between test runs SKIP - Set to "true" if this test should be skipped TITLE - A short descriptive name for the test (mandatory) These are the variables that are available for use in the parameters file: $DATADIR - path to the data directory (data/) $ERRFILE - path to the default standard error output file for this test $LOGDIR - path to the log directory (log/) $OUTFILE - path to the default test output file for this test $PROGRAM - path to the gpscorrelate executable (../gpscorrelate); this should not be quoted in the params file so that the user can specify a helper app like valgrind or gdb along with gpscorrelate $STAGINGDIR - path to an area containing sample files and directories (staging/) FILES AND DIRECTORIES ===================== Test parameter files and any data files are found in the data/ directory. Test parameter files end with the .param extension, while data files end with the .result extension. Files created while running the test are stored in the log/ directory. The contents of log/ is erased before the start of each test run. The directory staging/ contains a few small files that can be used as test input. It should be treated as read only, and should not be modified. Any test that expects to modify files must first copy them from staging into $LOGDIR in the PRECOMMAND. INVOCATION ========== Start the tests with the command "./testsuite". If parameters are given, they are to specific test case files to run, e.g. "./testsuite data/test002.param" will run only test 2. When running outside the build tree, the environment variable "srcdir" must be set to the absolute path of the tests source directory. The program will exit with a non-zero status code if at least one test failed. If the -v option is given, more verbose information about test failures is provided. If the -m option is given, the program is run with valgrind's memcheck tool. Some test cases don't do a good job of cleaning up after themselves after failures. If you get persistent test failures, try deleting the 'log' directory and running the tests again. The test suite has been tested using exiv2 0.21.1 and libxml2 2.9.3. Older versions have slightly different output that causes the test output comparison to fail. There is a hack in testsuite that can be used to relax the comparison and use such an older version of exiv2. When using MUSL 1.1, an issue allows exiv2 to erronously overwrite read-only files which causes tests that check this condition to fail. gpscorrelate-2.0/tests/data/000077500000000000000000000000001355604302400161225ustar00rootroot00000000000000gpscorrelate-2.0/tests/data/test001.param000066400000000000000000000002421355604302400203420ustar00rootroot00000000000000TITLE='Show GPS data on file without GPS tags' COMMAND='$PROGRAM -s "$STAGINGDIR/point1-1.jpg" > "$OUTFILE" 2>&1' RESULTCODE=0 SEDCOMMAND='s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test001.result000066400000000000000000000000601355604302400205560ustar00rootroot00000000000000point1-1.jpg: 2012:11:22 12:34:56, No GPS Data. gpscorrelate-2.0/tests/data/test002.param000066400000000000000000000002411355604302400203420ustar00rootroot00000000000000TITLE='Show GPS data on file without EXIF tags' COMMAND='$PROGRAM -s "$STAGINGDIR/noexif.jpg" > "$OUTFILE" 2>&1' RESULTCODE=1 SEDCOMMAND='s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test002.result000066400000000000000000000000321355604302400205560ustar00rootroot00000000000000noexif.jpg: No EXIF data. gpscorrelate-2.0/tests/data/test003.param000066400000000000000000000002451355604302400203470ustar00rootroot00000000000000TITLE='Show machine-readable GPS data on file without GPS tags' COMMAND='$PROGRAM -o "$STAGINGDIR/point1-1.jpg" > "$OUTFILE" 2>&1' RESULTCODE=0 RESULTFILE=/dev/null gpscorrelate-2.0/tests/data/test004.param000066400000000000000000000002441355604302400203470ustar00rootroot00000000000000TITLE='Show machine-readable GPS data on file without EXIF tags' COMMAND='$PROGRAM -o "$STAGINGDIR/noexif.jpg" > "$OUTFILE" 2>&1' RESULTCODE=0 RESULTFILE=/dev/null gpscorrelate-2.0/tests/data/test005.param000066400000000000000000000003311355604302400203450ustar00rootroot00000000000000TITLE='Correlate with nonexistent GPX file' COMMAND='$PROGRAM -g "$STAGINGDIR/does-not-exist" "$STAGINGDIR/point1-1.jpg" 2> "$OUTFILE" > /dev/null' RESULTCODE=1 SEDCOMMAND='s@([ "])([a-zA-Z]:)?/.*/@\1@' # strip paths gpscorrelate-2.0/tests/data/test005.result000066400000000000000000000001541355604302400205660ustar00rootroot00000000000000I/O warning : failed to load external entity "does-not-exist" Failed to parse GPX data from does-not-exist. gpscorrelate-2.0/tests/data/test006.param000066400000000000000000000004041355604302400203470ustar00rootroot00000000000000TITLE='Remove GPS tags from file without EXIF tags' PRECOMMAND='cat "$STAGINGDIR/noexif.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -r "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=1 SEDCOMMAND='s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test006.result000066400000000000000000000000371355604302400205670ustar00rootroot00000000000000test.jpg: Tag removal failure. gpscorrelate-2.0/tests/data/test007.param000066400000000000000000000004051355604302400203510ustar00rootroot00000000000000TITLE='Remove GPS tags from file without GPS tags' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -r "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 SEDCOMMAND='s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test007.result000066400000000000000000000000341355604302400205650ustar00rootroot00000000000000test.jpg: Removed GPS tags. gpscorrelate-2.0/tests/data/test008.param000066400000000000000000000004351355604302400203550ustar00rootroot00000000000000TITLE='Remove GPS tags from a read-only file' PRECOMMAND='cp "$STAGINGDIR/withgps.jpg" "$LOGDIR/test.jpg" && chmod a-w "$LOGDIR/test.jpg"' COMMAND='$PROGRAM -r "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=1 SEDCOMMAND='s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test008.result000066400000000000000000000000371355604302400205710ustar00rootroot00000000000000test.jpg: Tag removal failure. gpscorrelate-2.0/tests/data/test009.param000066400000000000000000000001611355604302400203520ustar00rootroot00000000000000TITLE='Correlate missing -g option' COMMAND='$PROGRAM "$STAGINGDIR/point1-1.jpg" > "$OUTFILE" 2>&1' RESULTCODE=1 gpscorrelate-2.0/tests/data/test009.result000066400000000000000000000000601355604302400205660ustar00rootroot00000000000000Cannot continue since no GPS data is available. gpscorrelate-2.0/tests/data/test010.param000066400000000000000000000003761355604302400203520ustar00rootroot00000000000000TITLE='Correlate a file without a proper date tag' PRECOMMAND='cat "$STAGINGDIR/notime.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/track1.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=2 gpscorrelate-2.0/tests/data/test010.result000066400000000000000000000005601355604302400205630ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: ? Completed correlation process. Matched: 0 (0 Exact, 0 Interpolated, 0 Rounded). Failed: 1 (0 Not matched, 0 Write failure, 0 Too Far, 1 No Date, 0 GPS Already Present.) gpscorrelate-2.0/tests/data/test011.param000066400000000000000000000004011355604302400203400ustar00rootroot00000000000000TITLE='Correlate a file already containing GPS tags' PRECOMMAND='cat "$STAGINGDIR/withgps.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/track1.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=2 gpscorrelate-2.0/tests/data/test011.result000066400000000000000000000005601355604302400205640ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: ! Completed correlation process. Matched: 0 (0 Exact, 0 Interpolated, 0 Rounded). Failed: 1 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 1 GPS Already Present.) gpscorrelate-2.0/tests/data/test012.param000066400000000000000000000004671355604302400203550ustar00rootroot00000000000000TITLE='Correlate a file with exactly one GPS point' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/track1.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test012.result000066400000000000000000000041621355604302400205670ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 37/1 25/1 13505/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 122/1 5/1 2497/1000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 10/1 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test013.param000066400000000000000000000005421355604302400203500ustar00rootroot00000000000000TITLE='Correlate a file with exactly one GPS point with --no-interpolation' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --no-interpolation -z 0 -g "$STAGINGDIR/track1.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test013.result000066400000000000000000000041621355604302400205700ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 37/1 25/1 13505/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 122/1 5/1 2497/1000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 10/1 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test014.param000066400000000000000000000004551355604302400203540ustar00rootroot00000000000000TITLE='Test --datum option' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --datum TOKYO -z 0 -g "$STAGINGDIR/track1.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test014.result000066400000000000000000000041611355604302400205700ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 37/1 25/1 13505/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 122/1 5/1 2497/1000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 10/1 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 6 TOKYO 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test015.param000066400000000000000000000004551355604302400203550ustar00rootroot00000000000000TITLE='Test --no-write option' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --no-write -z 0 -g "$STAGINGDIR/track1.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test015.result000066400000000000000000000025341355604302400205730ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 122 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 gpscorrelate-2.0/tests/data/test016.param000066400000000000000000000004531355604302400203540ustar00rootroot00000000000000TITLE='Test --degmins option' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --degmins -z 0 -g "$STAGINGDIR/track1.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test016.result000066400000000000000000000041551355604302400205750ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 37/1 2522/100 0/1 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 122/1 504/100 0/1 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 10/1 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test017.param000066400000000000000000000004461355604302400203570ustar00rootroot00000000000000TITLE='Remove GPS tags' PRECOMMAND='cat "$STAGINGDIR/withgps.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --remove "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 SEDCOMMAND='1s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test017.result000066400000000000000000000020101355604302400205620ustar00rootroot00000000000000test.jpg: Removed GPS tags. 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 122 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 gpscorrelate-2.0/tests/data/test018.param000066400000000000000000000003401355604302400203510ustar00rootroot00000000000000TITLE='Show GPS data on file' # Run in C locale to avoid errors when comparing numbers in output COMMAND='env LC_ALL=C $PROGRAM -s "$STAGINGDIR/withgps.jpg" > "$OUTFILE" 2>&1' RESULTCODE=0 SEDCOMMAND='s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test018.result000066400000000000000000000001251355604302400205700ustar00rootroot00000000000000withgps.jpg: 2012:11:22 12:34:56, Lat 37.420418, Long -122.084027, Elevation 10.000. gpscorrelate-2.0/tests/data/test019.param000066400000000000000000000002641355604302400203570ustar00rootroot00000000000000TITLE='Show machine-readable GPS data on file' COMMAND='$PROGRAM --machine "$STAGINGDIR/withgps.jpg" > "$OUTFILE" 2>&1' RESULTCODE=0 SEDCOMMAND='s@([a-zA-Z]:)?/.*/@@' # strip path gpscorrelate-2.0/tests/data/test019.result000066400000000000000000000001011355604302400205630ustar00rootroot00000000000000"withgps.jpg","2012:11:22 12:34:56",37.420418,-122.084027,10.000 gpscorrelate-2.0/tests/data/test020.param000066400000000000000000000003771355604302400203540ustar00rootroot00000000000000TITLE='Correlate a file with wrong timeoffset' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 1:00 -g "$STAGINGDIR/track2.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=2 gpscorrelate-2.0/tests/data/test020.result000066400000000000000000000005601355604302400205640ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: - Completed correlation process. Matched: 0 (0 Exact, 0 Interpolated, 0 Rounded). Failed: 1 (1 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) gpscorrelate-2.0/tests/data/test021.param000066400000000000000000000004151355604302400203460ustar00rootroot00000000000000TITLE='Correlate a file with wrong photooffset' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 --photooffset 1 -g "$STAGINGDIR/track1.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=2 gpscorrelate-2.0/tests/data/test021.result000066400000000000000000000005601355604302400205650ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: - Completed correlation process. Matched: 0 (0 Exact, 0 Interpolated, 0 Rounded). Failed: 1 (1 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) gpscorrelate-2.0/tests/data/test022.param000066400000000000000000000020541355604302400203500ustar00rootroot00000000000000TITLE='Test --no-mtime option' # This is a strange way to test this, but I haven't found a better means that's # both simple && highly portable. This method just compares the relative mtime # of the file under test and a just-created file with ls -t and ensures that # the file under test is older than the other. # # This makes several assumptions: # 1) the filesystem and ls command operate at one second resolution # 2) when two files have the same mtime, ls -t will output them in # lexicographic order # The failure of either assumption is designed to cause a false negative # result, so they should not disrupt operation of the test suite. PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg" && touch -t 201001020304.05 "$LOGDIR/test.jpg" && touch "$LOGDIR/ztest.jpg"' COMMAND='$PROGRAM --no-mtime -z 0 -g "$STAGINGDIR/track1.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && ls -t "$LOGDIR/ztest.jpg" "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg" "$LOGDIR/ztest.jpg"' RESULTCODE=0 SEDCOMMAND='s@/[^ ].*/@@' # strip paths gpscorrelate-2.0/tests/data/test022.result000066400000000000000000000006031355604302400205640ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) ztest.jpg test.jpg gpscorrelate-2.0/tests/data/test023.param000066400000000000000000000005061355604302400203510ustar00rootroot00000000000000TITLE='Correlate a read-only file' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg" && chmod a-w "$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/track1.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=1 gpscorrelate-2.0/tests/data/test023.result000066400000000000000000000005601355604302400205670ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: w Completed correlation process. Matched: 0 (0 Exact, 0 Interpolated, 0 Rounded). Failed: 1 (0 Not matched, 1 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) gpscorrelate-2.0/tests/data/test024.param000066400000000000000000000012131355604302400203460ustar00rootroot00000000000000TITLE='Read an empty GPX file' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -g /dev/null "$LOGDIR/test.jpg" 2> "$OUTFILE" > /dev/null' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=1 # libxml2 versions 2.9.1 and below have slightly different diagnostic output # that causes this test to fail # libxml2 versions 2.9.4 (at least) adds some unuseful diagnostic lines # beginning with ^ that are removed here # libxml2 version 2.7.7 adds an extra Start tag expected message # Windows targets use nul instead of /dev/null, so canonicalize on the former SEDCOMMAND='/(^\^?$)|(Start tag expected)/d;s@/dev/null@nul@' gpscorrelate-2.0/tests/data/test024.result000066400000000000000000000001131355604302400205620ustar00rootroot00000000000000nul:1: parser error : Document is empty Failed to parse GPX data from nul. gpscorrelate-2.0/tests/data/test025.param000066400000000000000000000003701355604302400203520ustar00rootroot00000000000000TITLE='Read an invalid GPX file (XML)' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -g "$STAGINGDIR/dummy.xhtml" "$LOGDIR/test.jpg" 2> "$OUTFILE" > /dev/null' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=1 gpscorrelate-2.0/tests/data/test025.result000066400000000000000000000000221355604302400205620ustar00rootroot00000000000000Invalid GPX file. gpscorrelate-2.0/tests/data/test026.param000066400000000000000000000003661355604302400203600ustar00rootroot00000000000000TITLE='Read a GPX file with no points' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/nopoints.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=2 gpscorrelate-2.0/tests/data/test026.result000066400000000000000000000005601355604302400205720ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: - Completed correlation process. Matched: 0 (0 Exact, 0 Interpolated, 0 Rounded). Failed: 1 (1 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) gpscorrelate-2.0/tests/data/test027.param000066400000000000000000000003721355604302400203560ustar00rootroot00000000000000TITLE='Read a GPX file with no segments' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/nosegments.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=2 gpscorrelate-2.0/tests/data/test027.result000066400000000000000000000005601355604302400205730ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: - Completed correlation process. Matched: 0 (0 Exact, 0 Interpolated, 0 Rounded). Failed: 1 (1 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) gpscorrelate-2.0/tests/data/test028.param000066400000000000000000000003661355604302400203620ustar00rootroot00000000000000TITLE='Read a GPX file with no tracks' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/notracks.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=2 gpscorrelate-2.0/tests/data/test028.result000066400000000000000000000005601355604302400205740ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: - Completed correlation process. Matched: 0 (0 Exact, 0 Interpolated, 0 Rounded). Failed: 1 (1 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) gpscorrelate-2.0/tests/data/test029.param000066400000000000000000000004571355604302400203640ustar00rootroot00000000000000TITLE='Correlate a file with interpolation' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/track2.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test029.result000066400000000000000000000042061355604302400205760ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 47/1 25/1 16449600/1000000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 10/1 59/1 6888000/1000000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 2959867/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test030.param000066400000000000000000000005051355604302400203460ustar00rootroot00000000000000TITLE='Correlate a file without interpolation' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --no-interpolation -z 0 -g "$STAGINGDIR/track2.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test030.result000066400000000000000000000042051355604302400205650ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: < Completed correlation process. Matched: 1 (0 Exact, 0 Interpolated, 1 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 47/1 25/1 16464000/1000000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 10/1 59/1 6720000/1000000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 2962000/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 35/1 0/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test031.param000066400000000000000000000004761355604302400203560ustar00rootroot00000000000000TITLE='Correlate a file outside feather time' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --max-dist 3 -z 0 -g "$STAGINGDIR/track2.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=2 gpscorrelate-2.0/tests/data/test031.result000066400000000000000000000005601355604302400205660ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: ^ Completed correlation process. Matched: 0 (0 Exact, 0 Interpolated, 0 Rounded). Failed: 1 (0 Not matched, 0 Write failure, 1 Too Far, 0 No Date, 0 GPS Already Present.) gpscorrelate-2.0/tests/data/test032.param000066400000000000000000000006761355604302400203610ustar00rootroot00000000000000TITLE='Correlate a file outside feather time with --no-interpolation' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --no-interpolation --max-dist 3 -v -z 0 -g "$STAGINGDIR/track2.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=2 SEDCOMMAND='s@^([a-zA-Z]:)?/.*/|.*Copyright.*$@@' # strip path and copyright line gpscorrelate-2.0/tests/data/test032.result000066400000000000000000000004461355604302400205720ustar00rootroot00000000000000 Reading GPS Data... Correlate: test.jpg: Too far from nearest point. Completed correlation process. Used time zone offset 0:00 Matched: 0 (0 Exact, 0 Interpolated, 0 Rounded). Failed: 1 (0 Not matched, 0 Write failure, 1 Too Far, 0 No Date, 0 GPS Already Present.) gpscorrelate-2.0/tests/data/test033.param000066400000000000000000000005711355604302400203540ustar00rootroot00000000000000TITLE='Correlate a file with exact match across two, single-point track segments' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --no-interpolation --photooffset 10 -z 0 -g "$STAGINGDIR/track3.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test033.result000066400000000000000000000041751355604302400205760ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 31/1 27/1 314816/10000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 35/1 23/1 593916/10000 0x0005 GPSInfo GPSAltitudeRef Byte 1 1 0x0006 GPSInfo GPSAltitude Rational 1 421912/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 35/1 6/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test034.param000066400000000000000000000005211355604302400203500ustar00rootroot00000000000000TITLE='Correlate a file across two track segments without --ignore-tracksegs' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/track3.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=2 gpscorrelate-2.0/tests/data/test034.result000066400000000000000000000005601355604302400205710ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: - Completed correlation process. Matched: 0 (0 Exact, 0 Interpolated, 0 Rounded). Failed: 1 (1 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) gpscorrelate-2.0/tests/data/test035.param000066400000000000000000000005601355604302400203540ustar00rootroot00000000000000TITLE='Correlate a file across two, single-point track segments, with negative elevation' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --ignore-tracksegs -z 0 -g "$STAGINGDIR/track3.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test035.result000066400000000000000000000041761355604302400206010ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 31/1 27/1 314665/10000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 35/1 23/1 594498/10000 0x0005 GPSInfo GPSAltitudeRef Byte 1 1 0x0006 GPSInfo GPSAltitude Rational 1 422244/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test036.param000066400000000000000000000005241355604302400203550ustar00rootroot00000000000000TITLE='Correlate a file using --photooffset' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --no-interpolation --photooffset 10 -z 0 -g "$STAGINGDIR/track3.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test036.result000066400000000000000000000041751355604302400206010ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 31/1 27/1 314816/10000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 35/1 23/1 593916/10000 0x0005 GPSInfo GPSAltitudeRef Byte 1 1 0x0006 GPSInfo GPSAltitude Rational 1 421912/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 35/1 6/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test037.param000066400000000000000000000005711355604302400203600ustar00rootroot00000000000000TITLE='Correlate a file using --photooffset and smaller --max-dist' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --no-interpolation --photooffset 27 --max-dist 10 -z 0 -g "$STAGINGDIR/track3.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test037.result000066400000000000000000000041761355604302400206030ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 31/1 27/1 317556/10000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 35/1 23/1 591324/10000 0x0005 GPSInfo GPSAltitudeRef Byte 1 1 0x0006 GPSInfo GPSAltitude Rational 1 419297/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 35/1 23/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test038.param000066400000000000000000000011701355604302400203550ustar00rootroot00000000000000TITLE='Correlate a file with automatic time zone detection, DST' PRECOMMAND='cat "$STAGINGDIR/point2-1.jpg" >"$LOGDIR/test.jpg"' # This time zone is equivalent to America/Vancouver (at least, in 2012) # but should be more portable than using the symbolic name. # Run in C locale to avoid errors when comparing numbers in output COMMAND='env LC_ALL=C TZ="PST8PDT,M3.2.0,M11.1.0" $PROGRAM -v -g "$STAGINGDIR/track4.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 SEDCOMMAND='s@^/.*/|.*Copyright.*$@@' # strip path and copyright line gpscorrelate-2.0/tests/data/test038.result000066400000000000000000000041271355604302400206000ustar00rootroot00000000000000 Reading GPS Data... Correlate: test.jpg: Exact match: Lat 49.302376, Long -123.131091, Elev -1.000. Completed correlation process. Used time zone offset -7:00 Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:03:11 03:01:00 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:03:11 03:01:00 0x9004 Photo DateTimeDigitized Ascii 20 2012:03:11 03:01:00 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 49/1 18/1 85532856/10000000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 123/1 7/1 519275951/10000000 0x0005 GPSInfo GPSAltitudeRef Byte 1 1 0x0006 GPSInfo GPSAltitude Rational 1 10/10 0x0007 GPSInfo GPSTimeStamp Rational 3 10/1 1/1 0/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:03:11 gpscorrelate-2.0/tests/data/test039.param000066400000000000000000000011731355604302400203610ustar00rootroot00000000000000TITLE='Correlate a file with automatic time zone detection, no DST' PRECOMMAND='cat "$STAGINGDIR/point2-2.jpg" >"$LOGDIR/test.jpg"' # This time zone is equivalent to America/Vancouver (at least, in 2012) # but should be more portable than using the symbolic name. # Run in C locale to avoid errors when comparing numbers in output COMMAND='env LC_ALL=C TZ="PST8PDT,M3.2.0,M11.1.0" $PROGRAM -v -g "$STAGINGDIR/track4.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 SEDCOMMAND='s@^/.*/|.*Copyright.*$@@' # strip path and copyright line gpscorrelate-2.0/tests/data/test039.result000066400000000000000000000041301355604302400205730ustar00rootroot00000000000000 Reading GPS Data... Correlate: test.jpg: Exact match: Lat 49.297687, Long -123.134272, Elev -2.000. Completed correlation process. Used time zone offset -8:00 Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:03:11 01:59:30 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:03:11 01:59:30 0x9004 Photo DateTimeDigitized Ascii 20 2012:03:11 01:59:30 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 49/1 17/1 516746807/10000000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 123/1 8/1 33795547/10000000 0x0005 GPSInfo GPSAltitudeRef Byte 1 1 0x0006 GPSInfo GPSAltitude Rational 1 20/10 0x0007 GPSInfo GPSTimeStamp Rational 3 9/1 59/1 30/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:03:11 gpscorrelate-2.0/tests/data/test040.param000066400000000000000000000012071355604302400203470ustar00rootroot00000000000000TITLE='Correlate a file with automatic time zone detection, during DST overlap' PRECOMMAND='cat "$STAGINGDIR/point7-1.jpg" >"$LOGDIR/test.jpg"' # This time zone is equivalent to America/Vancouver (at least, in 2012) # but should be more portable than using the symbolic name. # Run in C locale to avoid errors when comparing numbers in output COMMAND='env LC_ALL=C TZ="PST8PDT,M3.2.0,M11.1.0" $PROGRAM -v -g "$STAGINGDIR/track5.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 SEDCOMMAND='s@^/.*/|.*Copyright.*$@@' # strip path and copyright line gpscorrelate-2.0/tests/data/test040.result000066400000000000000000000041351355604302400205700ustar00rootroot00000000000000 Reading GPS Data... Correlate: test.jpg: Exact match: Lat 49.334980, Long -122.974616, Elev 366.900. Completed correlation process. Used time zone offset -7:00 Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:04 01:01:30 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:04 01:01:30 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:04 01:01:30 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 49/1 20/1 59269337/10000000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 122/1 58/1 286160246/10000000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 36690/100 0x0007 GPSInfo GPSTimeStamp Rational 3 8/1 1/1 30/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:04 gpscorrelate-2.0/tests/data/test041.param000066400000000000000000000005361355604302400203540ustar00rootroot00000000000000TITLE='Correlate a file with rounding to first point' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --no-interpolation --photooffset -30 -z 0 -g "$STAGINGDIR/track2.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test041.result000066400000000000000000000042051355604302400205670ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: < Completed correlation process. Matched: 1 (0 Exact, 0 Interpolated, 1 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 47/1 25/1 16248000/1000000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 10/1 59/1 9240000/1000000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 2930000/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 0/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test042.param000066400000000000000000000010041355604302400203440ustar00rootroot00000000000000TITLE='Correlate a file with --timeadd west of UTC and aligned on the half hour' PRECOMMAND='cat "$STAGINGDIR/point3-1.jpg" >"$LOGDIR/test.jpg"' # Run in C locale to avoid errors when comparing numbers in output COMMAND='env LC_ALL=C $PROGRAM --timeadd -3:30 -v -g "$STAGINGDIR/track6.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 SEDCOMMAND='s@^([a-zA-Z]:)?/.*/|.*Copyright.*$@@' # strip path and copyright line gpscorrelate-2.0/tests/data/test042.result000066400000000000000000000041071355604302400205710ustar00rootroot00000000000000 Reading GPS Data... Correlate: test.jpg: Exact match: Lat 47.570500, Long -52.681050, Elev 130.000. Completed correlation process. Used time zone offset -3:30 Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 07:04:00 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 07:04:00 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 07:04:00 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 47/1 34/1 1380/100 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 52/1 40/1 5178/100 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 1300/10 0x0007 GPSInfo GPSTimeStamp Rational 3 10/1 34/1 0/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test043.param000066400000000000000000000007461355604302400203610ustar00rootroot00000000000000TITLE='Correlate a file with --timeadd east of UTC' PRECOMMAND='cat "$STAGINGDIR/point4-1.jpg" >"$LOGDIR/test.jpg"' # Run in C locale to avoid errors when comparing numbers in output COMMAND='env LC_ALL=C $PROGRAM --timeadd 1:00 -v -g "$STAGINGDIR/track2.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 SEDCOMMAND='s@^([a-zA-Z]:)?/.*/|.*Copyright.*$@@' # strip path and copyright line gpscorrelate-2.0/tests/data/test043.result000066400000000000000000000041321355604302400205700ustar00rootroot00000000000000 Reading GPS Data... Correlate: test.jpg: Exact match: Lat 47.421240, Long 10.985200, Elev 2962.000. Completed correlation process. Used time zone offset 1:00 Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 13:35:00 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 13:35:00 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 13:35:00 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 47/1 25/1 16464000/1000000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 10/1 59/1 6720000/1000000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 2962000/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 35/1 0/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test044.param000066400000000000000000000007671355604302400203650ustar00rootroot00000000000000TITLE='Fix a bad GPS date with --fix-datestamps' PRECOMMAND='cat "$STAGINGDIR/baddate.jpg" >"$LOGDIR/test.jpg"' # Run in C locale to avoid errors when comparing days of week in output COMMAND='env LC_ALL=C $PROGRAM --fix-datestamps -z -7 "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1 && $PROGRAM --fix-datestamps -z -7 "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 SEDCOMMAND='s@^([a-zA-Z]:)?/.*/@@' # strip path gpscorrelate-2.0/tests/data/test044.result000066400000000000000000000037701355604302400206000ustar00rootroot00000000000000test.jpg: Wrong timestamp: Photo: Thu Nov 22 06:35:00 2012 UTC GPS: Sat Dec 22 05:35:00 2012 UTC Corrected: Thu Nov 22 06:35:00 2012 UTC 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:21 23:35:00 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:21 23:35:00 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:21 23:35:00 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 0 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude SRational 3 37/1 2522/100 0/1 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude SRational 3 122/1 504/100 0/1 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude SRational 1 10/1 0x0007 GPSInfo GPSTimeStamp Rational 3 6/1 35/1 0/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 test.jpg: Timestamp is OK: Photo 2012:11:21 23:35:00 (localtime), GPS 2012:11:22 06:35:00 (UTC). gpscorrelate-2.0/tests/data/test045.param000066400000000000000000000007231355604302400203560ustar00rootroot00000000000000TITLE='Correlate a file and make sure --fix-datestamps does not touch it' PRECOMMAND='cat "$STAGINGDIR/point4-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --timeadd 1 -g "$STAGINGDIR/track2.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1 && $PROGRAM --fix-datestamps --timeadd 1 "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 SEDCOMMAND='s@^([a-zA-Z]:)?/.*/@@' # strip path gpscorrelate-2.0/tests/data/test045.result000066400000000000000000000043461355604302400206010ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 13:35:00 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 13:35:00 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 13:35:00 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 47/1 25/1 16464000/1000000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 10/1 59/1 6720000/1000000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 2962000/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 35/1 0/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 test.jpg: Timestamp is OK: Photo 2012:11:22 13:35:00 (localtime), GPS 2012:11:22 12:35:00 (UTC). gpscorrelate-2.0/tests/data/test046.param000066400000000000000000000004041355604302400203530ustar00rootroot00000000000000TITLE='Correlate with a GPX file without time stamps' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/notimes.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=2 gpscorrelate-2.0/tests/data/test046.result000066400000000000000000000005601355604302400205740ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: - Completed correlation process. Matched: 0 (0 Exact, 0 Interpolated, 0 Rounded). Failed: 1 (1 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) gpscorrelate-2.0/tests/data/test047.param000066400000000000000000000004241355604302400203560ustar00rootroot00000000000000TITLE='Correlate with a GPX file without time stamps or elevations' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/notimeele.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=2 gpscorrelate-2.0/tests/data/test047.result000066400000000000000000000005601355604302400205750ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: - Completed correlation process. Matched: 0 (0 Exact, 0 Interpolated, 0 Rounded). Failed: 1 (1 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) gpscorrelate-2.0/tests/data/test048.param000066400000000000000000000004761355604302400203660ustar00rootroot00000000000000TITLE='Correlate with a GPX file without elevations' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/noelevations.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test048.result000066400000000000000000000037551355604302400206070ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 37/1 25/1 13505/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 122/1 5/1 2497/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test049.param000066400000000000000000000002171355604302400203600ustar00rootroot00000000000000TITLE='Correlate a non-JPEG file' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/track1.gpx" "$STAGINGDIR/dummy.xhtml" > "$OUTFILE" 2>&1' RESULTCODE=2 gpscorrelate-2.0/tests/data/test049.result000066400000000000000000000005601355604302400205770ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: ? Completed correlation process. Matched: 0 (0 Exact, 0 Interpolated, 0 Rounded). Failed: 1 (0 Not matched, 0 Write failure, 0 Too Far, 1 No Date, 0 GPS Already Present.) gpscorrelate-2.0/tests/data/test050.param000066400000000000000000000001631355604302400203500ustar00rootroot00000000000000TITLE='Correlate missing image file' COMMAND='$PROGRAM -g "$STAGINGDIR/track1.gpx" > "$OUTFILE" 2>&1' RESULTCODE=1 gpscorrelate-2.0/tests/data/test050.result000066400000000000000000000001001355604302400205550ustar00rootroot00000000000000Reading GPS Data...At least one image file name must be given. gpscorrelate-2.0/tests/data/test051.param000066400000000000000000000006401355604302400203510ustar00rootroot00000000000000TITLE='Fix a bad GPS date with --fix-datestamps on a read-only file' PRECOMMAND='cat "$STAGINGDIR/baddate.jpg" >"$LOGDIR/test.jpg" && chmod a-w "$LOGDIR/test.jpg"' # Run in C locale to avoid errors when comparing days of week in output COMMAND='env LC_ALL=C $PROGRAM --fix-datestamps -z -7 "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=1 SEDCOMMAND='1s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test051.result000066400000000000000000000002341355604302400205660ustar00rootroot00000000000000test.jpg: Wrong timestamp: Photo: Thu Nov 22 06:35:00 2012 UTC GPS: Sat Dec 22 05:35:00 2012 UTC Corrected: Thu Nov 22 06:35:00 2012 UTC gpscorrelate-2.0/tests/data/test052.param000066400000000000000000000002311355604302400203460ustar00rootroot00000000000000TITLE='Show GPS data on non-JPEG file' COMMAND='$PROGRAM -s "$STAGINGDIR/dummy.xhtml" > "$OUTFILE" 2>&1' RESULTCODE=1 SEDCOMMAND='s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test052.result000066400000000000000000000000331355604302400205640ustar00rootroot00000000000000dummy.xhtml: No EXIF data. gpscorrelate-2.0/tests/data/test053.param000066400000000000000000000015351355604302400203570ustar00rootroot00000000000000TITLE='Correlate many files, mostly unsuccessfully' PRECOMMAND='for f in baddate.jpg noexif.jpg notime.jpg point1-1.jpg point1-2.jpg point2-1.jpg point2-2.jpg point7-1.jpg point3-1.jpg point4-1.jpg withgps.jpg; do cat "$STAGINGDIR/$f" >"$LOGDIR/test-$f"; done' COMMAND='$PROGRAM -t --photooffset -16 -z 0 -g "$STAGINGDIR/track3.gpx" "$LOGDIR"/test-baddate.jpg "$LOGDIR"/test-noexif.jpg "$LOGDIR"/test-notime.jpg "$LOGDIR"/test-point1-1.jpg "$LOGDIR"/test-point1-2.jpg "$LOGDIR"/test-point2-1.jpg "$LOGDIR"/test-point2-2.jpg "$LOGDIR"/test-point7-1.jpg "$LOGDIR"/test-point3-1.jpg "$LOGDIR"/test-point4-1.jpg "$LOGDIR"/test-withgps.jpg > "$OUTFILE" 2>&1' POSTCOMMAND='for f in baddate.jpg noexif.jpg notime.jpg point1-1.jpg point1-2.jpg point2-1.jpg point2-2.jpg point7-1.jpg point3-1.jpg point4-1.jpg withgps.jpg; do rm -f "$LOGDIR/test-$f"; done' RESULTCODE=2 gpscorrelate-2.0/tests/data/test053.result000066400000000000000000000005721355604302400205750ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: !??./-----! Completed correlation process. Matched: 2 (1 Exact, 1 Interpolated, 0 Rounded). Failed: 9 (5 Not matched, 0 Write failure, 0 Too Far, 2 No Date, 2 GPS Already Present.) gpscorrelate-2.0/tests/data/test054.param000066400000000000000000000020371355604302400203560ustar00rootroot00000000000000TITLE='Correlate many files, with a write failure' PRECOMMAND='for f in baddate.jpg noexif.jpg notime.jpg point1-1.jpg point1-2.jpg point2-1.jpg point2-2.jpg point7-1.jpg point3-1.jpg point4-1.jpg withgps.jpg; do cat "$STAGINGDIR/$f" >"$LOGDIR/test-$f"; done && chmod a-w "$LOGDIR/test-point1-2.jpg"' # Run in C locale to avoid errors when comparing numbers in output COMMAND='env LC_ALL=C $PROGRAM --verbose -t -z 0 -g "$STAGINGDIR/track3.gpx" "$LOGDIR"/test-baddate.jpg "$LOGDIR"/test-noexif.jpg "$LOGDIR"/test-notime.jpg "$LOGDIR"/test-point1-1.jpg "$LOGDIR"/test-point1-2.jpg "$LOGDIR"/test-point2-1.jpg "$LOGDIR"/test-point2-2.jpg "$LOGDIR"/test-point7-1.jpg "$LOGDIR"/test-point3-1.jpg "$LOGDIR"/test-point4-1.jpg "$LOGDIR"/test-withgps.jpg > "$OUTFILE" 2>&1' POSTCOMMAND='for f in baddate.jpg noexif.jpg notime.jpg point1-1.jpg point1-2.jpg point2-1.jpg point2-2.jpg point7-1.jpg point3-1.jpg point4-1.jpg withgps.jpg; do rm -f "$LOGDIR/test-$f"; done' RESULTCODE=1 SEDCOMMAND='s@^([a-zA-Z]:)?/.*/|.*Copyright.*$@@' # strip path and copyright line gpscorrelate-2.0/tests/data/test054.result000066400000000000000000000013431355604302400205730ustar00rootroot00000000000000 Reading GPS Data... Correlate: test-baddate.jpg: GPS Data already present. test-noexif.jpg: No EXIF date tag present. test-notime.jpg: No EXIF date tag present. test-point1-1.jpg: Interpolated: Lat 31.458741, Long 35.399847, Elev -422.244. test-point1-2.jpg: EXIF write failure: Lat 31.458805, Long 35.399771, Elev -419.713. test-point2-1.jpg: No match. test-point2-2.jpg: No match. test-point7-1.jpg: No match. test-point3-1.jpg: No match. test-point4-1.jpg: No match. test-withgps.jpg: GPS Data already present. Completed correlation process. Used time zone offset 0:00 Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 10 (5 Not matched, 1 Write failure, 0 Too Far, 2 No Date, 2 GPS Already Present.) gpscorrelate-2.0/tests/data/test055.param000066400000000000000000000002511355604302400203530ustar00rootroot00000000000000TITLE='Show GPS data on file without a proper date tag' COMMAND='$PROGRAM -s "$STAGINGDIR/notime.jpg" > "$OUTFILE" 2>&1' RESULTCODE=1 SEDCOMMAND='s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test055.result000066400000000000000000000000321355604302400205660ustar00rootroot00000000000000notime.jpg: No EXIF data. gpscorrelate-2.0/tests/data/test056.param000066400000000000000000000004351355604302400203600ustar00rootroot00000000000000TITLE='Use --fix-datestamps on a file with no GPS tags' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --fix-datestamps -z 0 "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=1 SEDCOMMAND='s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test056.result000066400000000000000000000000271355604302400205730ustar00rootroot00000000000000test.jpg: No GPS data. gpscorrelate-2.0/tests/data/test057.param000066400000000000000000000004341355604302400203600ustar00rootroot00000000000000TITLE='Use --fix-datestamps on a file with no EXIF tags' PRECOMMAND='cat "$STAGINGDIR/noexif.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --fix-datestamps -z 0 "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=1 SEDCOMMAND='s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test057.result000066400000000000000000000000301355604302400205660ustar00rootroot00000000000000test.jpg: No EXIF data. gpscorrelate-2.0/tests/data/test058.param000066400000000000000000000004251355604302400203610ustar00rootroot00000000000000TITLE='Use --fix-datestamps with missing --timeadd' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --fix-datestamps "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=1 SEDCOMMAND='s@^/.*/@@' # strip path gpscorrelate-2.0/tests/data/test058.result000066400000000000000000000000761355604302400206010ustar00rootroot00000000000000A time offset must be given with the -z option to fix photos. gpscorrelate-2.0/tests/data/test059.param000066400000000000000000000003711355604302400203620ustar00rootroot00000000000000TITLE='Show GPS data on file with negative elevation' # Run in C locale to avoid errors when comparing numbers in output COMMAND='env LC_ALL=C $PROGRAM -s "$STAGINGDIR/point1-3.jpg" > "$OUTFILE" 2>&1' RESULTCODE=0 SEDCOMMAND='s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test059.result000066400000000000000000000001261355604302400205760ustar00rootroot00000000000000point1-3.jpg: 2012:11:22 12:34:56, Lat 31.458741, Long 35.399847, Elevation -422.243. gpscorrelate-2.0/tests/data/test060.param000066400000000000000000000022241355604302400203510ustar00rootroot00000000000000TITLE='Test that --no-mtime is implied by --fix-datestamps' # This is a strange way to test this, but I haven't found a better means that's # both simple && highly portable. This method just compares the relative mtime # of the file under test and a just-created file with ls -t and ensures that # the file under test is older than the other. # # This makes several assumptions: # 1) the filesystem and ls command operate at one second resolution # 2) when two files have the same mtime, ls -t will output them in # lexicographic order # The failure of either assumption is designed to cause a false negative # result, so they should not disrupt operation of the test suite. PRECOMMAND='cat "$STAGINGDIR/baddate.jpg" >"$LOGDIR/test.jpg" && touch -t 201001020304.05 "$LOGDIR/test.jpg" && touch "$LOGDIR/ztest.jpg"' # Run in C locale to avoid errors when comparing days of week in output COMMAND='env LC_ALL=C $PROGRAM --fix-datestamps -z -7 "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && ls -t "$LOGDIR/ztest.jpg" "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg" "$LOGDIR/ztest.jpg"' RESULTCODE=0 SEDCOMMAND='s@([a-zA-Z]:)?/[^ ].*/@@' # strip paths gpscorrelate-2.0/tests/data/test060.result000066400000000000000000000002571355604302400205730ustar00rootroot00000000000000test.jpg: Wrong timestamp: Photo: Thu Nov 22 06:35:00 2012 UTC GPS: Sat Dec 22 05:35:00 2012 UTC Corrected: Thu Nov 22 06:35:00 2012 UTC ztest.jpg test.jpg gpscorrelate-2.0/tests/data/test061.param000066400000000000000000000020301355604302400203450ustar00rootroot00000000000000TITLE='Remove GPS tags with --no-mtime' # This is a strange way to test this, but I haven't found a better means that's # both simple && highly portable. This method just compares the relative mtime # of the file under test and a just-created file with ls -t and ensures that # the file under test is older than the other. # # This makes several assumptions: # 1) the filesystem and ls command operate at one second resolution # 2) when two files have the same mtime, ls -t will output them in # lexicographic order # The failure of either assumption is designed to cause a false negative # result, so they should not disrupt operation of the test suite. PRECOMMAND='cat "$STAGINGDIR/withgps.jpg" >"$LOGDIR/test.jpg" && touch -t 201001020304.05 "$LOGDIR/test.jpg" && touch "$LOGDIR/ztest.jpg"' COMMAND='$PROGRAM --no-mtime --remove "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && ls -t "$LOGDIR/ztest.jpg" "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg" "$LOGDIR/ztest.jpg"' RESULTCODE=0 SEDCOMMAND='s@^.*/@@' # strip paths gpscorrelate-2.0/tests/data/test061.result000066400000000000000000000000571355604302400205720ustar00rootroot00000000000000test.jpg: Removed GPS tags. ztest.jpg test.jpg gpscorrelate-2.0/tests/data/test062.param000066400000000000000000000004741355604302400203600ustar00rootroot00000000000000TITLE='Correlate a file in the southern hemisphere' PRECOMMAND='cat "$STAGINGDIR/point5-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z -14:00 -g "$STAGINGDIR/track7.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test062.result000066400000000000000000000037561355604302400206040ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2001:11:04 16:52:58 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2001:11:04 16:52:58 0x9004 Photo DateTimeDigitized Ascii 20 2001:11:04 16:52:58 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 S 0x0002 GPSInfo GPSLatitude Rational 3 19/1 40/1 16619/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 174/1 17/1 22060/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 6/1 52/1 58/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2001:11:05 gpscorrelate-2.0/tests/data/test063.param000066400000000000000000000007661355604302400203650ustar00rootroot00000000000000TITLE='Show GPS data on file in southern hemisphere' # Synthesize an appropriate file on which the run the real test PRECOMMAND='cat "$STAGINGDIR/point5-1.jpg" >"$LOGDIR/test.jpg" && $PROGRAM -z -14:00 -g "$STAGINGDIR/track7.gpx" "$LOGDIR/test.jpg" 2>"$OUTFILE" > /dev/null' # Run in C locale to avoid errors when comparing numbers in output COMMAND='env LC_ALL=C $PROGRAM -s "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 SEDCOMMAND='s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test063.result000066400000000000000000000001261355604302400205710ustar00rootroot00000000000000test.jpg: 2001:11:04 16:52:58, Lat -19.671283, Long -174.289461, Elevation (unknown). gpscorrelate-2.0/tests/data/test064.param000066400000000000000000000006231355604302400203560ustar00rootroot00000000000000TITLE='Correlate a file with several GPX files, using last' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/track7.gpx" -g "$STAGINGDIR/track5.gpx" -g "$STAGINGDIR/track4.gpx" -g "$STAGINGDIR/track1.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test064.result000066400000000000000000000042561355604302400206020ustar00rootroot00000000000000Reading GPS Data... Reading GPS Data... Reading GPS Data... Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 37/1 25/1 13505/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 122/1 5/1 2497/1000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 10/1 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test065.param000066400000000000000000000006251355604302400203610ustar00rootroot00000000000000TITLE='Correlate a file with several GPX files, using middle' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/track5.gpx" -g "$STAGINGDIR/track1.gpx" -g "$STAGINGDIR/track7.gpx" -g "$STAGINGDIR/track4.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test065.result000066400000000000000000000042561355604302400206030ustar00rootroot00000000000000Reading GPS Data... Reading GPS Data... Reading GPS Data... Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 37/1 25/1 13505/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 122/1 5/1 2497/1000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 10/1 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test066.param000066400000000000000000000006241355604302400203610ustar00rootroot00000000000000TITLE='Correlate a file with several GPX files, using first' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/track1.gpx" -g "$STAGINGDIR/track4.gpx" -g "$STAGINGDIR/track5.gpx" -g "$STAGINGDIR/track7.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test066.result000066400000000000000000000042561355604302400206040ustar00rootroot00000000000000Reading GPS Data... Reading GPS Data... Reading GPS Data... Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 37/1 25/1 13505/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 122/1 5/1 2497/1000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 10/1 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test067.param000066400000000000000000000006051355604302400203610ustar00rootroot00000000000000TITLE='Correlate a file with several GPX files, including a corrupt one' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/track4.gpx" -g "$STAGINGDIR/dummy.xhtml" -g "$STAGINGDIR/track1.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=1 gpscorrelate-2.0/tests/data/test067.result000066400000000000000000000000721355604302400205750ustar00rootroot00000000000000Reading GPS Data... Reading GPS Data...Invalid GPX file. gpscorrelate-2.0/tests/data/test068.param000066400000000000000000000004661355604302400203670ustar00rootroot00000000000000TITLE='Correlate a file on Feb 29 on a leap year' PRECOMMAND='cat "$STAGINGDIR/point6-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z +1 -g "$STAGINGDIR/track8.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test068.result000066400000000000000000000042011355604302400205740ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:02:29 10:09:14 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:02:29 10:09:14 0x9004 Photo DateTimeDigitized Ascii 20 2012:02:29 10:09:14 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 47/1 21/1 1823040/100000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 10/1 10/1 5669040/100000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 1062875/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 9/1 9/1 14/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:02:29 gpscorrelate-2.0/tests/data/test069.param000066400000000000000000000005171355604302400203650ustar00rootroot00000000000000TITLE='Correlate a file with GPX containing empty and other sections' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/track9.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test069.result000066400000000000000000000037551355604302400206120ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 37/1 25/1 13505/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 122/1 5/1 2497/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test070.param000066400000000000000000000005301355604302400203500ustar00rootroot00000000000000TITLE='Correlate a file with GPX containing multiple tracks, point in first track' PRECOMMAND='cat "$STAGINGDIR/point3-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z -7 -g "$STAGINGDIR/track10.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test070.result000066400000000000000000000041721355604302400205740ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 07:04:00 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 07:04:00 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 07:04:00 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 38/1 41/1 52606/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 109/1 39/1 52268/1000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 1312337/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 14/1 4/1 0/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test071.param000066400000000000000000000005311355604302400203520ustar00rootroot00000000000000TITLE='Correlate a file with GPX containing multiple tracks, point in second track' PRECOMMAND='cat "$STAGINGDIR/point1-2.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z -7 -g "$STAGINGDIR/track10.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test071.result000066400000000000000000000041741355604302400205770ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:35:20 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:35:20 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:35:20 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 38/1 35/1 54874/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 109/1 34/1 24506/1000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 1180156/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 19/1 35/1 20/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test072.param000066400000000000000000000005701355604302400203560ustar00rootroot00000000000000TITLE='Correlate a file with GPX containing multiple tracks, point interpolated between tracks' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --ignore-tracksegs -z -7 -g "$STAGINGDIR/track10.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test072.result000066400000000000000000000041741355604302400206000ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 38/1 41/1 21255/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 109/1 39/1 23910/1000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 1177919/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 19/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test073.param000066400000000000000000000005171355604302400203600ustar00rootroot00000000000000TITLE='Correlate a file with interpolation with GPX missing one elevation' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/track11.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test073.result000066400000000000000000000037711355604302400206030ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 47/1 25/1 16449600/1000000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 10/1 59/1 6888000/1000000 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test074.param000066400000000000000000000004731355604302400203620ustar00rootroot00000000000000TITLE='Test --datum option with empty value' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --datum "" -z 0 -g "$STAGINGDIR/track1.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test074.result000066400000000000000000000040541355604302400205770ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 37/1 25/1 13505/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 122/1 5/1 2497/1000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 10/1 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test075.param000066400000000000000000000006441355604302400203630ustar00rootroot00000000000000TITLE='Test -V option' COMMAND='$PROGRAM -V > "$OUTFILE" 2>&1' RESULTCODE=0 # Strip path and copyright lines, but do so in a way that checks the basic # format of the line. All other tests that could see this line strip it # completely, so this one also acts as a basic check that the line is being # output at all. SEDCOMMAND='s@^([a-zA-Z]:)?(.*[/\\])?(gpscorrelate)(\.exe)?.*( Copyright.*200.-).*( Daniel).*$@\3\5\6@' gpscorrelate-2.0/tests/data/test075.result000066400000000000000000000002771355604302400206030ustar00rootroot00000000000000gpscorrelate Copyright (C) 2005- Daniel This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. gpscorrelate-2.0/tests/data/test076.param000066400000000000000000000004771355604302400203700ustar00rootroot00000000000000TITLE='Test -h option' # Uses two lines of the help output as a canary, assuming that if the display # fine, the rest do, too. This avoids having to update the test data for # every minor change to the help output. COMMAND='$PROGRAM -h > "$OUTFILE" 2>&1' RESULTCODE=0 SEDCOMMAND='/Display/!d' # Delete non-canary lines gpscorrelate-2.0/tests/data/test076.result000066400000000000000000000001501355604302400205720ustar00rootroot00000000000000-h, --help Display this help message -V, --version Display version information gpscorrelate-2.0/tests/data/test077.param000066400000000000000000000015461355604302400203670ustar00rootroot00000000000000TITLE='Test unrecognized option' COMMAND='$PROGRAM --not-a-supported-option > "$OUTFILE" 2>&1' RESULTCODE=1 # glibc: /path/gpscorrelate: unrecognized option '--not-a-supported-option' # Older glibc: /path/gpscorrelate: unrecognized option `--not-a-supported-option` # FreeBSD: gpscorrelate: unrecognized option `--not-a-supported-option' # OS X: /path/gpscorrelate: unrecognized option '--not-a-supported-option' # MUSL: /path/gpscorrelate: unrecognized option: not-a-supported-option # Cygwin: gpscorrelate: unknown option -- not-a-supported-option # MSYS2: C:\projects\gpscorrelate\gpscorrelate.exe: unknown option -- not-a-supported-option # Work around all these differences by extracting only the important and common # parts of the output. SEDCOMMAND='s@^([a-zA-Z]:)?(\\.*\\|.*/)?(gpscorrelate)(\.exe)?(:).*( option):?( ).*(not-a-supported-option).*$@\3\5\6\7\8@' gpscorrelate-2.0/tests/data/test077.result000066400000000000000000000000541355604302400205760ustar00rootroot00000000000000gpscorrelate: option not-a-supported-option gpscorrelate-2.0/tests/data/test078.param000066400000000000000000000005541355604302400203660ustar00rootroot00000000000000TITLE='Test invocation with no arguments' # This is identical to -h # Uses two lines of the help output as a canary, assuming that if the display # fine, the rest do, too. This avoids having to update the test data for # every minor change to the help output. COMMAND='$PROGRAM -h > "$OUTFILE" 2>&1' RESULTCODE=0 SEDCOMMAND='/Display/!d' # Delete non-canary lines gpscorrelate-2.0/tests/data/test078.result000066400000000000000000000001501355604302400205740ustar00rootroot00000000000000-h, --help Display this help message -V, --version Display version information gpscorrelate-2.0/tests/data/test079.param000066400000000000000000000006521355604302400203660ustar00rootroot00000000000000TITLE='Test --fix-datestamps with --no-write' PRECOMMAND='cat "$STAGINGDIR/baddate.jpg" >"$LOGDIR/test.jpg"' # Run in C locale to avoid errors when comparing days of week in output COMMAND='env LC_ALL=C $PROGRAM --no-write --fix-datestamps -z -7 "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 SEDCOMMAND='1s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test079.result000066400000000000000000000036351355604302400206100ustar00rootroot00000000000000test.jpg: Wrong timestamp: Photo: Thu Nov 22 06:35:00 2012 UTC GPS: Sat Dec 22 05:35:00 2012 UTC Corrected: Thu Nov 22 06:35:00 2012 UTC 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:21 23:35:00 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:21 23:35:00 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:21 23:35:00 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 0 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude SRational 3 37/1 2522/100 0/1 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude SRational 3 122/1 504/100 0/1 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude SRational 1 10/1 0x0007 GPSInfo GPSTimeStamp SRational 3 5/1 35/1 0/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp SRational 3 2012/1 12/1 22/1 gpscorrelate-2.0/tests/data/test080.param000066400000000000000000000001741355604302400203550ustar00rootroot00000000000000TITLE='Test --fix-datestamps with no file provided' COMMAND='$PROGRAM --fix-datestamps -z 0 > "$OUTFILE" 2>&1' RESULTCODE=1 gpscorrelate-2.0/tests/data/test080.result000066400000000000000000000000541355604302400205700ustar00rootroot00000000000000At least one image file name must be given. gpscorrelate-2.0/tests/data/test081.param000066400000000000000000000002131355604302400203500ustar00rootroot00000000000000TITLE='Test --fix-datestamps with nonexistent file' COMMAND='$PROGRAM --fix-datestamps -z 0 does-not-exist > "$OUTFILE" 2>&1' RESULTCODE=1 gpscorrelate-2.0/tests/data/test081.result000066400000000000000000000000361355604302400205710ustar00rootroot00000000000000does-not-exist: No EXIF data. gpscorrelate-2.0/tests/data/test082.param000066400000000000000000000006631355604302400203620ustar00rootroot00000000000000TITLE='Fix bad date with --fix-datestamps with corrupt lat/long' PRECOMMAND='cat "$STAGINGDIR/baddate2.jpg" >"$LOGDIR/test.jpg"' # Run in C locale to avoid errors when comparing days of week in output COMMAND='env LC_ALL=C $PROGRAM --fix-datestamps -z -7 "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 SEDCOMMAND='1s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test082.result000066400000000000000000000036221355604302400205760ustar00rootroot00000000000000test.jpg: Wrong timestamp: Photo: Thu Nov 22 06:35:00 2012 UTC GPS: Sat Dec 22 05:35:00 2012 UTC Corrected: Thu Nov 22 06:35:00 2012 UTC 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:21 23:35:00 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:21 23:35:00 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:21 23:35:00 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 0 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 1 3742033/100000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 1 12208400/100000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude SRational 1 10/1 0x0007 GPSInfo GPSTimeStamp Rational 3 6/1 35/1 0/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test083.param000066400000000000000000000003671355604302400203640ustar00rootroot00000000000000TITLE='Show GPS data on file with corrupt lat/long' # Run in C locale to avoid errors when comparing numbers in output COMMAND='env LC_ALL=C $PROGRAM -s "$STAGINGDIR/baddate2.jpg" > "$OUTFILE" 2>&1' RESULTCODE=0 SEDCOMMAND='s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test083.result000066400000000000000000000000601355604302400205700ustar00rootroot00000000000000baddate2.jpg: 2012:11:21 23:35:00, No GPS Data. gpscorrelate-2.0/tests/data/test084.param000066400000000000000000000001521355604302400203550ustar00rootroot00000000000000TITLE='Remove GPS tags with file not provided' COMMAND='$PROGRAM --remove > "$OUTFILE" 2>&1' RESULTCODE=1 gpscorrelate-2.0/tests/data/test084.result000066400000000000000000000000541355604302400205740ustar00rootroot00000000000000At least one image file name must be given. gpscorrelate-2.0/tests/data/test085.param000066400000000000000000000001701355604302400203560ustar00rootroot00000000000000TITLE='Remove GPS tags with nonexistent file' COMMAND='$PROGRAM --remove does-not-exist > "$OUTFILE" 2>&1' RESULTCODE=1 gpscorrelate-2.0/tests/data/test085.result000066400000000000000000000000451355604302400205750ustar00rootroot00000000000000does-not-exist: Tag removal failure. gpscorrelate-2.0/tests/data/test086.param000066400000000000000000000001411355604302400203550ustar00rootroot00000000000000TITLE='Show GPS tags with missing file' COMMAND='$PROGRAM --show > "$OUTFILE" 2>&1' RESULTCODE=1 gpscorrelate-2.0/tests/data/test086.result000066400000000000000000000000541355604302400205760ustar00rootroot00000000000000At least one image file name must be given. gpscorrelate-2.0/tests/data/test087.param000066400000000000000000000001421355604302400203570ustar00rootroot00000000000000TITLE='Show GPS tags with file not provided' COMMAND='$PROGRAM -s > "$OUTFILE" 2>&1' RESULTCODE=1 gpscorrelate-2.0/tests/data/test087.result000066400000000000000000000000541355604302400205770ustar00rootroot00000000000000At least one image file name must be given. gpscorrelate-2.0/tests/data/test088.param000066400000000000000000000005031355604302400203610ustar00rootroot00000000000000TITLE='Correlate a file with JPEG containing only GPS version tag' PRECOMMAND='cat "$STAGINGDIR/noloc.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z 0 -g "$STAGINGDIR/track1.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test088.result000066400000000000000000000041621355604302400206040ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 37/1 25/1 13505/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 122/1 5/1 2497/1000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 10/1 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test089.param000066400000000000000000000005061355604302400203650ustar00rootroot00000000000000TITLE='Remove GPS tags on file with only GPS version tag' PRECOMMAND='cat "$STAGINGDIR/noloc.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --remove "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 SEDCOMMAND='1s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test089.result000066400000000000000000000020101355604302400205730ustar00rootroot00000000000000test.jpg: Removed GPS tags. 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 122 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 gpscorrelate-2.0/tests/data/test090.param000066400000000000000000000005741355604302400203620ustar00rootroot00000000000000TITLE='Use --fix-datestamps on a file with only GPS version tags' PRECOMMAND='cat "$STAGINGDIR/noloc.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --fix-datestamps -z 0 "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' # This test results in a segfault with libexiv2 ver. 0.18 & 0.19 due to a libexiv2 bug. RESULTCODE=1 SEDCOMMAND='s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test090.result000066400000000000000000000000271355604302400205710ustar00rootroot00000000000000test.jpg: No GPS data. gpscorrelate-2.0/tests/data/test091.param000066400000000000000000000002371355604302400203570ustar00rootroot00000000000000TITLE='Show GPS data on file without GPS tags' COMMAND='$PROGRAM -s "$STAGINGDIR/noloc.jpg" > "$OUTFILE" 2>&1' RESULTCODE=0 SEDCOMMAND='s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test091.result000066400000000000000000000000551355604302400205730ustar00rootroot00000000000000noloc.jpg: 2012:11:22 12:34:56, No GPS Data. gpscorrelate-2.0/tests/data/test092.param000066400000000000000000000005201355604302400203530ustar00rootroot00000000000000TITLE='Test running without any arguments' # Uses two lines of the help output as a canary, assuming that if the display # fine, the rest do, too. This avoids having to update the test data for # every minor change to the help output. COMMAND='$PROGRAM > "$OUTFILE" 2>&1' RESULTCODE=0 SEDCOMMAND='/Display/!d' # Delete non-canary lines gpscorrelate-2.0/tests/data/test092.result000066400000000000000000000001501355604302400205700ustar00rootroot00000000000000-h, --help Display this help message -V, --version Display version information gpscorrelate-2.0/tests/data/test093.param000066400000000000000000000004641355604302400203630ustar00rootroot00000000000000TITLE='Correlate a file at very high altitude' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z -6 -g "$STAGINGDIR/track12.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test093.result000066400000000000000000000042041355604302400205750ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: . Completed correlation process. Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 42/1 58/1 4752286/100000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 95/1 41/1 3680617/100000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 15552736/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 18/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test094.param000066400000000000000000000004711355604302400203620ustar00rootroot00000000000000TITLE='Correlate a file at extremely high altitude' PRECOMMAND='cat "$STAGINGDIR/point4-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z -6 -g "$STAGINGDIR/track12.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test094.result000066400000000000000000000042031355604302400205750ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 13:35:00 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 13:35:00 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 13:35:00 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 42/1 24/1 5966986/100000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 95/1 9/1 1693819/100000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 999998990/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 19/1 35/1 0/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test095.param000066400000000000000000000005031355604302400203570ustar00rootroot00000000000000TITLE='Correlate a file at slightly more extreme altitude' PRECOMMAND='cat "$STAGINGDIR/point4-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -i -z -6 -g "$STAGINGDIR/track12.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test095.result000066400000000000000000000042031355604302400205760ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: < Completed correlation process. Matched: 1 (0 Exact, 0 Interpolated, 1 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 13:35:00 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 13:35:00 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 13:35:00 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 42/1 24/1 5954112/100000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 95/1 9/1 1650046/100000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 100000000/100 0x0007 GPSInfo GPSTimeStamp Rational 3 19/1 35/1 30/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test096.param000066400000000000000000000005131355604302400203610ustar00rootroot00000000000000TITLE='Interpolate with a very long feather time' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --photooffset -4600 -z -6 -g "$STAGINGDIR/track12.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test096.result000066400000000000000000000042031355604302400205770ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 42/1 58/1 4694105/100000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 95/1 41/1 3625420/100000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 8140400/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 17/1 18/1 16/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test097.param000066400000000000000000000004551355604302400203670ustar00rootroot00000000000000TITLE='Show machine-readable GPS data on file with double quote in name' PRECOMMAND='cat "$STAGINGDIR/withgps.jpg" >"$LOGDIR/test\"\".jpg"' COMMAND='$PROGRAM --machine "$LOGDIR/test\"\".jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test\"\".jpg"' RESULTCODE=0 SEDCOMMAND='s@/.*/@@' # strip path gpscorrelate-2.0/tests/data/test097.result000066400000000000000000000001021355604302400205720ustar00rootroot00000000000000"test"""".jpg","2012:11:22 12:34:56",37.420418,-122.084027,10.000 gpscorrelate-2.0/tests/data/test098.param000066400000000000000000000006141355604302400203650ustar00rootroot00000000000000TITLE='Geotag a file from a specified latitude/longitude/elevation' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' # Run in C locale to correctly parse these decimal numbers COMMAND='env LC_ALL=C $PROGRAM -z+1 -l 12.34567,123.456,78.9 "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test098.result000066400000000000000000000041321355604302400206020ustar00rootroot00000000000000Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 12/1 20/1 4441/100 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 123/1 27/1 22/1 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 789/10 0x0007 GPSInfo GPSTimeStamp Rational 3 11/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test099.param000066400000000000000000000006131355604302400203650ustar00rootroot00000000000000TITLE='Geotag a file from a specified latitude/longitude w/o elevation' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' # Run in C locale to correctly parse these decimal numbers COMMAND='env LC_ALL=C $PROGRAM -z+1 -l -89.000001,179.9 "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test099.result000066400000000000000000000037171355604302400206130ustar00rootroot00000000000000Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 S 0x0002 GPSInfo GPSLatitude Rational 3 89/1 0/1 4/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 179/1 54/1 0/1 0x0007 GPSInfo GPSTimeStamp Rational 3 11/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test100.param000066400000000000000000000011231355604302400203410ustar00rootroot00000000000000TITLE='Geotag a file from a specified latitude/longitude (dms forms)' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' # A UTF-8 locale isn't strictly needed currently, but it's highly likely to be # present when the UTF-8 degrees symbol is being used, as it is here. # As can be seen, it's tricky to pass a single quote character into the test # suite. COMMAND='env LC_CTYPE=UTF-8 $PROGRAM -z+1 -l -34d56m08.9s,-90°0'"\\'"'59.11111\" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test100.result000066400000000000000000000037301355604302400205650ustar00rootroot00000000000000Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 S 0x0002 GPSInfo GPSLatitude Rational 3 34/1 56/1 89/10 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 90/1 0/1 5911111/100000 0x0007 GPSInfo GPSTimeStamp Rational 3 11/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test101.param000066400000000000000000000006461355604302400203530ustar00rootroot00000000000000TITLE='Geotag a file from a specified latitude/longitude/elevation, space separated' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' # Run in C locale to correctly parse these decimal numbers COMMAND='env LC_ALL=C $PROGRAM -z+1 -l 89.9999999\ 179.999\ 99999.999 "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test101.result000066400000000000000000000041451355604302400205670ustar00rootroot00000000000000Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 89/1 59/1 599996/10000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 179/1 59/1 56/1 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 99999999/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 11/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test102.param000066400000000000000000000006461355604302400203540ustar00rootroot00000000000000TITLE='Geotag a file from a specified latitude/longitude/elevation, tab separated' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' # Run in C locale to correctly parse these decimal numbers COMMAND='env LC_ALL=C $PROGRAM -z+1 -l "-89.9999999 -179.999 -9999.999" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test102.result000066400000000000000000000041441355604302400205670ustar00rootroot00000000000000Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 S 0x0002 GPSInfo GPSLatitude Rational 3 89/1 59/1 599996/10000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 179/1 59/1 56/1 0x0005 GPSInfo GPSAltitudeRef Byte 1 1 0x0006 GPSInfo GPSAltitude Rational 1 9999999/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 11/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test103.param000066400000000000000000000006521355604302400203520ustar00rootroot00000000000000TITLE='Geotag a file from a specified latitude/longitude, tab separated (dms forms)' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' # Run in C locale to correctly parse these decimal numbers COMMAND='env LC_ALL=C $PROGRAM -z+1 -l "-89d59m59.9999s -179d59m059.999s" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test103.result000066400000000000000000000037351355604302400205750ustar00rootroot00000000000000Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 S 0x0002 GPSInfo GPSLatitude Rational 3 89/1 59/1 599999/10000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 179/1 59/1 59999/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 11/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test104.param000066400000000000000000000006561355604302400203570ustar00rootroot00000000000000TITLE='Geotag a file from a specified latitude/longitude, space separated (dms forms)' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' # Run in C locale to correctly parse these decimal numbers COMMAND='env LC_ALL=C $PROGRAM -z+1 -l "+89d00m59.0000s +0179d059m059.000s" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test104.result000066400000000000000000000037341355604302400205750ustar00rootroot00000000000000Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 89/1 0/1 590000/10000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 179/1 59/1 59000/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 11/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test105.param000066400000000000000000000004631355604302400203540ustar00rootroot00000000000000TITLE='Specify out-of-range latitude' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' # Run in C locale to correctly parse these decimal numbers COMMAND='env LC_ALL=C $PROGRAM -l 92.34567,123.456,78.9 "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=1 gpscorrelate-2.0/tests/data/test105.result000066400000000000000000000000301355604302400205600ustar00rootroot00000000000000Error parsing location. gpscorrelate-2.0/tests/data/test106.param000066400000000000000000000003631355604302400203540ustar00rootroot00000000000000TITLE='Specify out-of-range latitude (dms form)' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -l -89d61m0s,123d0m0s "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=1 gpscorrelate-2.0/tests/data/test106.result000066400000000000000000000000301355604302400205610ustar00rootroot00000000000000Error parsing location. gpscorrelate-2.0/tests/data/test107.param000066400000000000000000000004571355604302400203610ustar00rootroot00000000000000TITLE='Specify out-of-range longitude' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' # Run in C locale to correctly parse these decimal numbers COMMAND='env LC_ALL=C $PROGRAM -l 92.34567,180.456 "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=1 gpscorrelate-2.0/tests/data/test107.result000066400000000000000000000000301355604302400205620ustar00rootroot00000000000000Error parsing location. gpscorrelate-2.0/tests/data/test108.param000066400000000000000000000003631355604302400203560ustar00rootroot00000000000000TITLE='Specify out-of-range longitude (dms form)' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -l 9d61m0s,123d0m61s "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=1 gpscorrelate-2.0/tests/data/test108.result000066400000000000000000000000301355604302400205630ustar00rootroot00000000000000Error parsing location. gpscorrelate-2.0/tests/data/test109.param000066400000000000000000000005011355604302400203510ustar00rootroot00000000000000TITLE='Remove GPS tags with --no-write' PRECOMMAND='cat "$STAGINGDIR/withgps.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --remove --no-write "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 SEDCOMMAND='1s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test109.result000066400000000000000000000034361355604302400206010ustar00rootroot00000000000000test.jpg: Removed GPS tags. 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 37/1 25/1 13504/1000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 122/1 5/1 2497/1000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 10/1 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test110.param000066400000000000000000000005131355604302400203440ustar00rootroot00000000000000TITLE='Geotag a file from a specified latitude/longitude (dms integer forms)' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM -z+1 -l 34d56m7s,-87d6m54s "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test110.result000066400000000000000000000037141355604302400205700ustar00rootroot00000000000000Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 34/1 56/1 7/1 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 87/1 6/1 54/1 0x0007 GPSInfo GPSTimeStamp Rational 3 11/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test111.param000066400000000000000000000011561355604302400203510ustar00rootroot00000000000000TITLE='Geotag a file from a specified latitude/longitude/elevation (dms forms with spaces)' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' # A UTF-8 locale isn't strictly needed currently, but it's highly likely to be # present when the UTF-8 degrees symbol is being used, as it is here. # As can be seen, it's tricky to pass a single quote character into the test # suite. COMMAND='env LC_CTYPE=UTF-8 $PROGRAM -z+1 -l "-34d 56m 8.9s, -90° 0m 59.11111s 123.4" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test111.result000066400000000000000000000041401355604302400205630ustar00rootroot00000000000000Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 S 0x0002 GPSInfo GPSLatitude Rational 3 34/1 56/1 89/10 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 90/1 0/1 5911111/100000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 1234/10 0x0007 GPSInfo GPSTimeStamp Rational 3 11/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test112.param000066400000000000000000000011661355604302400203530ustar00rootroot00000000000000TITLE='Geotag a file from a specified latitude/longitude/elevation (dms forms with spaces)' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' # A UTF-8 locale isn't strictly needed currently, but it's highly likely to be # present when the UTF-8 degrees symbol is being used, as it is here. # As can be seen, it's tricky to pass a single quote character into the test # suite. COMMAND='env LC_CTYPE=UTF-8 $PROGRAM -z+1 -l "-34d 56 08.9 -90° 0m 59.11111\" -123.4 " "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test112.result000066400000000000000000000041401355604302400205640ustar00rootroot00000000000000Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 S 0x0002 GPSInfo GPSLatitude Rational 3 34/1 56/1 89/10 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 90/1 0/1 5911111/100000 0x0005 GPSInfo GPSAltitudeRef Byte 1 1 0x0006 GPSInfo GPSAltitude Rational 1 1234/10 0x0007 GPSInfo GPSTimeStamp Rational 3 11/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test113.param000066400000000000000000000010051355604302400203440ustar00rootroot00000000000000TITLE='Geotag a file from a specified latitude/longitude (dms form with ISO 8859/1 decimal)' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' # The degree symbol is in ISO 8859/1 but since it's hard-coded in the program, # it's unnecessary to actually be running in an ISO 8859/1 locale to work. COMMAND='$PROGRAM -z+1 -l -34d56m08.9s,-900'"\\'"'59.11111\" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test113.result000066400000000000000000000037301355604302400205710ustar00rootroot00000000000000Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 S 0x0002 GPSInfo GPSLatitude Rational 3 34/1 56/1 89/10 0x0003 GPSInfo GPSLongitudeRef Ascii 2 W 0x0004 GPSInfo GPSLongitude Rational 3 90/1 0/1 5911111/100000 0x0007 GPSInfo GPSTimeStamp Rational 3 11/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test114.param000066400000000000000000000001641355604302400203520ustar00rootroot00000000000000TITLE='Show GPS data with nonexistent file' COMMAND='$PROGRAM --show does-not-exist > "$OUTFILE" 2>&1' RESULTCODE=1 gpscorrelate-2.0/tests/data/test114.result000066400000000000000000000000361355604302400205660ustar00rootroot00000000000000does-not-exist: No EXIF data. gpscorrelate-2.0/tests/data/test115.param000066400000000000000000000003621355604302400203530ustar00rootroot00000000000000TITLE='Show machine-readable GPS data with existing and nonexistent files' COMMAND='$PROGRAM -o "$STAGINGDIR/withgps.jpg" does-not-exist "$STAGINGDIR/withgps.jpg" > "$OUTFILE" 2>&1' RESULTCODE=0 SEDCOMMAND='s@([a-zA-Z]:)?/.*/@@' # strip path gpscorrelate-2.0/tests/data/test115.result000066400000000000000000000002021355604302400205620ustar00rootroot00000000000000"withgps.jpg","2012:11:22 12:34:56",37.420418,-122.084027,10.000 "withgps.jpg","2012:11:22 12:34:56",37.420418,-122.084027,10.000 gpscorrelate-2.0/tests/data/test116.param000066400000000000000000000001561355604302400203550ustar00rootroot00000000000000TITLE='Show machine-readable GPS tags with missing file' COMMAND='$PROGRAM -o > "$OUTFILE" 2>&1' RESULTCODE=1 gpscorrelate-2.0/tests/data/test116.result000066400000000000000000000000541355604302400205700ustar00rootroot00000000000000At least one image file name must be given. gpscorrelate-2.0/tests/data/test117.param000066400000000000000000000004611355604302400203550ustar00rootroot00000000000000TITLE='Show GPS data with existing and nonexistent files' # Run in C locale to avoid errors when comparing numbers in output COMMAND='env LC_ALL=C $PROGRAM -s "$STAGINGDIR/withgps.jpg" does-not-exist "$STAGINGDIR/withgps.jpg" > "$OUTFILE" 2>&1' RESULTCODE=1 SEDCOMMAND='s@([a-zA-Z]:)?/.*/@@' # strip path gpscorrelate-2.0/tests/data/test117.result000066400000000000000000000003101355604302400205640ustar00rootroot00000000000000withgps.jpg: 2012:11:22 12:34:56, Lat 37.420418, Long -122.084027, Elevation 10.000. does-not-exist: No EXIF data. withgps.jpg: 2012:11:22 12:34:56, Lat 37.420418, Long -122.084027, Elevation 10.000. gpscorrelate-2.0/tests/data/test118.param000066400000000000000000000005201355604302400203520ustar00rootroot00000000000000TITLE='Correlate a file already containing GPS tags with --replace' PRECOMMAND='cat "$STAGINGDIR/withgps.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --replace -z 0 -g "$STAGINGDIR/track2.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test118.result000066400000000000000000000042061355604302400205750ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 47/1 25/1 16449600/1000000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 10/1 59/1 6888000/1000000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 2959867/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test119.param000066400000000000000000000005061355604302400203570ustar00rootroot00000000000000TITLE='Correlate a file without GPS tags with --replace' PRECOMMAND='cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test.jpg"' COMMAND='$PROGRAM --replace -z 0 -g "$STAGINGDIR/track2.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' RESULTCODE=0 gpscorrelate-2.0/tests/data/test119.result000066400000000000000000000042061355604302400205760ustar00rootroot00000000000000Reading GPS Data... Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far w = Write Fail, ? = No EXIF date, ! = GPS already present Correlate: / Completed correlation process. Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, 0 No Date, 0 GPS Already Present.) 0x011a Image XResolution Rational 1 72/1 0x011b Image YResolution Rational 1 72/1 0x0128 Image ResolutionUnit Short 1 2 0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 0x0213 Image YCbCrPositioning Short 1 1 0x8769 Image ExifTag Long 1 134 0x9000 Photo ExifVersion Undefined 4 48 50 49 48 0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 0xa001 Photo ColorSpace Short 1 65535 0xa002 Photo PixelXDimension Long 1 64 0xa003 Photo PixelYDimension Long 1 64 0x8825 Image GPSTag Long 1 276 0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 0x0001 GPSInfo GPSLatitudeRef Ascii 2 N 0x0002 GPSInfo GPSLatitude Rational 3 47/1 25/1 16449600/1000000 0x0003 GPSInfo GPSLongitudeRef Ascii 2 E 0x0004 GPSInfo GPSLongitude Rational 3 10/1 59/1 6888000/1000000 0x0005 GPSInfo GPSAltitudeRef Byte 1 0 0x0006 GPSInfo GPSAltitude Rational 1 2959867/1000 0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 gpscorrelate-2.0/tests/data/test120.param000066400000000000000000000002521355604302400203450ustar00rootroot00000000000000TITLE='Remove GPS tags from an invalid GPX file' COMMAND='$PROGRAM --remove "$STAGINGDIR/dummy.xhtml" > "$OUTFILE" 2>&1' RESULTCODE=1 SEDCOMMAND='1s@^.*/@@' # strip path gpscorrelate-2.0/tests/data/test120.result000066400000000000000000000000421355604302400205600ustar00rootroot00000000000000dummy.xhtml: Tag removal failure. gpscorrelate-2.0/tests/staging/000077500000000000000000000000001355604302400166455ustar00rootroot00000000000000gpscorrelate-2.0/tests/staging/baddate.jpg000066400000000000000000000025451355604302400207410ustar00rootroot00000000000000JFIFHH ExifMM*bj(2ri%HH2012:11:21 23:35:0002100100@@2012:11:21 23:35:002012:11:21 23:35:00 N W    % dzd #WGS-84 C 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/staging/baddate2.jpg000066400000000000000000000025451355604302400210230ustar00rootroot00000000000000JFIFHH ExifMM*bj(2ri%HH2012:11:21 23:35:0002100100@@2012:11:21 23:35:002012:11:21 23:35:00 NW   9QI #WGS-84 C 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/staging/dummy.xhtml000066400000000000000000000005031355604302400210540ustar00rootroot00000000000000 Not a GPX File

But it is XML

Maybe, it will fool the decoder

gpscorrelate-2.0/tests/staging/noelevations.gpx000066400000000000000000000004721355604302400220760ustar00rootroot00000000000000 gpscorrelate-2.0/tests/staging/noexif.jpg000066400000000000000000000015311355604302400206370ustar00rootroot00000000000000JFIFHHC 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/staging/noloc.jpg000066400000000000000000000022111355604302400204550ustar00rootroot00000000000000JFIFHH.ExifMM*bj(2ri%HH2012:11:22 12:34:5602100100@@2012:11:22 12:34:562012:11:22 12:34:56C 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/staging/nopoints.gpx000066400000000000000000000005741355604302400212440ustar00rootroot00000000000000 Empty gpscorrelate-2.0/tests/staging/nosegments.gpx000066400000000000000000000005511355604302400215500ustar00rootroot00000000000000 Empty gpscorrelate-2.0/tests/staging/notime.jpg000066400000000000000000000020531355604302400206420ustar00rootroot00000000000000ExifMM*V^(2fizHH2012:11:22 12:34:5602100100@@JFIFHHC 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/staging/notimeele.gpx000066400000000000000000000010661355604302400213510ustar00rootroot00000000000000 1 gpscorrelate-2.0/tests/staging/notimes.gpx000066400000000000000000000012071355604302400210430ustar00rootroot00000000000000 9 1 0.0 Trackpoint 0.0 Trackpoint 0.0 Trackpoint gpscorrelate-2.0/tests/staging/notracks.gpx000066400000000000000000000005071355604302400212130ustar00rootroot00000000000000 gpscorrelate-2.0/tests/staging/point1-1.jpg000066400000000000000000000021531355604302400207200ustar00rootroot00000000000000JFIFHHExifMM*V^(2fizHH2012:11:22 12:34:5602100100@@2012:11:22 12:34:562012:11:22 12:34:56C 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/staging/point1-2.jpg000066400000000000000000000021531355604302400207210ustar00rootroot00000000000000JFIFHHExifMM*V^(2fizHH2012:11:22 12:35:2002100100@@2012:11:22 12:35:202012:11:22 12:35:20C 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/staging/point1-3.jpg000066400000000000000000000025311355604302400207220ustar00rootroot00000000000000JFIFHHExifMM*bj(2ri%HH2012:11:22 12:34:5602100100@@2012:11:22 12:34:562012:11:22 12:34:56 NE )'# A'qc "8WGS-842012:11:22C 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/staging/point2-1.jpg000066400000000000000000000021531355604302400207210ustar00rootroot00000000000000JFIFHHExifMM*V^(2fizHH2012:03:11 03:01:0002100100@@2012:03:11 03:01:002012:03:11 03:01:00C 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/staging/point2-2.jpg000066400000000000000000000021531355604302400207220ustar00rootroot00000000000000JFIFHHExifMM*V^(2fizHH2012:03:11 01:59:3002100100@@2012:03:11 01:59:302012:03:11 01:59:30C 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/staging/point3-1.jpg000066400000000000000000000021531355604302400207220ustar00rootroot00000000000000JFIFHHExifMM*V^(2fizHH2012:11:22 07:04:0002100100@@2012:11:22 07:04:002012:11:22 07:04:00C 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/staging/point4-1.jpg000066400000000000000000000021531355604302400207230ustar00rootroot00000000000000JFIFHHExifMM*V^(2fizHH2012:11:22 13:35:0002100100@@2012:11:22 13:35:002012:11:22 13:35:00C 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/staging/point5-1.jpg000066400000000000000000000021531355604302400207240ustar00rootroot00000000000000JFIFHHExifMM*V^(2fizHH2001:11:04 16:52:5802100100@@2001:11:04 16:52:582001:11:04 16:52:58C 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/staging/point6-1.jpg000066400000000000000000000021531355604302400207250ustar00rootroot00000000000000JFIFHHExifMM*V^(2fizHH2012:02:29 10:09:1402100100@@2012:02:29 10:09:142012:02:29 10:09:14C 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/staging/point7-1.jpg000066400000000000000000000021531355604302400207260ustar00rootroot00000000000000JFIFHHExifMM*V^(2fizHH2012:11:04 01:01:3002100100@@2012:11:04 01:01:302012:11:04 01:01:30C 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/staging/track1.gpx000066400000000000000000000016001355604302400205470ustar00rootroot00000000000000 c0c0c0 10 gpscorrelate-2.0/tests/staging/track10.gpx000066400000000000000000000056621355604302400206430ustar00rootroot00000000000000 http://www.topofusion.com TopoFusion Home Page http://www.topofusion.com TopoFusion Home Page 1309.453125 1312.817627 1313.298340 1319.066162 1201.785400 1201.304688 1202.265869 1319.066162 1174.387695 1177.752197 http://www.topofusion.com TopoFusion Home Page 1179.674805 1180.155762 1184.481689 1187.846191 1209.956299 ff0000 0 gpscorrelate-2.0/tests/staging/track11.gpx000066400000000000000000000011061355604302400206310ustar00rootroot00000000000000 1000.000000 gpscorrelate-2.0/tests/staging/track12.gpx000066400000000000000000000070411355604302400206360ustar00rootroot00000000000000 405.559 BALLS Waypoint Summit 406.520 H0ME Waypoint Summit ACTIVE LOG-POST-FIRST STAGE IGNITION GPS Tracklog 847.113 15398.814 15552.736 ACTIVE LOG-POST-SECOND STAGE IGNITION GPS Tracklog 999996.971 1000000.000 1005630.213 1005654.727 1005677.797 1055701.830 1095724.424 11515752.301 11915780.658 1305809.979 1455832.570 1555842.182 gpscorrelate-2.0/tests/staging/track2.gpx000066400000000000000000000013331355604302400205530ustar00rootroot00000000000000 12345 2930.000000 2962.000000 gpscorrelate-2.0/tests/staging/track3.gpx000066400000000000000000000021131355604302400205510ustar00rootroot00000000000000 2012-11-22T12:34:40Z -422.7741523 -421.9119287 -420.4048414 -419.2974105 gpscorrelate-2.0/tests/staging/track4.gpx000066400000000000000000000320521355604302400205570ustar00rootroot00000000000000 Stanley Park Stanley Park -5.0 -3.0 -2.0 -2.0 -3.0 -2.0 -2.0 -2.0 -2.0 -2.0 -1.0 -1.0 -1.0 -1.0 -2.0 -2.0 -1.0 -2.0 -2.0 -2.0 -1.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 2.0 2.0 2.0 2.0 2.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 2.0 1.0 0.0 0.0 1.0 1.0 -1.0 -1.0 -2.0 -3.0 -3.0 -3.0 -3.0 -3.0 -3.0 -3.0 -3.0 -3.0 -3.0 -3.0 -2.0 -2.0 -3.0 -3.0 -2.0 gpscorrelate-2.0/tests/staging/track5.gpx000066400000000000000000000024721355604302400205630ustar00rootroot00000000000000Garmin International10-AOU-12 20:17:52Red382.87366.90gpscorrelate-2.0/tests/staging/track6.gpx000066400000000000000000000006211355604302400205560ustar00rootroot00000000000000130.0128.0gpscorrelate-2.0/tests/staging/track7.gpx000066400000000000000000000114251355604302400205630ustar00rootroot00000000000000 Red gpscorrelate-2.0/tests/staging/track8.gpx000066400000000000000000000034241355604302400205640ustar00rootroot00000000000000 Leap Year Leap Year on GPSies.com round trip 13.0647521613 5.72705 1.975585 1062.874731 1067.200667 Leap Year on GPSies.com 1062.8747 1062.8747 1064.3166 1067.2006 gpscorrelate-2.0/tests/staging/track9.gpx000066400000000000000000000012731355604302400205650ustar00rootroot00000000000000 gpscorrelate-2.0/tests/staging/withgps.jpg000066400000000000000000000025311355604302400210350ustar00rootroot00000000000000JFIFHHExifMM*bj(2ri%HH2012:11:22 12:34:5602100100@@2012:11:22 12:34:562012:11:22 12:34:56 NW %4z   "8WGS-842012:11:22C 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~| @@/!1AQaq2"#R?((drXԏ=ʥ}N>:z+-㯟 Hq0{ d8_}FlI3_Q|,Bp|mE,[Ѵܣ A.J+A6ƑJ $fEZ2ZbW}pyJ UYNzǔ.t B;0 _59ns-@hgo5RL er:ZM&sA[r֢sn6B@Y =pۄ)l@B;?<"A_ (REqnم[@%G$yHS)'AT qɒ}tu'U<8E\<@@TOA>OZ-m(q!I$A]?dYa$HɟjK׬69nP:Doeq%XrR£rFK8.2[@܍>zvAQ1 4ۗ,ͺ<$it!-(JBR@)o'dĀ)P$lGԒxB  'N'm`nTq[Ҿs8rO*%%'AR{ϫ]0O1W~jcna$ek;>JcEQEQEgpscorrelate-2.0/tests/testsuite000077500000000000000000000103071355604302400171710ustar00rootroot00000000000000#!/bin/sh # Simple regression test suite for gpscorrelate # Based on the test suite for gphoto2 # Dan Fandrich # We expect English text throughout the tests... LANG=C export LANG LANGUAGE=C export LANGUAGE if [ "$1" = "-h" ] ; then echo "Usage: $0 [-v] [-m]" exit fi VERBOSECOMMAND= if [ "$1" = "-v" ] ; then shift VERBOSECOMMAND='set -x ;' fi USEVALGRIND= if [ "$1" = "-m" ] ; then shift USEVALGRIND=true fi test -z "$srcdir" && srcdir=`pwd` DATADIR="$srcdir/data" if [ ! -e "$DATADIR" ] ; then echo Must run tests from the tests directory exit 1 fi STAGINGDIR="$srcdir/staging" # Make all files in the staging area read only to prevent # accidental modification chmod a-w "$STAGINGDIR"/* LOGDIR="`pwd`/log" if [ -e "$LOGDIR" ] ; then rm -f "$LOGDIR/"* else mkdir "$LOGDIR" fi if [ -n "$1" ] ; then TESTLIST="$@" else TESTLIST="$DATADIR"/*.param fi POSTCOMMAND= # Clean up on test abort trap 'eval $POSTCOMMAND; exit 1' INT HUP TERM FAILEDTESTS=0 for TEST in $TESTLIST ; do echo '' # These variables are unlikely to be needed in the test parameters file TESTNAME=`echo $TEST | sed -e 's@^.*data/@@' -e 's/\..*$//'` RESULTFILE="$DATADIR/$TESTNAME.result" # Initialize variables that can be used within the test parameters file PROGRAM='../gpscorrelate' if [ -n "$USEVALGRIND" ] ; then PROGRAM="valgrind --error-exitcode=126 --tool=memcheck --leak-check=yes --num-callers=30 --log-file=$LOGDIR/$TESTNAME-valgrind.log $PROGRAM" fi OUTFILE="$LOGDIR/$TESTNAME.out" ERRFILE="$LOGDIR/$TESTNAME.err" # Initialize variables that must be set for each test TITLE= COMMAND= PRECOMMAND= POSTCOMMAND= SEDCOMMAND= RESULTCODE=0 SKIP= # Load the test parameters, which can override the above if [ ! -e "$TEST" ] ; then echo "Test $TESTNAME FAILED: invalid test parameter file $TEST" FAILEDTESTS=$(($FAILEDTESTS + 1)) continue fi . "$TEST" if [ -n "$SKIP" ] ; then echo '***' Skipping \"$TITLE\" test continue fi echo '***' Running \"$TITLE\" test # Clean up from previous tests rm -f "$OUTFILE" "$ERRFILE" # Run a pre-test command if ! eval $PRECOMMAND ; then echo Test $TESTNAME FAILED: pre test command failure FAILEDTESTS=$(($FAILEDTESTS + 1)) # Unconditionally run post command to clean up eval $POSTCOMMAND POSTCOMMAND= continue fi #eval echo `echo "$COMMAND" | sed -e 's/>/\\\\>/g' -e "s/'/\\\\'/g" -e 's/\"/\\\\"/g'` eval $VERBOSECOMMAND $COMMAND EXITCODE=$? set +x if [ $EXITCODE -ne "$RESULTCODE" ] ; then echo "Test $TESTNAME FAILED: got exit $EXITCODE, expected $RESULTCODE" # Don't abort now--run the post-test command to clean up first FAILEDTESTS=$(($FAILEDTESTS + 1)) if [ -n "$VERBOSECOMMAND" ] ; then test -e "$ERRFILE" && cat "$ERRFILE" test -e "$OUTFILE" && echo "Command output was:" && cat "$OUTFILE" fi fi # Run a post-test command if ! eval $POSTCOMMAND ; then POSTCOMMAND= echo Test $TESTNAME FAILED: post test command failure FAILEDTESTS=$(($FAILEDTESTS + 1)) continue fi POSTCOMMAND= if [ $EXITCODE -ne "$RESULTCODE" ] ; then # Delayed exit continue fi # In case this is running on Windows, delete any CR characters in the output # to eliminate any difference from the expected file. mv -f "$OUTFILE" "$OUTFILE".orig tr -d '\r' < "$OUTFILE.orig" > "$OUTFILE" if [ -n "$SEDCOMMAND" ] ; then mv -f "$OUTFILE" "$OUTFILE".orig # Need sed to parse extended regular expressions sed -E "$SEDCOMMAND" < "$OUTFILE.orig" > "$OUTFILE" fi # Older versions of exiv2 (e.g. 0.15-0.18) have slightly different whitespace # and handle the GPS IFD tag differently. This alternate comparison program # can be used in place of "cmp" to relax the comparison and use such a # version: # ! diff -I GPSTag -qw if ! cmp "$RESULTFILE" "$OUTFILE" >/dev/null ; then echo Test $TESTNAME FAILED: unexpected output test -n "$VERBOSECOMMAND" && diff -u "$RESULTFILE" "$OUTFILE" FAILEDTESTS=$(($FAILEDTESTS + 1)) continue fi echo Test $TESTNAME PASSED done echo '' if [ $FAILEDTESTS -eq 0 ] ; then echo All tests have PASSED else echo "$FAILEDTESTS test(s) have FAILED" test -z "$VERBOSECOMMAND" && echo "Run with -v to see details" fi # Set the exit code test "$FAILEDTESTS" -eq 0 gpscorrelate-2.0/unixtime.c000066400000000000000000000055511355604302400160630ustar00rootroot00000000000000/* unixtime.c * Written by Daniel Foote. * Started Feb 2005. * * This file contains a function that converts a string * to a unix time, given a format string. */ /* Copyright 2005-2018 Daniel Foote, Dan Fandrich. * * This file is part of gpscorrelate. * * gpscorrelate 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. * * gpscorrelate 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 gpscorrelate; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include "unixtime.h" #ifdef _WIN32 /* Unfortunately, portable_timegm below isn't portable to Windows */ #define portable_timegm _mkgmtime #else /* Some systems have a version of this called timegm(), but it's not portable */ static time_t portable_timegm(struct tm *tm) { static const char *tz; if (!tz) { tz = getenv("TZ"); if (tz) /* Copy the string, since it's only guaranteed to be * valid until the next getenv or setenv */ tz = strdup(tz); } /* Set an empty TZ to force UTC */ setenv("TZ", "", 1); tzset(); time_t ret = mktime(tm); /* Restore the original TZ */ if (tz) setenv("TZ", tz, 1); else unsetenv("TZ"); tzset(); return ret; } #endif time_t ConvertToUnixTime(const char* StringTime, const char* Format, int TZOffsetHours, int TZOffsetMinutes) { /* Read the time using the specified format. * The format and string being read from must * have the most significant time on the left, * and the least significant on the right: * ie, Year on the left, seconds on the right. */ /* Sanity check... */ if (StringTime == NULL || Format == NULL) { return 0; } /* Define and set up our structure. */ struct tm Time; Time.tm_wday = 0; Time.tm_yday = 0; Time.tm_isdst = 0; // there is no DST in UTC /* Read out the time from the string using our format. */ sscanf(StringTime, Format, &Time.tm_year, &Time.tm_mon, &Time.tm_mday, &Time.tm_hour, &Time.tm_min, &Time.tm_sec); /* Adjust the years for the mktime function to work. */ Time.tm_year -= 1900; Time.tm_mon -= 1; /* Calculate and return the Unix time. */ time_t thetime = portable_timegm(&Time); /* Add our timezone offset to the time. * Note also that we SUBTRACT these times. We want the * result to be in UTC. */ thetime -= TZOffsetHours * 60 * 60; thetime -= TZOffsetMinutes * 60; return thetime; } gpscorrelate-2.0/unixtime.h000066400000000000000000000022521355604302400160630ustar00rootroot00000000000000/* unixtime.h * Written by Daniel Foote. * Started Feb 2005. * * This file contains prototypes and other things for * the Unix time functions. */ /* Copyright 2005-2012 Daniel Foote, Dan Fandrich. * * This file is part of gpscorrelate. * * gpscorrelate 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. * * gpscorrelate 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 gpscorrelate; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #define EXIF_DATE_FORMAT "%d:%d:%d %d:%d:%d" #define GPX_DATE_FORMAT "%d-%d-%dT%d:%d:%dZ" time_t ConvertToUnixTime(const char* StringTime, const char* Format, int TZOffsetHours, int TZOffsetMinutes);