Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rc 1.0.40 #64

Merged
merged 2 commits into from
Sep 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
"editor.formatOnSave": true,
"modulename": "${workspaceFolderBasename}",
"distname": "${workspaceFolderBasename}",
"moduleversion": "1.0.39",
"moduleversion": "1.0.40",
}
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,7 @@ b'$EIGNQ,RMC*24\r\n'
- `haversine` - finds great circle distance in km between two sets of (lat, lon) coordinates
- `planar` - finds planar distance in m between two sets of (lat, lon) coordinates
- `bearing` - finds bearing in degrees between two sets of (lat, lon) coordinates
- `area` - finds spherical area bounded by two sets of (lat, lon) coordinates

See [Sphinx documentation](https://www.semuconsulting.com/pynmeagps/pynmeagps.html#module-pynmeagaps.nmeahelpers) for details.

Expand Down
8 changes: 8 additions & 0 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# pynmeagps Release Notes

### RELEASE 1.0.40

CHANGES:

1. Add area() helper method to calculate spherical area of bounding box.
1. Sphinx documentation and docstrings enhanced to include global constants and decodes.
1. `socket_stream.SocketStream` class renamed to `socket_wrapper.SocketWrapper` class for clarity.

### RELEASE 1.0.39

ENHANCEMENTS:
Expand Down
170 changes: 85 additions & 85 deletions docs/pynmeagps.rst
Original file line number Diff line number Diff line change
@@ -1,85 +1,85 @@
pynmeagps package
=================
Submodules
----------
pynmeagps.exceptions module
---------------------------
.. automodule:: pynmeagps.exceptions
:members:
:undoc-members:
:show-inheritance:
pynmeagps.nmeahelpers module
----------------------------
.. automodule:: pynmeagps.nmeahelpers
:members:
:undoc-members:
:show-inheritance:
pynmeagps.nmeamessage module
----------------------------
.. automodule:: pynmeagps.nmeamessage
:members:
:undoc-members:
:show-inheritance:
pynmeagps.nmeareader module
---------------------------
.. automodule:: pynmeagps.nmeareader
:members:
:undoc-members:
:show-inheritance:
pynmeagps.nmeatypes\_core module
--------------------------------
.. automodule:: pynmeagps.nmeatypes_core
:members:
:undoc-members:
:show-inheritance:
pynmeagps.nmeatypes\_get module
-------------------------------
.. automodule:: pynmeagps.nmeatypes_get
:members:
:undoc-members:
:show-inheritance:
pynmeagps.nmeatypes\_poll module
--------------------------------
.. automodule:: pynmeagps.nmeatypes_poll
:members:
:undoc-members:
:show-inheritance:
pynmeagps.nmeatypes\_set module
-------------------------------
.. automodule:: pynmeagps.nmeatypes_set
:members:
:undoc-members:
:show-inheritance:
pynmeagps.socket\_stream module
-------------------------------
.. automodule:: pynmeagps.socket_stream
:members:
:undoc-members:
:show-inheritance:
Module contents
---------------
.. automodule:: pynmeagps
:members:
:undoc-members:
:show-inheritance:
pynmeagps package
=================

Submodules
----------

pynmeagps.exceptions module
---------------------------

.. automodule:: pynmeagps.exceptions
:members:
:undoc-members:
:show-inheritance:

pynmeagps.nmeahelpers module
----------------------------

.. automodule:: pynmeagps.nmeahelpers
:members:
:undoc-members:
:show-inheritance:

pynmeagps.nmeamessage module
----------------------------

.. automodule:: pynmeagps.nmeamessage
:members:
:undoc-members:
:show-inheritance:

pynmeagps.nmeareader module
---------------------------

.. automodule:: pynmeagps.nmeareader
:members:
:undoc-members:
:show-inheritance:

pynmeagps.nmeatypes\_core module
--------------------------------

.. automodule:: pynmeagps.nmeatypes_core
:members:
:undoc-members:
:show-inheritance:

pynmeagps.nmeatypes\_get module
-------------------------------

.. automodule:: pynmeagps.nmeatypes_get
:members:
:undoc-members:
:show-inheritance:

pynmeagps.nmeatypes\_poll module
--------------------------------

.. automodule:: pynmeagps.nmeatypes_poll
:members:
:undoc-members:
:show-inheritance:

pynmeagps.nmeatypes\_set module
-------------------------------

.. automodule:: pynmeagps.nmeatypes_set
:members:
:undoc-members:
:show-inheritance:

pynmeagps.socket\_wrapper module
--------------------------------

.. automodule:: pynmeagps.socket_wrapper
:members:
:undoc-members:
:show-inheritance:

Module contents
---------------

.. automodule:: pynmeagps
:members:
:undoc-members:
:show-inheritance:
16 changes: 12 additions & 4 deletions examples/utilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from datums import DATUMS # assumes this is in same folder

from pynmeagps import (
area,
bearing,
ecef2llh,
haversine,
Expand Down Expand Up @@ -44,21 +45,21 @@
f" {LAT2}, {LON2} using default WGS84 datum...",
)
dist = haversine(LAT1, LON1, LAT2, LON2)
print(f"Distance: {dist} km")
print(f"Distance: {dist:.4f} km")

print(
f"\nFind planar distance between {LAT1}, {LON1} and",
f" {LAT3}, {LON3} using default WGS84 datum...",
)
dist = planar(LAT1, LON1, LAT3, LON3)
print(f"Distance: {dist} m")
print(f"Distance: {dist:.4f} m")

print(
f"\nFind bearing between {LAT1}, {LON1} and",
f" {LAT2}, {LON2} using default WGS84 datum...",
)
brng = bearing(LAT1, LON1, LAT2, LON2)
print(f"Bearing: {brng} degrees")
print(f"Bearing: {brng:.4f} degrees")

X, Y, Z = 3822566.3113, -144427.5123, 5086857.1208
print(f"\nConvert ECEF X: {X}, Y: {Y}, Z: {Z} to geodetic using default WGS84 datum...")
Expand All @@ -82,7 +83,14 @@
f"{LAT2}, {LON2} using alternate {DATUM} ({ellipsoid}) datum...",
)
dist = haversine(LAT1, LON1, LAT2, LON2, a / 1000)
print(f"Distance: {dist} km")
print(f"Distance: {dist:.4f} km")

