{ "info": { "author": "Ian Nesbitt", "author_email": "ian.nesbitt@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Science/Research", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Topic :: Scientific/Engineering :: Physics" ], "description": "# gpx2dzg\n\n[![PyPI version](https://badge.fury.io/py/gpx2dzg.svg)](https://badge.fury.io/py/gpx2dzg)\n[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://github.com/iannesbitt/gpx2dzg/blob/master/LICENSE)\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3260948.svg)](https://doi.org/10.5281/zenodo.3260948)\n\n![Sanity check plot with identical mark counts](https://github.com/iannesbitt/gpx2dzg/raw/master/img/Figure_1b.png)\n\nThis software takes GPS waypoint information stored in [GPX](https://en.wikipedia.org/wiki/GPS_Exchange_Format) files, tries to align waypoints with user marks in GSSI's proprietary DZX file format, and outputs the results to DZG (an ASCII file containing a mix of [RMC](http://aprs.gids.nl/nmea/#rmc) and/or [GGA](http://aprs.gids.nl/nmea/#gga) NMEA strings and \"NMEA-like\" GSSI proprietary strings). The purpose of this translation is to artifically create GPS-aware ground-penetrating radar (GPR) projects.\n\nAt the moment (June 2019) this software has been tested with files created with SIR-3000 and SIR-4000 GSSI control units. The 3000 and 4000 control units record user marks in very different ways: the 3000 records them directly to the second row of the radar array, while the 4000 creates a proprietary XML file called `DZX` and records them as XML objects in that file. This software can handle both. If you used a 3000 during the survey, you can read the marks by pointing the software directly at your DZT file. If you used a 4000, you should point the software at the DZX file associated with the DZT. See [usage](#usage) for an explanation of how to do this in both [Python](#in-python) and [on the command line](#on-a-bash-or-anaconda-prompt-command-line).\n\n\n### Note:\nGPX and DZX or DZT files **MUST** contain the same number of marks for this process to work. That's because each GPS point has to be matched up with a scan number in order to tie the GPS points to marks made in the DZX or DZT by the control unit. If they do not, the script will bring up a plot showing GPX marks plotted by distance, DZX/DZT marks plotted by scan number, and velocity between GPX points for comparison. You can modify either GPX or DZX using a standard text editor, and add or remove marks based on your survey notes. If you're reading a DZT file from a SIR-3000 survey, you can remove marks 4, 5, and the mark second from the end in the mark list, by specifying `drops=[3,4,-2]` if you're using the python console, or `-r 3,4,-2` if you're using the command line. Remember, the list index starts at 0, so `drops=[3]` or `-r 3` will drop the 4th mark.\n\nI urge you to take copious notes in the field so that you know if there will be errant marks you need to remove later. I will do what I can to help, but ultimately I am not responsible for missed GPS or GPR marks in your radar surveys (sorry!)\n\n# installation\n\n### simple install\n\nIf you've installed python packages before you may not need this. If you're uncomfortable installing python packages, read on. All requirements are on the Python Package Interface (PyPI), which means that you do not need to manually anything else in order for this to work (requirements should theoretically install automatically). Execute the following command in an Anaconda Prompt or `bash` terminal to install:\n\n```bash\npip install gpx2dzg\n```\n\n### installing development versions\n\nIf you wish to install the very latest commit from github (which may be more up-to-date than the version on PyPI but also may have more bugs), simply download this repository using the \"Clone or download\" button above. Unzip the package to your Downloads folder, then execute the following command in an Anaconda Prompt or `bash` terminal:\n\n```bash\npip install ~/Downloads/gpx2dzg\n```\n\nIf that doesn't work, you may need to unzip differently. Try making a folder called `gpx2dzg` in your Downloads folder, then unzip all of the contents of this package to it, so that `setup.py` is located at `~/Downloads/gpx2dzg/setup.py`. \n\n# usage\n\n## in python\n\n*Note that although many of these examples use SIR-4000 DZX files, this program also works with DZTs created with the SIR-3000, which stores marks in the second row of the radar profile.*\n\nThe following command will compare the DZX and GPX files, and if the mark numbers are the same, it will write a DZG file (`write=True`).\n\n```python\n>>> import gpx2dzg.gpx2dzg as g2d\n>>> g2d.convert(dzx='/path/to/dzx.DZX', gpx='/path/to/gpx.gpx', write=True)\n```\n\nHowever, `write=True` may not be the desired behavior if you would like to compare the mark points first. In that case, you'll want to specify `plot=True` instead to force a sanity check plot. *Note: this will happen automatically if GPX and DZX mark numbers are not equal, because the software will not write a `DZG` in that case.*\n\n### sanity check plotting\n\nThis software contains the ability to plot GPX and DZX marks next to each other, along with speed over ground, in order to visually check which points may have been missed or created erroneously in the field. As stated above, this will happen automatically if the mark numbers differ between the GPX and whichever GSSI file you're working with.\n\nAn example is shown below. This plot contains four axes:\n\n 1. GPX marks plotted along a numberline depicting **marks plotted by distance in meters along survey line**.\n 2. GPX marks plotted along a numberline depicting **marks plotted by seconds elapsed along line**.\n 3. DZX or DZT marks plotted along a numberline depicting **marks plotted by scan number**.\n 4. **Speed** (meters per second) between marks in GPX file, **plotted as a function of seconds elapsed**.\n\nIf you record files by time (i.e. a set number of scans per second), it will be helpful to compare plots 2 and 3. The better the mark points line up in plots 2 and 3, the better off you will be. If you record files by using a survey wheel or other Distance Measurement Instrument (DMI), you should compare plots 1 and 3.\n\n![Sanity check plot with differing mark counts](https://github.com/iannesbitt/gpx2dzg/raw/master/img/Figure_1a.png)\n\n### DZX/DZT point removal\n\nYou can remove mark points from the list of DZX or DZT marks by specifying `drops=[4,5,-2]`. It may be beneficial to do this and check the plot a couple of times until the GPS and SIR marks match up. Remember, the list index starts at 0, so `drops=[3]` or `-r 3` will drop the 4th mark. Adding a negative number will remove from the end of the list, so `drops=[3,-2]` will remove both the fourth point in the list and the second to last point in the list. **This software will not let you drop the first or last point** (i.e. `drops=[0]` or `drops=[-1]`) **since these are required to properly normalize the full extents of your DZT files**.\n\nIn this case, we only need to drop the second-to-last point in order to get matching DZX and GPX mark counts.\n\n```python\n>>> g2d.convert(dzx='/path/to/dzt.DZX', gpx='/path/to/gpx.gpx', plot=True, drops=[-2])\n```\n\nNote that the second to last point is removed in this second example.\n\n![Sanity check plot with identical mark counts](https://github.com/iannesbitt/gpx2dzg/raw/master/img/Figure_1b.png)\n\n### write results to a `.DZG` file\n\nAdd `write=True` to the function call. The program will not overwrite if there's a DZG already named the same as the DZT or DZX, instead it will name it something like `dzt-gpx2dzg.DZG`.\n\n```python\n>>> g2d.convert(dzx='/path/to/dzt.DZX', gpx='/path/to/gpx.gpx', drops=[-2], write=True)\n```\n\n### forcing a sanity check plot\n\nTo force the sanity check plot even if mark numbers are equal, simply add `plot=True`.\n\n```python\n>>> g2d.convert(dzx='/path/to/dzx.DZX', gpx='/path/to/gpx.gpx', plot=True)\n```\n\n![Sanity check plot with identical mark counts](https://github.com/iannesbitt/gpx2dzg/raw/master/img/Figure_2.png)\n\n*This might not seem like a \"sane\" way to do a sanity check, but if you have a better idea I would love to hear from you.*\n\n## on a `bash` or Anaconda Prompt command line\n\n```bash\ngpx2dzg -d /path/to/dzx.DZX -g /path/to/gpx.gpx\n```\n\n### sanity check plotting\n\nSimply add the `-p` flag.\n\n```bash\ngpx2dzg -d /path/to/dzx.DZX -g /path/to/gpx.gpx -p\n```\n\n### DZX/DZT point removal\n\nYou can remove mark points from the list of DZX or DZT marks by adding the `-r` flag with a list of integers. Again, it may be beneficial to do this a couple of times to check that the GPS/SIR mark points in the plot match up the way you want them to. Remember, the list index starts at 0, so `-r 3` will drop the 4th mark. Adding a negative number will remove from the end of the list, so `-r 3,-2` will remove both the fourth point in the list and the second to last point in the list. **This software will not let you drop the first or last point** (i.e. `-r 0` or `-r -1`) **since these are required to properly normalize your DZT files**.\n\nNotice in this example that the value of `-d` can point to either a SIR-3000 `DZT` file or a SIR-4000 `DZX` file.\n\n```bash\ngpx2dzg -d /path/to/dzt.DZT -g /path/to/gpx.gpx -p -r 4,5,-2\n```\n\n### write results to a `.DZG` file\n\nSimply add the `-w` flag. The program will not overwrite if there's a DZG already named the same as the DZT or DZX, instead it will name it something like `dzt-gpx2dzg.DZG`.\n\n```bash\ngpx2dzg -d /path/to/dzt.DZT -g /path/to/gpx.gpx -p -r 4,5,-2 -w\n```\n\n## usage notes:\n\nIf no GPX file is specified, the software will look for a GPX named the same as the DZX or DZT (for example, if the DZX/DZT is named `file.DZX` or `file.DZT`, the script will look for a file named `file.gpx`).\n\n# future:\n\n- please [create an issue](https://github.com/iannesbitt/gpx2dzg/issues/new) if you have a feature suggestion\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/iannesbitt/gpx2dzg", "keywords": "", "license": "GPLv3", "maintainer": "", "maintainer_email": "", "name": "gpx2dzg", "package_url": "https://pypi.org/project/gpx2dzg/", "platform": "", "project_url": "https://pypi.org/project/gpx2dzg/", "project_urls": { "Homepage": "https://github.com/iannesbitt/gpx2dzg" }, "release_url": "https://pypi.org/project/gpx2dzg/0.1.0/", "requires_dist": [ "gpxpy", "geomag", "pynmea2", "pygeodesy", "readgssi" ], "requires_python": "", "summary": "convert GPX files to GSSI's proprietary DZG format", "version": "0.1.0" }, "last_serial": 5462649, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "2c86cc8c2dba83913bf54dccd6b3b670", "sha256": "99e1442161f507421b69c7ce81b97a06cb4d33f6b433490b69096f23265b7489" }, "downloads": -1, "filename": "gpx2dzg-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2c86cc8c2dba83913bf54dccd6b3b670", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23485, "upload_time": "2019-05-17T20:01:09", "url": "https://files.pythonhosted.org/packages/42/ae/8269ebe1979baade4d8abc5d8d9b51fd05865ee39b8dea352068a915d05f/gpx2dzg-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a7b02970cf75395070ab7790b0387f17", "sha256": "a972e99cc69424f7571e611363379af6c90ee7203ce6f430c568250af255642e" }, "downloads": -1, "filename": "gpx2dzg-0.0.1.tar.gz", "has_sig": false, "md5_digest": "a7b02970cf75395070ab7790b0387f17", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9873, "upload_time": "2019-05-17T20:01:11", "url": "https://files.pythonhosted.org/packages/59/13/7f0d0b5daf1ffb1c923e5755a207001479df918f3295d668d516838f0579/gpx2dzg-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "7048775ca0a34e52c97a52020be6b753", "sha256": "99e817ced7b13778dc7d8cd0f4e939dbeb7c616c70e380ff016e635a389a714f" }, "downloads": -1, "filename": "gpx2dzg-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "7048775ca0a34e52c97a52020be6b753", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 26012, "upload_time": "2019-06-09T01:51:19", "url": "https://files.pythonhosted.org/packages/78/f6/b7233653bbca5971399a2101cf8f69b2e44c156600c34b8996d2a5a925c4/gpx2dzg-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8fa716d2e563163f8c9d0bb36520033f", "sha256": "15b4c9525686a351be904eb36530e2fcc6416692349f94abcbbfaa5450958320" }, "downloads": -1, "filename": "gpx2dzg-0.0.2.tar.gz", "has_sig": false, "md5_digest": "8fa716d2e563163f8c9d0bb36520033f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14783, "upload_time": "2019-06-09T01:51:21", "url": "https://files.pythonhosted.org/packages/98/11/25020b069597e155232ee338a7cd028b42e62a7bc4ae095991e6ffe2914e/gpx2dzg-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "828e0d1e389b6f70349212f6d69389b9", "sha256": "268fcc3248ee8b6f99014d2a3d5e5c4a9790de690d389fd0521acd20fdccd697" }, "downloads": -1, "filename": "gpx2dzg-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "828e0d1e389b6f70349212f6d69389b9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 26679, "upload_time": "2019-06-09T17:31:35", "url": "https://files.pythonhosted.org/packages/6a/a5/2f9a561c8917a2320847045f5e11335b949963ee92b032b5ef1b32936f03/gpx2dzg-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "37229414a283478d4c4ed541e6bebc84", "sha256": "7ccae6c1fe0d7bd4cfb158f6e97c84ad35e9ae9cfdd1921cf8276d4714136671" }, "downloads": -1, "filename": "gpx2dzg-0.0.3.tar.gz", "has_sig": false, "md5_digest": "37229414a283478d4c4ed541e6bebc84", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15943, "upload_time": "2019-06-09T17:31:36", "url": "https://files.pythonhosted.org/packages/c4/6b/011ea6844215e1a17f3a607dc3a557a66c2b1037f8f40310a8bced4d5484/gpx2dzg-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "b67e5c73533fb696e6eb131020e3cd45", "sha256": "b0e9d4faed95421dfd888f9bc40b3d8e3344350c3d8fcce532383d8a20de9e0f" }, "downloads": -1, "filename": "gpx2dzg-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "b67e5c73533fb696e6eb131020e3cd45", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 1963528, "upload_time": "2019-06-25T07:35:07", "url": "https://files.pythonhosted.org/packages/c7/b1/6d71d326eb15416e8cafd8281814d351260024e467cd2f267346eeb0b766/gpx2dzg-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "272ba2a1db2f1a97647e3884f60854b0", "sha256": "42f57ba42c8a9769cb88424a19c0bf091163fade0c723da7a9fd49aeecfa2461" }, "downloads": -1, "filename": "gpx2dzg-0.0.4.tar.gz", "has_sig": false, "md5_digest": "272ba2a1db2f1a97647e3884f60854b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1954776, "upload_time": "2019-06-25T07:35:10", "url": "https://files.pythonhosted.org/packages/8c/48/6cbc4cc975ef97526aaeecba428b95cae0bb5b4b92c652c99a56c43e1043/gpx2dzg-0.0.4.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "04db860f77f845e0f3151248d7ab6655", "sha256": "736ff1173b6b619ed3abc266c97c3d352ee6e7471cfce305c97b83e527af2ce4" }, "downloads": -1, "filename": "gpx2dzg-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "04db860f77f845e0f3151248d7ab6655", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 1963605, "upload_time": "2019-06-28T17:16:13", "url": "https://files.pythonhosted.org/packages/28/5d/e68c2b645140344ecfef4354a0266f0fc1816a7f19dc787a6c245c822171/gpx2dzg-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "00ffc97792dc548ec5bfb8436232f7e8", "sha256": "93c476974cb100bbb7a97c202c6932b6cb3787e264ca7fe4a64ca68e130d5071" }, "downloads": -1, "filename": "gpx2dzg-0.1.0.tar.gz", "has_sig": false, "md5_digest": "00ffc97792dc548ec5bfb8436232f7e8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1954938, "upload_time": "2019-06-28T17:16:15", "url": "https://files.pythonhosted.org/packages/86/1f/07ec632b14d4d0704a8fb6f3e047ac555bbb46dc4b131add7abeb9dc8c6b/gpx2dzg-0.1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "04db860f77f845e0f3151248d7ab6655", "sha256": "736ff1173b6b619ed3abc266c97c3d352ee6e7471cfce305c97b83e527af2ce4" }, "downloads": -1, "filename": "gpx2dzg-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "04db860f77f845e0f3151248d7ab6655", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 1963605, "upload_time": "2019-06-28T17:16:13", "url": "https://files.pythonhosted.org/packages/28/5d/e68c2b645140344ecfef4354a0266f0fc1816a7f19dc787a6c245c822171/gpx2dzg-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "00ffc97792dc548ec5bfb8436232f7e8", "sha256": "93c476974cb100bbb7a97c202c6932b6cb3787e264ca7fe4a64ca68e130d5071" }, "downloads": -1, "filename": "gpx2dzg-0.1.0.tar.gz", "has_sig": false, "md5_digest": "00ffc97792dc548ec5bfb8436232f7e8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1954938, "upload_time": "2019-06-28T17:16:15", "url": "https://files.pythonhosted.org/packages/86/1f/07ec632b14d4d0704a8fb6f3e047ac555bbb46dc4b131add7abeb9dc8c6b/gpx2dzg-0.1.0.tar.gz" } ] }