User:Kannix/ENC iENC
Jump to navigation
Jump to search
Some info about ENC and i(nland)ENC:
basics
- "IHO S-57 format is a vector interchange format used for maritime charts. The only currently common profile is known as ENC (Electronic Nautical Chart). The format is promulgated by the IHO (International Hydrographic Organization)." [1]
- iENC extend the standard S-57 objects/attribute-set by features starting with Code>= 17000. As further distinction, these feature's and attribute's acronyms are written in lowercase letters.
viewing
extracting data
- ogr command line tool
- for convenience, FWTools suite and OSGeo4W contain the ogr-tools
- to extract iENC features, replace the original ogr-translation-tables with an (iENC)extended version like openCPN source:
- s57attributes.csv
- s57expectedinput.csv
- s57objectclasses.csv
- some ogr2ogr formats support georeferencing, some do not
Ogr2osm
- on WIN32, install OSGeo4W (make sure, python-gdal bindings are installed)
- update the above mentioned .csv-files
- download ogr2osm.py and SimpleXMLWriter.py
ienc_bridge.py
from osgeo import ogr
import re
import urllib
#A translation function for ienc bridge
def filterLayer(layer):
if not layer:
return
if layer.GetName() in ('bridge'):
print 'processing layer: ' + layer.GetName()
return layer
else:
print 'ignored layer: ' + layer.GetName()
return
def filterTags(attrs):
if not attrs:
return
tags = {}
if attrs['OBJL'] == '17011':
if 'OBJNAM' in attrs:
tags['seamark:name'] = attrs['OBJNAM']
if 'HORCLR' in attrs:
tags['seamark:bridge:clearance_width'] = attrs['HORCLR']
if 'VERCLR' in attrs:
tags['seamark:bridge:clearance_height'] = attrs['VERCLR']
if 'VERCCL' in attrs:
tags['seamark:bridge:clearance_height_closed'] = attrs['VERCCL']
if 'VERCOP' in attrs:
tags['seamark:bridge:clearance_height_open'] = attrs['VERCOP']
if attrs['OBJL'] == '17011':
tags['seamark:type'] = 'bridge'
if attrs['CATBRG'] == '1':
tags['seamark:bridge:category'] = 'fixed'
elif attrs['CATBRG'] == '3':
tags['seamark:bridge:category'] = 'swing'
elif attrs['CATBRG'] == '4':
tags['seamark:bridge:category'] = 'lifting'
elif attrs['CATBRG'] == '5':
tags['seamark:bridge:category'] = 'bascule'
elif attrs['CATBRG'] == '9':
tags['seamark:bridge:category'] = 'foot'
elif attrs['CATBRG'] == '12':
tags['seamark:bridge:category'] = 'suspension'
#print(attrs)
return tags
- place both .py-files (ogr2osm.py and SimpleXMLWriter.py), 'test.000'-iENC-file and ienc_bridge.py-translation-file in your OSGeo4W working-directory
- start OSGeo4W shell
- command:
python ogr2osm.py -o test.osm -t ienc_bridge.py test.000
- works on NL-iENC files
- on DE-iENCs, there are decoding errors:
Line 998 in ogr2osm.py workaround: decode(options.encoding) > decode(options.encoding, 'ignore')
ienc_notmrk.py
from osgeo import ogr
import re
import urllib
# A translation function for ienc notmrk
# ver. 2013-01-29
# bnkwtw and CONDTN not openCPN s57*.csv!
def filterLayer(layer):
if not layer:
return
if layer.GetName() in ('notmrk'):
print 'processing layer: ' + layer.GetName()
return layer
else:
print 'ignored layer: ' + layer.GetName()
return
def filterTags(attrs):
if not attrs:
return
tags = {}
if attrs['OBJL'] == '17050':
if attrs['OBJL'] == '17050':
tags['seamark:type'] = 'notice'
if attrs['addmrk'] != :
listTempAddition = []
tempAddMrk =attrs['addmrk'].split(',')
for t in tempAddMrk:
if t == '1':
tempAddition = 'top_board'
elif t == '2':
tempAddition = 'bottom_board'
elif t == '3':
tempAddition = 'right_triangle'
elif t == '4':
tempAddition = 'left_triangle'
elif t == '5':
tempAddition = 'bottom_triangle'
listTempAddition.append(tempAddition)
tags['seamark:notice:addition'] = ';'.join(listTempAddition)
if attrs['catnmk'] == '1':
tags['seamark:notice:category'] = 'no_entry'
elif attrs['catnmk'] == '2':
tags['seamark:notice:category'] = 'closed_area'
elif attrs['catnmk'] == '3':
tags['seamark:notice:category'] = 'no_overtaking'
elif attrs['catnmk'] == '4':
tags['seamark:notice:category'] = 'no_convoy_overtaking'
elif attrs['catnmk'] == '5':
tags['seamark:notice:category'] = 'no_passing'
elif attrs['catnmk'] == '6':
tags['seamark:notice:category'] = 'no_berthing'
elif attrs['catnmk'] == '7':
tags['seamark:notice:category'] = 'no_berthing_lateral_limit'
elif attrs['catnmk'] == '8':
tags['seamark:notice:category'] = 'no_anchoring'
elif attrs['catnmk'] == '9':
tags['seamark:notice:category'] = 'no_mooring'
elif attrs['catnmk'] == '10':
tags['seamark:notice:category'] = 'no_turning'
elif attrs['catnmk'] == '11':
tags['seamark:notice:category'] = 'no_wash'
elif attrs['catnmk'] == '12':
tags['seamark:notice:category'] = 'no_passage_left'
elif attrs['catnmk'] == '13':
tags['seamark:notice:category'] = 'no_passage_right'
elif attrs['catnmk'] == '14':
tags['seamark:notice:category'] = 'no_motor_craft'
elif attrs['catnmk'] == '15':
tags['seamark:notice:category'] = 'no_sport_craft'
elif attrs['catnmk'] == '16':
tags['seamark:notice:category'] = 'no_waterskiing'
elif attrs['catnmk'] == '17':
tags['seamark:notice:category'] = 'no_sailing_craft'
elif attrs['catnmk'] == '18':
tags['seamark:notice:category'] = 'no_unpowered_craft'
elif attrs['catnmk'] == '19':
tags['seamark:notice:category'] = 'no_sailboards'
elif attrs['catnmk'] == '20':
tags['seamark:notice:category'] = 'no_waterbikes'
elif attrs['catnmk'] == '21':
tags['seamark:notice:category'] = 'no_high_speeds'
elif attrs['catnmk'] == '22':
tags['seamark:notice:category'] = 'no_launching_beaching'
elif attrs['catnmk'] == '23':
tags['seamark:notice:category'] = 'move_to_left'
elif attrs['catnmk'] == '24':
tags['seamark:notice:category'] = 'move_to_right'
elif attrs['catnmk'] == '25':
tags['seamark:notice:category'] = 'move_to_port'
elif attrs['catnmk'] == '26':
tags['seamark:notice:category'] = 'move_to_starboard'
elif attrs['catnmk'] == '27':
tags['seamark:notice:category'] = 'keep_to_port'
elif attrs['catnmk'] == '28':
tags['seamark:notice:category'] = 'keep_to_starboard'
elif attrs['catnmk'] == '29':
tags['seamark:notice:category'] = 'cross_to_port'
elif attrs['catnmk'] == '30':
tags['seamark:notice:category'] = 'cross_to_starboard'
elif attrs['catnmk'] == '31':
tags['seamark:notice:category'] = 'stop'
elif attrs['catnmk'] == '32':
tags['seamark:notice:category'] = 'speed_limit'
elif attrs['catnmk'] == '33':
tags['seamark:notice:category'] = 'sound_horn'
elif attrs['catnmk'] == '34':
tags['seamark:notice:category'] = 'keep_lookout'
elif attrs['catnmk'] == '35':
tags['seamark:notice:category'] = 'give_way_junction'
elif attrs['catnmk'] == '36':
tags['seamark:notice:category'] = 'give_way_crossing'
elif attrs['catnmk'] == '37':
tags['seamark:notice:category'] = 'make_radio_contact'
elif attrs['catnmk'] == '38':
tags['seamark:notice:category'] = 'limited_depth'
elif attrs['catnmk'] == '39':
tags['seamark:notice:category'] = 'limited_headroom'
elif attrs['catnmk'] == '40':
tags['seamark:notice:category'] = 'limited_width'
elif attrs['catnmk'] == '41':
tags['seamark:notice:category'] = 'navigation_restrictions'
elif attrs['catnmk'] == '42':
tags['seamark:notice:category'] = 'channel_distance_left'
elif attrs['catnmk'] == '43':
tags['seamark:notice:category'] = 'channel_distance_right'
elif attrs['catnmk'] == '44':
tags['seamark:notice:category'] = 'channel_two_way'
elif attrs['catnmk'] == '45':
tags['seamark:notice:category'] = 'channel_one_way'
elif attrs['catnmk'] == '46':
tags['seamark:notice:category'] = 'opening_to_right'
elif attrs['catnmk'] == '47':
tags['seamark:notice:category'] = 'opening_to_left'
elif attrs['catnmk'] == '48':
tags['seamark:notice:category'] = 'proceed_to_left'
elif attrs['catnmk'] == '49':
tags['seamark:notice:category'] = 'proceed_to_right'
elif attrs['catnmk'] == '50':
tags['seamark:notice:category'] = 'entry_permitted'
elif attrs['catnmk'] == '51':
tags['seamark:notice:category'] = 'overhead_cable'
elif attrs['catnmk'] == '52':
tags['seamark:notice:category'] = 'weir'
elif attrs['catnmk'] == '53':
tags['seamark:notice:category'] = 'ferry_non_independent'
elif attrs['catnmk'] == '54':
tags['seamark:notice:category'] = 'ferry_independent'
elif attrs['catnmk'] == '55':
tags['seamark:notice:category'] = 'berthing_permitted '
elif attrs['catnmk'] == '56':
tags['seamark:notice:category'] = 'berthing_lateral_limit'
elif attrs['catnmk'] == '57':
tags['seamark:notice:category'] = 'berthing_lateral_limits'
elif attrs['catnmk'] == '58':
tags['seamark:notice:category'] = 'berthing_rafting_limit'
elif attrs['catnmk'] == '59':
tags['seamark:notice:category'] = 'berthing_unmarked_pushing'
elif attrs['catnmk'] == '60':
tags['seamark:notice:category'] = 'berthing_marked_pushing_1'
elif attrs['catnmk'] == '61':
tags['seamark:notice:category'] = 'berthing_marked_pushing_2'
elif attrs['catnmk'] == '62':
tags['seamark:notice:category'] = 'berthing_marked_pushing_3'
elif attrs['catnmk'] == '63':
tags['seamark:notice:category'] = 'berthing_unmarked_non_pushing'
elif attrs['catnmk'] == '64':
tags['seamark:notice:category'] = 'berthing_marked_non_pushing_1'
elif attrs['catnmk'] == '65':
tags['seamark:notice:category'] = 'berthing_marked_non_pushing_2'
elif attrs['catnmk'] == '66':
tags['seamark:notice:category'] = 'berthing_marked_non_pushing_3'
elif attrs['catnmk'] == '67':
tags['seamark:notice:category'] = 'berthing_unmarked'
elif attrs['catnmk'] == '68':
tags['seamark:notice:category'] = 'berthing_marked_1 '
elif attrs['catnmk'] == '69':
tags['seamark:notice:category'] = 'berthing_marked_2'
elif attrs['catnmk'] == '70':
tags['seamark:notice:category'] = 'berthing_marked_3 '
elif attrs['catnmk'] == '71':
tags['seamark:notice:category'] = 'anchoring_permitted'
elif attrs['catnmk'] == '72':
tags['seamark:notice:category'] = 'mooring_permitted'
elif attrs['catnmk'] == '73':
tags['seamark:notice:category'] = 'vehicle_loading_berth'
elif attrs['catnmk'] == '74':
tags['seamark:notice:category'] = 'turning_area'
elif attrs['catnmk'] == '75':
tags['seamark:notice:category'] = 'secondary_waterway_crossing'
elif attrs['catnmk'] == '76':
tags['seamark:notice:category'] = 'secondary_waterway_right'
elif attrs['catnmk'] == '77':
tags['seamark:notice:category'] = 'secondary_waterway_left'
elif attrs['catnmk'] == '78':
tags['seamark:notice:category'] = 'main_waterway_right_secondary_ahead'
elif attrs['catnmk'] == '79':
tags['seamark:notice:category'] = 'main_waterway_left_secondary_ahead'
elif attrs['catnmk'] == '80':
tags['seamark:notice:category'] = 'main_waterway_right_secondary_left'
elif attrs['catnmk'] == '81':
tags['seamark:notice:category'] = 'main_waterway_left_secondary_right'
elif attrs['catnmk'] == '82':
tags['seamark:notice:category'] = 'main_waterway_right_secondary_ahead_left'
elif attrs['catnmk'] == '83':
tags['seamark:notice:category'] = 'main_waterway_left_secondary_ahead_right'
elif attrs['catnmk'] == '84':
tags['seamark:notice:category'] = 'main_waterway_crossing'
elif attrs['catnmk'] == '85':
tags['seamark:notice:category'] = 'main_waterway_junction'
elif attrs['catnmk'] == '86':
tags['seamark:notice:category'] = 'main_waterway_ahead_right'
elif attrs['catnmk'] == '87':
tags['seamark:notice:category'] = 'main_waterway_ahead_left'
elif attrs['catnmk'] == '88':
tags['seamark:notice:category'] = 'main_waterway_ahead_right_secondary_left'
elif attrs['catnmk'] == '89':
tags['seamark:notice:category'] = 'main_waterway_ahead_left_secondary_right'
elif attrs['catnmk'] == '90':
tags['seamark:notice:category'] = 'prohibition_ends'
elif attrs['catnmk'] == '91':
tags['seamark:notice:category'] = 'drinking_water'
elif attrs['catnmk'] == '92':
tags['seamark:notice:category'] = 'telephone'
elif attrs['catnmk'] == '93':
tags['seamark:notice:category'] = 'motor_craft_permitted'
elif attrs['catnmk'] == '94':
tags['seamark:notice:category'] = 'sport_craft_permitted'
elif attrs['catnmk'] == '95':
tags['seamark:notice:category'] = 'waterskiing_permitted'
elif attrs['catnmk'] == '96':
tags['seamark:notice:category'] = 'sailing_craft_permitted'
elif attrs['catnmk'] == '97':
tags['seamark:notice:category'] = 'unpowered_craft_permitted'
elif attrs['catnmk'] == '98':
tags['seamark:notice:category'] = 'sailboards_permitted'
elif attrs['catnmk'] == '99':
tags['seamark:notice:category'] = 'radio_information'
elif attrs['catnmk'] == '100':
tags['seamark:notice:category'] = 'waterbikes_permitted'
elif attrs['catnmk'] == '101':
tags['seamark:notice:category'] = 'high_speeds_permitted'
elif attrs['catnmk'] == '102':
tags['seamark:notice:category'] = 'launching_beaching_permitted'
if attrs['dirimp'] == '1':
tags['seamark:notice:direction'] = 'upstream'
elif attrs['dirimp'] == '2':
tags['seamark:notice:direction'] = 'downstream'
elif attrs['dirimp'] == '3':
tags['seamark:notice:direction'] = 'left_bank'
elif attrs['dirimp'] == '4':
tags['seamark:notice:direction'] = 'right_bank'
elif attrs['dirimp'] == '5':
tags['seamark:notice:direction'] = 'to_harbor'
if attrs['disipd'] != :
tags['seamark:notice:distance_down'] = attrs['disipd']
if attrs['disipu'] != :
tags['seamark:notice:distance_up'] = attrs['disipu']
if attrs['disbk1'] != :
tags['seamark:notice:distance_start'] = attrs['disbk1']
if attrs['disbk2'] != :
tags['seamark:notice:distance_end'] = attrs['disbk2']
if attrs['fnctnm'] == '1':
tags['seamark:notice:function'] = 'prohibition'
elif attrs['fnctnm'] == '2':
tags['seamark:notice:function'] = 'regulation'
elif attrs['fnctnm'] == '3':
tags['seamark:notice:function'] = 'restriction'
elif attrs['fnctnm'] == '4':
tags['seamark:notice:function'] = 'recommendation'
elif attrs['fnctnm'] == '5':
tags['seamark:notice:function'] = 'information'
if attrs['marsys'] == '1':
tags['seamark:notice:system'] = 'iala-a'
elif attrs['marsys'] == '2':
tags['seamark:notice:system'] = 'iala-b'
elif attrs['marsys'] == '9':
tags['seamark:notice:system'] = 'none'
elif attrs['marsys'] == '10':
tags['seamark:notice:system'] = 'other'
elif attrs['marsys'] == '11':
tags['seamark:notice:system'] = 'cevni'
elif attrs['marsys'] == '12':
tags['seamark:notice:system'] = 'riwr'
elif attrs['marsys'] == '13':
tags['seamark:notice:system'] = 'bniwr2'
elif attrs['marsys'] == '14':
tags['seamark:notice:system'] = 'bniwr'
elif attrs['marsys'] == '15':
tags['seamark:notice:system'] = 'ppwbc'
if attrs['ORIENT'] != :
tags['seamark:notice:orientation'] = attrs['ORIENT']
if attrs['STATUS'] == '2':
tags['seamark:notice:status'] = 'occasional'
elif attrs['STATUS'] == '3':
tags['seamark:notice:status'] = 'recommended'
elif attrs['STATUS'] == '4':
tags['seamark:notice:status'] = 'not_in_use'
elif attrs['STATUS'] == '8':
tags['seamark:notice:status'] = 'private'
elif attrs['STATUS'] == '9':
tags['seamark:notice:status'] = 'mandatory'
elif attrs['STATUS'] == '12':
tags['seamark:notice:status'] = 'illuminated'
elif attrs['STATUS'] == '14':
tags['seamark:notice:status'] = 'public'
elif attrs['STATUS'] == '16':
tags['seamark:notice:status'] = 'watched'
elif attrs['STATUS'] == '17':
tags['seamark:notice:status'] = 'un-watched'
elif attrs['STATUS'] == '18':
tags['seamark:notice:status'] = 'existence_doubtful'
if attrs['bnkwtw'] == '1':
tags['seamark:notice:bank'] = 'left'
elif attrs['bnkwtw'] == '2':
tags['seamark:notice:bank'] = 'right'
if attrs['CONDTN'] == '1':
tags['seamark:notice:condition'] = 'under_construction'
elif attrs['CONDTN'] == '2':
tags['seamark:notice:condition'] = 'ruined'
elif attrs['CONDTN'] == '3':
tags['seamark:notice:condition'] = 'under_reclamation'
elif attrs['CONDTN'] == '4':
tags['seamark:notice:condition'] = 'wingless'
elif attrs['CONDTN'] == '5':
tags['seamark:notice:condition'] = 'planned_construction'
if attrs['OBJNAM'] != :
tags['seamark:notice:name'] = attrs['OBJNAM']
if attrs['INFORM'] != :
tags['seamark:notice:information'] = attrs['INFORM']
#print(attrs)
return tags
- place both .py-files (ogr2osm.py and SimpleXMLWriter.py), 'test.000'-iENC-file and ienc_notmrk.py-translation-file in your OSGeo4W working-directory
- start OSGeo4W shell
- command:
python ogr2osm.py -o test.osm -t ienc_notmrk.py test.000
- works on NL-iENC files
- not tested on DE iENC-files yet