2019-03-18 04:45:33 +00:00
#!/usr/bin/env python
2019-03-19 04:36:23 +00:00
# Scan the osm-vector directory, update the osm-vector-idx.json, add menu-defs
2019-03-18 04:45:33 +00:00
from geojson import Feature, Point, FeatureCollection, Polygon
import geojson
import json
import os
2019-03-19 04:36:23 +00:00
import sys
import fnmatch
2019-03-25 18:09:13 +00:00
import re
2019-03-18 04:45:33 +00:00
2019-03-19 04:36:23 +00:00
IIAB_PATH='/etc/iiab'
if not IIAB_PATH in sys.path:
sys.path.append(IIAB_PATH)
from iiab_env import get_iiab_env
2019-03-18 04:45:33 +00:00
2019-03-25 18:09:13 +00:00
SCRIPT_DIR = '/opt/admin/cmdsrv/scripts'
if not SCRIPT_DIR in sys.path:
sys.path.append(SCRIPT_DIR)
2019-03-26 01:35:54 +00:00
import iiab_update_menus as menus
2019-03-25 18:09:13 +00:00
2019-03-19 04:36:23 +00:00
doc_root = get_iiab_env('WWWROOT')
menuDefs = doc_root + "/js-menu/menu-files/menu-defs/"
2019-04-03 16:52:22 +00:00
osm_vector_idx_dir = doc_root + "/common/assets"
2019-04-02 20:18:18 +00:00
#map_doc_root = '{{ osm_vector_path }}'
2019-03-25 18:09:13 +00:00
map_doc_root = '/library/osm-vector'
# map_catalog will be global, assumed always available
2019-03-19 04:36:23 +00:00
map_catalog = {}
2019-04-02 20:18:18 +00:00
map_menu_def_list = []
2019-03-25 18:09:13 +00:00
2019-03-18 04:45:33 +00:00
def main():
2019-03-19 04:36:23 +00:00
global map_menu_defs
get_map_catalog()
2019-03-25 18:09:13 +00:00
#print(json.dumps(map_catalog,indent=2))
2019-04-02 20:18:18 +00:00
map_menu_def_list = get_menu_def_names()
2019-03-25 18:09:13 +00:00
#print(json.dumps(map_menu_defs,indent=2))
2019-03-26 00:34:04 +00:00
installed_maps = get_installed_regions()
2019-04-02 20:18:18 +00:00
print(installed_maps)
2019-03-25 18:09:13 +00:00
write_osm_vector_idx(installed_maps)
2019-03-26 00:34:04 +00:00
for region in installed_maps:
2019-03-26 01:35:54 +00:00
#print('checking for %s region'%region)
2019-04-02 20:18:18 +00:00
if region != 'assets':
item = map_catalog['regions'][region]
menu_ref = item['perma_ref']
else:
menu_ref = 'en-map_test'
if region != 'assets' and not (region in map_menu_def_list):
print('creating menu def for %s'%item['perma_ref'])
2019-03-26 01:35:54 +00:00
create_menu_def(region,item['perma_ref'] + '.json')
2019-04-02 20:18:18 +00:00
if fetch_menu_json_value('autoupdate_menu'):
print('fetch_menu returned %s'%fetch_menu_json_value('autoupdate_menu'))
2019-03-26 01:35:54 +00:00
# add this new menu def to home page
2019-04-02 20:18:18 +00:00
print('calling to insert %s.json'%menu_ref)
menus.update_menu_json(menu_ref)
print('fetch_menu returned %s'%fetch_menu_json_value('autoupdate_menu'))
2019-03-19 04:36:23 +00:00
def get_map_catalog():
global map_catalog
2019-04-03 19:57:28 +00:00
input_json = map_doc_root + '/assets/regions.json'
2019-03-18 04:45:33 +00:00
with open(input_json,'r') as regions:
reg_str = regions.read()
2019-03-19 04:36:23 +00:00
map_catalog = json.loads(reg_str)
#print(json.dumps(map_catalog,indent=2))
def get_menu_def_names(intended_use='map'):
2019-04-02 20:18:18 +00:00
menu_def_list =[]
2019-03-19 04:36:23 +00:00
os.chdir(menuDefs)
for filename in os.listdir('.'):
if fnmatch.fnmatch(filename, '*.json'):
try:
with open(filename,'r') as json_file:
readstr = json_file.read()
data = json.loads(readstr)
except:
print("failed to parse %s"%filename)
print(readstr)
if data.get('intended_use','') != intended_use:
continue
2019-03-25 18:09:13 +00:00
map_name = data.get('name','')
if map_name != '':
2019-04-02 20:18:18 +00:00
menu_def_list.append(data['name'])
return menu_def_list
2019-03-18 04:45:33 +00:00
2019-03-26 00:34:04 +00:00
def get_installed_regions():
2019-03-25 18:09:13 +00:00
installed = []
os.chdir(map_doc_root)
for filename in os.listdir('.'):
if fnmatch.fnmatch(filename, '??-osm-omt*'):
region = re.sub(r'^..-osm-omt_(.*)',r'\1',filename)
installed.append(region)
2019-04-02 20:18:18 +00:00
# add the splash page if no other maps are present
if len(installed) == 0:
installed.append('assets')
2019-03-25 18:09:13 +00:00
return installed
def write_osm_vector_idx(installed_maps):
2019-03-26 00:34:04 +00:00
map_dict ={}
map_dict['regions'] = {}
2019-03-25 18:09:13 +00:00
for map in installed_maps:
2019-04-02 20:18:18 +00:00
if map == 'assets': continue # not a real region
2019-03-25 18:09:13 +00:00
data_dict = map_catalog['regions'].get(map,'')
2019-03-26 00:34:04 +00:00
map_dict['regions'][map] = data_dict
with open(osm_vector_idx_dir + '/osm-vector-idx.json','w') as idx:
idx.write(json.dumps(map_dict,indent=2))
2019-03-25 18:09:13 +00:00
2019-03-26 00:34:04 +00:00
def create_menu_def(region,default_name,intended_use='map'):
item = map_catalog['regions'][region]
2019-03-25 18:09:13 +00:00
if len(item.get('language','')) > 2:
lang = item['language'][:2]
else: # default to english
lang = 'en'
2019-03-26 00:34:04 +00:00
filename = lang + '-' + item['perma_ref'] + '.json'
2019-03-25 18:09:13 +00:00
# create a stub for this zim
menuDef = {}
2019-03-26 00:34:04 +00:00
default_logo = 'osm.jpg'
2019-03-25 18:09:13 +00:00
menuDef["intended_use"] = "map"
menuDef["lang"] = lang
menuDef["logo_url"] = default_logo
2019-03-26 00:34:04 +00:00
menuitem = lang + '-' + item['perma_ref']
menuDef["menu_item_name"] = default_name
2019-04-02 20:18:18 +00:00
menuDef["title"] = "OpenStreetMap: 18 Levels of Zoom for <b> " + item.get('title','ERROR') + '</b>'
2019-03-26 00:34:04 +00:00
menuDef["map_name"] = item['perma_ref']
2019-04-02 20:18:18 +00:00
menuDef["start_url"] = lang + '-' + item['perma_ref']
menuDef["description"] = '<p>Resolution of the Whole World to 5 KM. OpenStreetMap data for <b>' + item.get('title','') + '</b> with details down to 5 Meters</p>'
2019-03-25 18:09:13 +00:00
menuDef["extra_html"] = ""
menuDef["automatically_generated"] = "true"
if not os.path.isfile(menuDefs + default_name): # logic to here can still overwrite existing menu def
print("creating %s"%menuDefs + default_name)
2019-04-02 20:18:18 +00:00
with open(menuDefs + default_name,'w') as menufile:
2019-03-25 18:09:13 +00:00
menufile.write(json.dumps(menuDef,indent=2))
return default_name[:-5]
2019-03-19 04:36:23 +00:00
def human_readable(num):
# return 3 significant digits and unit specifier
num = float(num)
units = [ '','K','M','G']
for i in range(4):
if num<10.0:
return "%.2f%s"%(num,units[i])
if num<100.0:
return "%.1f%s"%(num,units[i])
if num < 1000.0:
return "%.0f%s"%(num,units[i])
num /= 1000.0
2019-03-18 04:45:33 +00:00
2019-04-02 20:18:18 +00:00
def fetch_menu_json_value(key):
with open( doc_root + '/home/menu.json','r') as menudef:
data = json.loads(menudef.read())
return data.get(key,'')
2019-03-18 04:45:33 +00:00
if __name__ == '__main__':
main()