Skip to content
Open
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
72 changes: 72 additions & 0 deletions noaa_enc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#!/usr/bin/python3
"""Script to process the NOAA ENC download page and convert it to the XML catalog format
Part of the ChartCatalogs project
Copyright (c) 2026 Dirk
Licensed under GPLv2 or, at your will later version
"""

import re
import sys
from ChartCatalogs.RncChartCatalog import RncChartCatalog
from ChartCatalogs.Chart import Chart
from datetime import datetime

STATE_NAMES = {
'AK': 'Alaska', 'AL': 'Alabama', 'AQ': 'Antarctica',
'BS': 'Bahamas', 'CA': 'California', 'CT': 'Connecticut',
'DE': 'Delaware', 'FL': 'Florida', 'FM': 'Micronesia',
'GA': 'Georgia', 'GT': 'Guatemala', 'HI': 'Hawaii',
'HT': 'Haiti', 'ID': 'Idaho', 'IL': 'Illinois',
'IN': 'Indiana', 'LA': 'Louisiana', 'MA': 'Massachusetts',
'MD': 'Maryland', 'ME': 'Maine', 'MH': 'Marshall Islands',
'MI': 'Michigan', 'MN': 'Minnesota', 'MS': 'Mississippi',
'NC': 'North Carolina', 'NH': 'New Hampshire', 'NJ': 'New Jersey',
'NV': 'Nevada', 'NY': 'New York', 'OH': 'Ohio',
'OR': 'Oregon', 'PA': 'Pennsylvania', 'PO': 'Pacific Ocean',
'PR': 'Puerto Rico', 'PW': 'Palau', 'RI': 'Rhode Island',
'SC': 'South Carolina', 'SP': 'Spratly Islands', 'TX': 'Texas',
'VA': 'Virginia', 'VT': 'Vermont', 'WA': 'Washington',
'WI': 'Wisconsin',
}

BASE_URL = 'https://charts.noaa.gov/ENCs'

# Pattern: <A href="XX_ENCs.zip"...>...XX...</A>...</td><td>SIZE&nbsp;MB</td><td>DATE</td>
ENTRY_RE = re.compile(
r'href="([A-Z]{2})_ENCs\.zip"[^>]*>.*?</td>'
r'<td>.*?</td>'
r'<td>(\d+)&nbsp;MB</td>'
r'<td>(\d{2}/\d{2}/\d{4}\s+\d{2}:\d{2}:\d{2})</td>',
re.DOTALL
)


def main():
with open(sys.argv[1]) as f:
html = f.read()

entries = []
for m in ENTRY_RE.finditer(html):
code = m.group(1)
size_mb = int(m.group(2))
ts = datetime.strptime(m.group(3), '%m/%d/%Y %H:%M:%S')
name = STATE_NAMES.get(code, code)
entries.append((code, name, size_mb, ts))

catalog = RncChartCatalog()
catalog.title = 'NOAA ENC Charts (S-57) by State'

for code, name, size_mb, ts in entries:
chart = Chart()
chart.number = code
chart.title = '%s (%d MB)' % (name, size_mb)
chart.chart_format = 'Electronic Navigational Chart, S-57'
chart.url = '%s/%s_ENCs.zip' % (BASE_URL, code)
chart.zipfile_ts = ts
catalog.add_chart(chart)

catalog.print_xml()


if __name__ == '__main__':
main()
27 changes: 27 additions & 0 deletions noaa_enc.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#!/bin/bash

# Script to download NOAA ENC charts list and convert it to the XML catalog format
#
# Part of the ChartCatalogs project
# Copyright (c) 2026 Dirk
# Licensed under GPLv2 or, at your will later version
#

if [ -z "${CHARTCATALOGS_TARGETDIR}" ]; then
TARGETDIR='.'
else
TARGETDIR="${CHARTCATALOGS_TARGETDIR}"
fi

CATALOGNAME='NOAA_ENC_Catalog.xml'

WORKDIR='/tmp'
rm -f ${WORKDIR}/noaa_enc.html
if wget -q -O ${WORKDIR}/noaa_enc.html https://charts.noaa.gov/ENCs/ENCs.shtml; then
python3 ./noaa_enc.py ${WORKDIR}/noaa_enc.html > ${WORKDIR}/${CATALOGNAME}
if xmllint --noout ${WORKDIR}/${CATALOGNAME} 2>&1 >/dev/null; then
cat ${WORKDIR}/${CATALOGNAME} | xmllint --format - > ${TARGETDIR}/${CATALOGNAME}
rm ${WORKDIR}/${CATALOGNAME}
fi
rm -f ${WORKDIR}/noaa_enc.html
fi