print(
f"\nFind spherical area bound by {LAT1}, {LON1} and",
f"{LAT2}, {LON2}...",
)
bbarea = area(LAT1, LON1, LAT2, LON2)
print(f"Area: {bbarea:.4f} km²")

print(
f"\nConvert ECEF X: {X}, Y: {Y}, Z: {Z} to",
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ name = "pynmeagps"
authors = [{ name = "semuadmin", email = "[email protected]" }]
maintainers = [{ name = "semuadmin", email = "[email protected]" }]
description = "NMEA protocol parser and generator"
version = "1.0.39"
version = "1.0.40"
license = { file = "LICENSE" }
readme = "README.md"
requires-python = ">=3.8"
Expand Down
2 changes: 1 addition & 1 deletion src/pynmeagps/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,6 @@
from pynmeagps.nmeareader import NMEAReader
from pynmeagps.nmeatypes_core import *
from pynmeagps.nmeatypes_get import *
from pynmeagps.socket_stream import SocketStream
from pynmeagps.socket_wrapper import SocketWrapper

version = __version__
2 changes: 1 addition & 1 deletion src/pynmeagps/_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
:license: BSD 3-Clause
"""

__version__ = "1.0.39"
__version__ = "1.0.40"
23 changes: 23 additions & 0 deletions src/pynmeagps/nmeahelpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,29 @@ def bearing(lat1: float, lon1: float, lat2: float, lon2: float) -> float:
return brng


def area(
lat1: float,
lon1: float,
lat2: float,
lon2: float,
radius: int = WGS84_SMAJ_AXIS / 1000,
) -> float:
"""
Calculate spherical area bounded by two coordinates.

:param float lat1: lat1
:param float lon1: lon1
:param float lat2: lat2
:param float lon2: lon2
:param float radius: radius in km (Earth = 6378.137 km)
:return: area in km²
:rtype: float
"""

phi1, phi2 = [c * pi / 180 for c in (lat1, lat2)]
return pow(radius, 2) * pi * abs(sin(phi1) - sin(phi2)) * abs(lon1 - lon2) / 180


def get_gpswnotow(dat: datetime) -> tuple:
"""
Get GPS Week number (Wno) and Time of Week (Tow)
Expand Down
4 changes: 2 additions & 2 deletions src/pynmeagps/nmeareader.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
VALCKSUM,
VALMSGID,
)
from pynmeagps.socket_stream import SocketStream
from pynmeagps.socket_wrapper import SocketWrapper


class NMEAReader:
Expand Down Expand Up @@ -68,7 +68,7 @@ def __init__(
# pylint: disable=too-many-arguments

if isinstance(stream, socket):
self._stream = SocketStream(stream, bufsize=bufsize)
self._stream = SocketWrapper(stream, bufsize=bufsize)
else:
self._stream = stream
if msgmode not in (0, 1, 2):
Expand Down
39 changes: 37 additions & 2 deletions src/pynmeagps/nmeatypes_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,39 @@
from datetime import datetime

INPUT = 1
"""Input message type"""
OUTPUT = 0
"""Output message type"""
GET = 0
"""GET (receive, response) message types"""
SET = 1
"""SET (command) message types"""
POLL = 2
"""POLL (query) message types"""
SETPOLL = 3
"""SETPOLL (SET or POLL) message types"""
VALNONE = 0
"""Do not validate checksum or msgid"""
VALCKSUM = 1
"""Validate checksum"""
VALMSGID = 2
ERR_IGNORE = 0
ERR_LOG = 1
"""Validate message id"""
NMEA_PROTOCOL = 1
"""NMEA Protocol"""
UBX_PROTOCOL = 2
"""UBX Protocol"""
RTCM3_PROTOCOL = 4
"""RTCM3 Protocol"""
ERR_RAISE = 2
"""Raise error and quit"""
ERR_LOG = 1
"""Log errors"""
ERR_IGNORE = 0
"""Ignore errors"""

# proprietary messages where msgId is first element of payload:
PROP_MSGIDS = ("FEC", "UBX", "TNL", "ASHR", "GPPADV")
"""Proprietary message prefixes"""

GNSSLIST = {
0: "GPS",
Expand All @@ -36,13 +57,27 @@
6: "GLONASS",
7: "NAVIC",
}
"""GNSS code"""
FIXTYPE_GGA = {
0: "NO FIX",
1: "3D",
2: "3D",
4: "RTK FIXED",
5: "RTK FLOAT",
6: "DR",
}
"""Fix type from GGA"""

GPSEPOCH0 = datetime(1980, 1, 6)
"""GPS epoch base date"""
# Geodetic datum spheroid values:
# WGS84, ETRS89, EPSG4326
WGS84 = "WGS_84"
"""WGS84 datum descriptor"""
WGS84_SMAJ_AXIS = 6378137.0 # semi-major axis
"""WGS84 semi-major axis"""
WGS84_FLATTENING = 298.257223563 # flattening
"""WGS84 flattening"""

# ***************************************************
# THESE ARE THE NMEA PROTOCOL PAYLOAD ATTRIBUTE TYPES
Expand Down
Loading