mirror of
https://github.com/iiab/iiab.git
synced 2025-02-15 04:32:11 +00:00
commit
f7bba98724
15 changed files with 879 additions and 6 deletions
|
@ -27,6 +27,12 @@
|
||||||
when: moodle_install
|
when: moodle_install
|
||||||
tags: olpc, moodle
|
tags: olpc, moodle
|
||||||
|
|
||||||
|
- name: OSM_VECTOR
|
||||||
|
include_role:
|
||||||
|
name: osm-vector
|
||||||
|
when: osm_vector_install is defined and osm_vector_install
|
||||||
|
tags: osm
|
||||||
|
|
||||||
# UNMAINTAINED
|
# UNMAINTAINED
|
||||||
- name: OSM
|
- name: OSM
|
||||||
include_role:
|
include_role:
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
# If nec, change them by editing /etc/iiab/local_vars.yml prior to installing!
|
# If nec, change them by editing /etc/iiab/local_vars.yml prior to installing!
|
||||||
|
|
||||||
elgg_xx: elgg
|
elgg_xx: elgg
|
||||||
elgg_version: "2.3.10"
|
elgg_version: 2.3.11
|
||||||
|
|
||||||
# elgg_mysql_password: defined in default_vars
|
# elgg_mysql_password: defined in default_vars
|
||||||
elgg_url: /elgg
|
elgg_url: /elgg
|
||||||
|
|
|
@ -10,9 +10,9 @@
|
||||||
# Which kiwix-tools to download from http://download.iiab.io/packages/
|
# Which kiwix-tools to download from http://download.iiab.io/packages/
|
||||||
# As obtained from http://download.kiwix.org/release/kiwix-tools/ or http://download.kiwix.org/nightly/
|
# As obtained from http://download.kiwix.org/release/kiwix-tools/ or http://download.kiwix.org/nightly/
|
||||||
|
|
||||||
kiwix_version_armhf: "kiwix-tools_linux-armhf-1.1.0"
|
kiwix_version_armhf: "kiwix-tools_linux-armhf-1.2.0"
|
||||||
kiwix_version_linux64: "kiwix-tools_linux-x86_64-1.1.0"
|
kiwix_version_linux64: "kiwix-tools_linux-x86_64-1.2.0"
|
||||||
kiwix_version_i686: "kiwix-tools_linux-i586-1.1.0"
|
kiwix_version_i686: "kiwix-tools_linux-i586-1.2.0"
|
||||||
# kiwix_src_file_i686: "kiwix-linux-i686.tar.bz2"
|
# kiwix_src_file_i686: "kiwix-linux-i686.tar.bz2"
|
||||||
# v0.9 for i686 published May 2014 ("use it to test legacy ZIM content")
|
# v0.9 for i686 published May 2014 ("use it to test legacy ZIM content")
|
||||||
# v0.10 for i686 published Oct 2016 ("experimental") REPLACED IN EARLY 2018, thx to Matthieu Gautier:
|
# v0.10 for i686 published Oct 2016 ("experimental") REPLACED IN EARLY 2018, thx to Matthieu Gautier:
|
||||||
|
|
|
@ -49,11 +49,11 @@
|
||||||
src: network/rpi.j2
|
src: network/rpi.j2
|
||||||
when: is_rpi and iiab_lan_iface == "br0"
|
when: is_rpi and iiab_lan_iface == "br0"
|
||||||
|
|
||||||
- name: Workaround auto issue (debian-9)
|
- name: Workaround auto issue - ifupdown compatibility mode (debian-9 or debian-10)
|
||||||
template:
|
template:
|
||||||
dest: /etc/network/interfaces.d/patch_auto
|
dest: /etc/network/interfaces.d/patch_auto
|
||||||
src: network/debian-auto.j2
|
src: network/debian-auto.j2
|
||||||
when: iiab_wan_iface != "none" and is_debian_9
|
when: iiab_wan_iface != "none" and (is_debian_9 or is_debian_10)
|
||||||
|
|
||||||
- name: Clearing out /etc/network/interfaces for static addresses (debian-9)
|
- name: Clearing out /etc/network/interfaces for static addresses (debian-9)
|
||||||
lineinfile:
|
lineinfile:
|
||||||
|
|
3
roles/osm-vector/defaults/main.yml
Normal file
3
roles/osm-vector/defaults/main.yml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
menu_def_dir: '{{ doc_root }}/js-menu/menu-files/menu-defs'
|
||||||
|
osm_vector_path: '{{ content_base }}/www/osm-vector'
|
||||||
|
iiab_osm_url : http://download.iiab.io/content/OSM/vector-tiles/maplist/hidden
|
182
roles/osm-vector/files/countries.json
Normal file
182
roles/osm-vector/files/countries.json
Normal file
File diff suppressed because one or more lines are too long
12
roles/osm-vector/files/en-map_test.json
Normal file
12
roles/osm-vector/files/en-map_test.json
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"lang": "en",
|
||||||
|
"intended_use": "map",
|
||||||
|
"automatically_generated": "true",
|
||||||
|
"title": "OpenStreetMap Test Page",
|
||||||
|
"extra_html": "",
|
||||||
|
"start_url": "maplist",
|
||||||
|
"menu_item_name": "en-map_test.json",
|
||||||
|
"map_name": "en-map_test",
|
||||||
|
"logo_url": "osm.jpg",
|
||||||
|
"description": "<p>This page is installed by default during the initial installation of Internet In A Box>"
|
||||||
|
}
|
216
roles/osm-vector/files/osm_functions.js
Normal file
216
roles/osm-vector/files/osm_functions.js
Normal file
|
@ -0,0 +1,216 @@
|
||||||
|
// osm_functions.js -- (non authoritative see below) src = iiab/roles/files/
|
||||||
|
// copyright 2019 George Hunt
|
||||||
|
// CAUTION -- this file is duplicate to admin-console/console/files/js/osm_fuctions.js -- please think of admin-console as authoritative
|
||||||
|
// Placed here in duplicate to ease debugging, and simplify dependences
|
||||||
|
|
||||||
|
var regionGeojson = {};
|
||||||
|
var regionList = [];
|
||||||
|
var regionInstalled = [];
|
||||||
|
var commonAssetsDir = '/common/assets/';
|
||||||
|
var mapAssetsDir = '/osm-vector/maplist/assets/';
|
||||||
|
var iiab_config_dir = '/etc/iiab/';
|
||||||
|
var onChangeFunc = "setSize";
|
||||||
|
var osmCatalog = {};
|
||||||
|
|
||||||
|
// following 2 lines an experiment to see if test page and console can be common
|
||||||
|
//var jquery = require("./assets/jquery.min");
|
||||||
|
//window.$ = window.jQuery = jquery;
|
||||||
|
|
||||||
|
function getOsmStat(){
|
||||||
|
// called during the init
|
||||||
|
console.log('in getOsmStat');
|
||||||
|
readOsmCatalog( true ); // we want checkboxes
|
||||||
|
readOsmIdx();
|
||||||
|
}
|
||||||
|
|
||||||
|
function readOsmIdx(){
|
||||||
|
//consoleLog ("in readOsmIdx");
|
||||||
|
var resp = $.ajax({
|
||||||
|
type: 'GET',
|
||||||
|
url: consoleJsonDir + 'osm-vector-idx.json',
|
||||||
|
dataType: 'json'
|
||||||
|
})
|
||||||
|
.done(function( data ) {
|
||||||
|
osmInstalled = data['regions'];
|
||||||
|
regionInstalled = [];
|
||||||
|
for (region in data['regions']) {
|
||||||
|
if (data['regions'].hasOwnProperty(region)) {
|
||||||
|
regionInstalled.push(region);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//consoleLog(osmInstalled + '');
|
||||||
|
})
|
||||||
|
.fail(jsonErrhandler);
|
||||||
|
|
||||||
|
return resp;
|
||||||
|
}
|
||||||
|
|
||||||
|
function readOsmCatalog(checkbox){
|
||||||
|
checkbox = checkbox || true;
|
||||||
|
console.log ("in readOsmCalalog");
|
||||||
|
regionList = [];
|
||||||
|
var resp = $.ajax({
|
||||||
|
type: 'GET',
|
||||||
|
url: mapAssetsDir + 'regions.json',
|
||||||
|
dataType: 'json'
|
||||||
|
})
|
||||||
|
.done(function( data ) {
|
||||||
|
regionJson = data;
|
||||||
|
osmCatalog = regionJson['regions'];
|
||||||
|
for(var key in osmCatalog){
|
||||||
|
//console.log(key + ' ' + osmCatalog[key]['title']);
|
||||||
|
osmCatalog[key]['name'] = key;
|
||||||
|
regionList.push(osmCatalog[key]);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.fail(jsonErrhandler);
|
||||||
|
return resp;
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderRegionList(checkbox) { // generic
|
||||||
|
var html = "";
|
||||||
|
// order the regionList by seq number
|
||||||
|
var regions = regionList;
|
||||||
|
console.log ("in renderRegionList");
|
||||||
|
|
||||||
|
// sort on basis of seq
|
||||||
|
regions = regions.sort(function(a,b){
|
||||||
|
if (a.seq < b.seq) return -1;
|
||||||
|
else return 1;
|
||||||
|
});
|
||||||
|
//console.log(regions);
|
||||||
|
// render each region
|
||||||
|
html += '<form>';
|
||||||
|
regions.forEach((region, index) => { // now render the html
|
||||||
|
//console.log(region.title + " " +region.seq);
|
||||||
|
html += genRegionItem(region,checkbox);
|
||||||
|
});
|
||||||
|
html += '</form>';
|
||||||
|
//console.log(html);
|
||||||
|
$( "#regionlist" ).html(html);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function genRegionItem(region,checkbox) {
|
||||||
|
var html = "";
|
||||||
|
console.log("in genRegionItem: " + region.name);
|
||||||
|
var itemId = region.title;
|
||||||
|
var ksize = region.size / 1000;
|
||||||
|
//console.log(html);
|
||||||
|
html += '<div class="extract" data-region={"name":"' + region.name + '"}>';
|
||||||
|
html += ' <label>';
|
||||||
|
if ( checkbox ) {
|
||||||
|
if (selectedOsmItems.indexOf(region.name) != -1)
|
||||||
|
checked = 'checked';
|
||||||
|
else
|
||||||
|
checked = '';
|
||||||
|
html += '<input type="checkbox" name="' + region.name + '"';
|
||||||
|
html += ' onChange="updateOsmSpace(this)" ' + checked + '>';
|
||||||
|
}
|
||||||
|
html += itemId;
|
||||||
|
if ( checkbox ) { html += '</input>';};
|
||||||
|
html += '</label>'; // end input
|
||||||
|
html += ' Size: ' + readableSize(ksize);
|
||||||
|
html += '</div>';
|
||||||
|
//console.log(html);
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
function instOsmItem(name) {
|
||||||
|
var command = "INST-OSM-VECT-SET";
|
||||||
|
var cmd_args = {};
|
||||||
|
cmd_args['osm_vect_id'] = name;
|
||||||
|
cmd = command + " " + JSON.stringify(cmd_args);
|
||||||
|
sendCmdSrvCmd(cmd, genericCmdHandler);
|
||||||
|
osmDownloading.push(name);
|
||||||
|
if ( osmWip.indexOf(name) != -1 )
|
||||||
|
osmWip.push(osmCatalog[name]);
|
||||||
|
console.log('osmWip: ' + osmWip);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function jsonErrhandler (jqXHR, textStatus, errorThrown)
|
||||||
|
{
|
||||||
|
// only handle json parse errors here, others in ajaxErrHandler
|
||||||
|
if (textStatus == "parserror") {
|
||||||
|
//alert ("Json Errhandler: " + textStatus + ", " + errorThrown);
|
||||||
|
displayServerCommandStatus("Json Errhandler: " + textStatus + ", " + errorThrown);
|
||||||
|
}
|
||||||
|
//consoleLog("In Error Handler logging jqXHR");
|
||||||
|
console.log(textStatus);
|
||||||
|
console.log(errorThrown);
|
||||||
|
console.log(jqXHR);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function readableSize(kbytes) {
|
||||||
|
if (kbytes == 0)
|
||||||
|
return "0";
|
||||||
|
var bytes = 1024 * kbytes;
|
||||||
|
var s = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];
|
||||||
|
var e = Math.floor(Math.log(bytes) / Math.log(1024));
|
||||||
|
return (bytes / Math.pow(1024, e)).toFixed(2) + " " + s[e];
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateOsmSpace(cb){
|
||||||
|
console.log("in updateOsmSpace" + cb);
|
||||||
|
var region = cb.name;
|
||||||
|
updateOsmSpaceUtil(region, cb.checked);
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateOsmSpaceUtil(region, checked){
|
||||||
|
var size = parseInt(osmCatalog[region].size);
|
||||||
|
|
||||||
|
var modIdx = selectedOsmItems.indexOf(region);
|
||||||
|
|
||||||
|
if (checked){
|
||||||
|
if (regionInstalled.indexOf(region) == -1){ // only update if not already installed mods
|
||||||
|
sysStorage.osm_selected_size += size;
|
||||||
|
selectedOsmItems.push(region);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (modIdx != -1){
|
||||||
|
sysStorage.osm_selected_size -= size;
|
||||||
|
selectedOsmItems.splice(modIdx, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
displaySpaceAvail();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
function totalSpace(){
|
||||||
|
// obsolete but perhaps useful in debugging since it worked
|
||||||
|
var sum = 0;
|
||||||
|
$( ".extract" ).each(function(ind,elem){
|
||||||
|
var data = JSON.parse($(this).attr('data-region'));
|
||||||
|
var region = data.name;
|
||||||
|
var size = parseInt(osmCatalog[region]['size']);
|
||||||
|
var chk = $( this ).find(':checkbox').prop("checked") == true;
|
||||||
|
if (chk && typeof size !== 'undefined')
|
||||||
|
sum += size;
|
||||||
|
});
|
||||||
|
var ksize = sum / 1000;
|
||||||
|
$( "#osmDiskSpace" ).html(readableSize(ksize));
|
||||||
|
}
|
||||||
|
|
||||||
|
$( '#instOsmRegion').on('click', function(evnt){
|
||||||
|
readOsmCatalog();
|
||||||
|
osm.render();
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
function renderOsm(){
|
||||||
|
console.log('in renderOsm');
|
||||||
|
window.map.setTarget($("#osm-container")[0]);
|
||||||
|
window.map.render();
|
||||||
|
renderRegionList(true);
|
||||||
|
}
|
||||||
|
function initOsm(){
|
||||||
|
var dummy = 0;
|
||||||
|
sysStorage.osm_selected_size = 0;
|
||||||
|
$.when(readOsmCatalog(true)).then(renderRegionList);
|
||||||
|
}
|
||||||
|
|
4
roles/osm-vector/files/test-index.redirect
Normal file
4
roles/osm-vector/files/test-index.redirect
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="refresh" content="0; URL=/osm-vector/maplist/" />
|
||||||
|
</head>
|
||||||
|
|
101
roles/osm-vector/tasks/main.yml
Normal file
101
roles/osm-vector/tasks/main.yml
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
- name: Make sure the osm-vector directory exists
|
||||||
|
file:
|
||||||
|
path: '{{ osm_vector_path }}/maplist/assets'
|
||||||
|
state: directory
|
||||||
|
owner: '{{ apache_user }}'
|
||||||
|
group: '{{ apache_user }}'
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Fetch the catalog for osm maps
|
||||||
|
get_url:
|
||||||
|
url: "{{ iiab_osm_url }}/assets/regions.json"
|
||||||
|
dest: '{{ osm_vector_path }}/maplist/assets/'
|
||||||
|
|
||||||
|
- name: Create a link to osm catalog in /common/assets
|
||||||
|
file:
|
||||||
|
src: "{{ osm_vector_path }}/maplist/assets/regions.json"
|
||||||
|
dest: "{{ doc_root }}/common/assets/regions.json"
|
||||||
|
state: link
|
||||||
|
|
||||||
|
- name: Fetch the javascript bundle with openlayers for test page
|
||||||
|
get_url:
|
||||||
|
url: "{{ iiab_osm_url }}/../main.js"
|
||||||
|
dest: '{{ osm_vector_path }}/maplist/'
|
||||||
|
|
||||||
|
- name: Fetch the index.html for test page
|
||||||
|
template:
|
||||||
|
src: "index.html"
|
||||||
|
dest: '{{ osm_vector_path }}/maplist/index.html'
|
||||||
|
|
||||||
|
# Bboxes are currently square. But geofabrik has non-rectangular bboxes
|
||||||
|
# So bring the bounding box definition from cloud (bboxes.geojson is big)
|
||||||
|
- name: Fetch the bounding box description for osm maps
|
||||||
|
get_url:
|
||||||
|
url: "{{ iiab_osm_url }}/assets/bboxes.geojson"
|
||||||
|
dest: '{{ osm_vector_path }}/maplist/assets/'
|
||||||
|
|
||||||
|
- name: Install a package that helps with geojson
|
||||||
|
package:
|
||||||
|
name:
|
||||||
|
- python-geojson
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Install the script to update osm catalog
|
||||||
|
template:
|
||||||
|
src: iiab-update-osm
|
||||||
|
dest: /usr/bin/iiab-update-osm
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
- name: Run the script that does osm-vector housekeeping
|
||||||
|
shell: /usr/bin/iiab-update-osm
|
||||||
|
|
||||||
|
- name: Copy the Countries geojson to assets
|
||||||
|
copy:
|
||||||
|
src: countries.json
|
||||||
|
dest: '{{ osm_vector_path }}/maplist/assets'
|
||||||
|
|
||||||
|
# It is too complicated to use a single file for both iiab and admin-console
|
||||||
|
- name: Copy the duplicated javascript to assets
|
||||||
|
copy:
|
||||||
|
src: osm_functions.js
|
||||||
|
dest: '{{ osm_vector_path }}/maplist/assets'
|
||||||
|
|
||||||
|
- name: Install /etc/{{ apache_config_dir }}/osm-vect.conf from template
|
||||||
|
template:
|
||||||
|
src: osm-vector.conf
|
||||||
|
dest: "/etc/{{ apache_config_dir }}/osm-vector.conf"
|
||||||
|
|
||||||
|
- name: Create symlink osm-vector.conf from sites-enabled to sites-available (debuntu, not nec for redhat)
|
||||||
|
file:
|
||||||
|
src: /etc/apache2/sites-available/osm-vector.conf
|
||||||
|
path: /etc/apache2/sites-enabled/osm-vector.conf
|
||||||
|
state: link
|
||||||
|
when: osm_vector_enabled and is_debuntu
|
||||||
|
|
||||||
|
- name: Remove symlink /etc/apache2/sites-enabled/osm-vector.conf (debuntu)
|
||||||
|
file:
|
||||||
|
path: /etc/apache2/sites-enabled/osm-vector.conf
|
||||||
|
state: absent
|
||||||
|
when: not osm_vector_enabled and is_debuntu
|
||||||
|
|
||||||
|
- name: Copy the redirect to the test page -- delete this if more than one map
|
||||||
|
copy:
|
||||||
|
src: test-index.redirect
|
||||||
|
dest: "{{ osm_vector_path }}/index.html"
|
||||||
|
|
||||||
|
- name: Create a directory for map menu-def
|
||||||
|
file:
|
||||||
|
path: '{{ menu_def_dir }}'
|
||||||
|
state: directory
|
||||||
|
|
||||||
|
- name: Determine status of splash menu def
|
||||||
|
stat:
|
||||||
|
path: '{{ menu_def_dir }}/en-map_test.json'
|
||||||
|
ignore_errors: True
|
||||||
|
register: menu_def
|
||||||
|
|
||||||
|
- name: Do not overwrite if it already exists
|
||||||
|
copy:
|
||||||
|
src: en-map_test.json
|
||||||
|
dest: '{{ menu_def_dir }}/en-map_test.json'
|
||||||
|
when: menu_def.stat.exists is defined and not menu_def.stat.exists
|
189
roles/osm-vector/templates/iiab-update-osm
Executable file
189
roles/osm-vector/templates/iiab-update-osm
Executable file
|
@ -0,0 +1,189 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# Scan the osm-vector directory, update the osm-vector-idx.json, add menu-defs
|
||||||
|
|
||||||
|
from geojson import Feature, Point, FeatureCollection, Polygon
|
||||||
|
import geojson
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import fnmatch
|
||||||
|
import re
|
||||||
|
|
||||||
|
IIAB_PATH='/etc/iiab'
|
||||||
|
if not IIAB_PATH in sys.path:
|
||||||
|
sys.path.append(IIAB_PATH)
|
||||||
|
from iiab_env import get_iiab_env
|
||||||
|
|
||||||
|
SCRIPT_DIR = '/opt/admin/cmdsrv/scripts'
|
||||||
|
if not SCRIPT_DIR in sys.path:
|
||||||
|
sys.path.append(SCRIPT_DIR)
|
||||||
|
if os.path.exists(os.path.join(SCRIPT_DIR,'iiab_update_menus.py')):
|
||||||
|
import iiab_update_menus as menus
|
||||||
|
console_installed = True
|
||||||
|
else:
|
||||||
|
console_installed = False
|
||||||
|
|
||||||
|
doc_root = get_iiab_env('WWWROOT')
|
||||||
|
menuDefs = doc_root + "/js-menu/menu-files/menu-defs/"
|
||||||
|
osm_vector_idx_dir = doc_root + "/common/assets"
|
||||||
|
#map_doc_root = '{{ osm_vector_path }}'
|
||||||
|
map_doc_root = '/library/www/osm-vector'
|
||||||
|
# map_catalog will be global, assumed always available
|
||||||
|
map_catalog = {}
|
||||||
|
map_menu_def_list = []
|
||||||
|
|
||||||
|
def main():
|
||||||
|
global map_menu_def_list
|
||||||
|
get_map_catalog()
|
||||||
|
#print(json.dumps(map_catalog,indent=2))
|
||||||
|
|
||||||
|
map_menu_def_list = get_menu_def_names()
|
||||||
|
print(json.dumps(map_menu_def_list,indent=2))
|
||||||
|
|
||||||
|
installed_maps = get_installed_regions()
|
||||||
|
print(installed_maps)
|
||||||
|
|
||||||
|
write_osm_vector_idx(installed_maps)
|
||||||
|
|
||||||
|
# For installed regions, check that a menu def exists, and it's on home page
|
||||||
|
for fname in installed_maps:
|
||||||
|
region = extract_region_from_filename(fname)
|
||||||
|
print('checking for %s region'%region)
|
||||||
|
if region == 'maplist': # it is the splash page, display only if no others
|
||||||
|
menu_ref = 'en-map_test'
|
||||||
|
item = { "perma_ref" : "en-map_test" }
|
||||||
|
if len(installed_maps) == 1:
|
||||||
|
menus.update_menu_json(menu_ref)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
item = map_catalog['regions'][region]
|
||||||
|
menu_ref = item['perma_ref']
|
||||||
|
if not (region in map_menu_def_list):
|
||||||
|
print('creating menu def for %s'%item['perma_ref'])
|
||||||
|
create_menu_def(region,item['perma_ref'] + '.json')
|
||||||
|
if fetch_menu_json_value('autoupdate_menu'):
|
||||||
|
print('autoudate of menu items is enabled:%s. Adding %s'%(\
|
||||||
|
fetch_menu_json_value('autoupdate_menu'),region,))
|
||||||
|
# verify this menu def is on home page
|
||||||
|
menus.update_menu_json(menu_ref)
|
||||||
|
|
||||||
|
def get_map_catalog():
|
||||||
|
global map_catalog
|
||||||
|
input_json = map_doc_root + '/maplist/assets/regions.json'
|
||||||
|
with open(input_json,'r') as regions:
|
||||||
|
reg_str = regions.read()
|
||||||
|
map_catalog = json.loads(reg_str)
|
||||||
|
#print(json.dumps(map_catalog,indent=2))
|
||||||
|
|
||||||
|
def get_menu_def_names(intended_use='map'):
|
||||||
|
menu_def_list =[]
|
||||||
|
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
|
||||||
|
map_name = data.get('name','')
|
||||||
|
if map_name != '':
|
||||||
|
menu_def_list.append(data['name'])
|
||||||
|
return menu_def_list
|
||||||
|
|
||||||
|
def get_installed_regions():
|
||||||
|
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)
|
||||||
|
# add the splash page if no other maps are present
|
||||||
|
if len(installed) == 0:
|
||||||
|
installed.append('maplist')
|
||||||
|
return installed
|
||||||
|
|
||||||
|
def write_osm_vector_idx(installed_maps):
|
||||||
|
map_dict ={}
|
||||||
|
idx_dict = {}
|
||||||
|
for fname in installed_maps:
|
||||||
|
region = extract_region_from_filename(fname)
|
||||||
|
if map == 'maplist': continue # not a real region
|
||||||
|
map_dict = map_catalog['regions'].get(region,'')
|
||||||
|
if map_dict == '': continue
|
||||||
|
|
||||||
|
# Create the idx file in format required bo js-menu system
|
||||||
|
item = map_dict['perma_ref']
|
||||||
|
idx_dict[item] = {}
|
||||||
|
idx_dict[item]['file_name'] = os.path.basename(map_dict['url'][:-4])
|
||||||
|
idx_dict[item]['menu_item'] = map_dict['perma_ref']
|
||||||
|
idx_dict[item]['size'] = map_dict['size']
|
||||||
|
idx_dict[item]['date'] = map_dict['date']
|
||||||
|
idx_dict[item]['region'] = region
|
||||||
|
idx_dict[item]['language'] = map_dict['perma_ref'][:2]
|
||||||
|
|
||||||
|
with open(osm_vector_idx_dir + '/osm_version_idx.json','w') as idx:
|
||||||
|
idx.write(json.dumps(idx_dict,indent=2))
|
||||||
|
|
||||||
|
def create_menu_def(region,default_name,intended_use='map'):
|
||||||
|
item = map_catalog['regions'][region]
|
||||||
|
if len(item.get('language','')) > 2:
|
||||||
|
lang = item['language'][:2]
|
||||||
|
else: # default to english
|
||||||
|
lang = 'en'
|
||||||
|
filename = lang + '-' + item['perma_ref'] + '.json'
|
||||||
|
# create a stub for this zim
|
||||||
|
menuDef = {}
|
||||||
|
default_logo = 'osm.jpg'
|
||||||
|
menuDef["intended_use"] = "map"
|
||||||
|
menuDef["lang"] = lang
|
||||||
|
menuDef["logo_url"] = default_logo
|
||||||
|
menuitem = lang + '-' + item['perma_ref']
|
||||||
|
menuDef["menu_item_name"] = default_name
|
||||||
|
menuDef["title"] = "OpenStreetMap: 18 Levels of Zoom for <b> " + item.get('title','ERROR') + '</b>'
|
||||||
|
menuDef["map_name"] = item['perma_ref']
|
||||||
|
menuDef["file_name"] = lang + '-osm-omt_' + region + '_' + \
|
||||||
|
os.path.basename(item['url'])[:-4]
|
||||||
|
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>'
|
||||||
|
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)
|
||||||
|
with open(menuDefs + default_name,'w') as menufile:
|
||||||
|
menufile.write(json.dumps(menuDef,indent=2))
|
||||||
|
return default_name[:-5]
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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,'')
|
||||||
|
|
||||||
|
def extract_region_from_filename(fname):
|
||||||
|
substitutions = { "north": "north_america",\
|
||||||
|
"central": "central_america",\
|
||||||
|
"southeast": "southeast_asia",
|
||||||
|
"south": "south_america" }
|
||||||
|
# wish I had used - as separator between key and date
|
||||||
|
nibble = fname.split('_')[0]
|
||||||
|
nibble = substitutions.get(nibble,nibble)
|
||||||
|
return(nibble)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
if console_installed:
|
||||||
|
main()
|
57
roles/osm-vector/templates/index.html
Normal file
57
roles/osm-vector/templates/index.html
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Osm-Vector Splash Page</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<!-- Bootstrap -->
|
||||||
|
<link href="/common/css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
<script src='/common/js/jquery.min.js'></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Vector Maps Test Page -- Use The Admin Console to Download a Selected Region</h2>
|
||||||
|
<p>The IIAB vector maps are based upon OpenStreetMap Data. Each map has general geographic information that covers the <b>whole world </b>with a resolution of about 5 KM. The detailed regions provide data about items that are 5 meters apart. </p>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12"><a href="/admin"><button id="INST-MODS" type="button" class="btn btn-lg btn-primary">Go To Admin Console</button></a></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="osmRegionSelection" >
|
||||||
|
<style>
|
||||||
|
#map-container{
|
||||||
|
background-color: #b2d3f8;
|
||||||
|
float: right;
|
||||||
|
width: 70%;
|
||||||
|
right: 10px;
|
||||||
|
height: 500px;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
padding: 40px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div id="map-container"></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div id='regionlist'>placeholdr</div>
|
||||||
|
</div> <!-- End instOsmRegion Submenu Option Pane -->
|
||||||
|
<script>
|
||||||
|
function readableSize(kbytes) {
|
||||||
|
if (kbytes == 0)
|
||||||
|
return "0";
|
||||||
|
var bytes = 1024 * kbytes;
|
||||||
|
var s = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];
|
||||||
|
var e = Math.floor(Math.log(bytes) / Math.log(1024));
|
||||||
|
return (bytes / Math.pow(1024, e)).toFixed(2) + " " + s[e];
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script src="/osm-vector/maplist/assets/osm_functions.js"></script>
|
||||||
|
<script>
|
||||||
|
window.$ = window.$ = jQuery;
|
||||||
|
$.when(readOsmCatalog()).done(function() {
|
||||||
|
renderRegionList(false);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript" src="/osm-vector/maplist/main.js"></script></body>
|
||||||
|
</html>
|
89
roles/osm-vector/templates/main.js
Normal file
89
roles/osm-vector/templates/main.js
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
import {Fill, Stroke, Style} from 'ol/style';
|
||||||
|
import 'ol/ol.css';
|
||||||
|
import GeoJSON from 'ol/format/GeoJSON';
|
||||||
|
import Map from 'ol/Map';
|
||||||
|
import VectorLayer from 'ol/layer/Vector';
|
||||||
|
import VectorSource from 'ol/source/Vector';
|
||||||
|
import View from 'ol/View';
|
||||||
|
//import XYZSource from 'ol/source/XYZ';
|
||||||
|
//import MVT from 'ol/format/MVT';
|
||||||
|
|
||||||
|
// a global variable to control which features are shown
|
||||||
|
var show = {};
|
||||||
|
var mapData = "/common/assets";
|
||||||
|
|
||||||
|
|
||||||
|
var map = new Map({
|
||||||
|
target: 'map-container',
|
||||||
|
layers: [
|
||||||
|
new VectorLayer({
|
||||||
|
source: new VectorSource({
|
||||||
|
format: new GeoJSON(),
|
||||||
|
url: mapData + '/countries.json'
|
||||||
|
}),
|
||||||
|
style: new Style({
|
||||||
|
fill: new Fill({
|
||||||
|
color: 'rgb(219, 180, 131)'
|
||||||
|
}),
|
||||||
|
stroke: new Stroke({
|
||||||
|
color: 'white'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}),
|
||||||
|
|
||||||
|
],
|
||||||
|
|
||||||
|
view: new View({
|
||||||
|
center: [0, 0],
|
||||||
|
zoom: 2
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
var setBoxStyle = function(feature) {
|
||||||
|
var name = feature.get("name");
|
||||||
|
//alert(keys+'');
|
||||||
|
if (typeof show !== 'undefined' &&
|
||||||
|
show != null && name == show) {
|
||||||
|
return new Style({
|
||||||
|
fill: new Fill({
|
||||||
|
color: 'rgba(67, 163, 46, 0.2)'
|
||||||
|
}),
|
||||||
|
stroke: new Stroke({
|
||||||
|
color: 'rgba(67, 163, 46, 1)',
|
||||||
|
width: 2
|
||||||
|
})
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
return new Style({
|
||||||
|
fill: new Fill({
|
||||||
|
color: 'rgba(255,255,255,.10)'
|
||||||
|
}),
|
||||||
|
stroke: new Stroke({
|
||||||
|
color: 'rgba(255,255,255,.3)'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var boxLayer = new VectorLayer({
|
||||||
|
source: new VectorSource({
|
||||||
|
format: new GeoJSON(),
|
||||||
|
url: mapData + '/bboxes.geojson'
|
||||||
|
}),
|
||||||
|
id: 'boxes',
|
||||||
|
style: setBoxStyle
|
||||||
|
});
|
||||||
|
map.addLayer(boxLayer);
|
||||||
|
|
||||||
|
$( document ).on("mouseover",".extract",function(){
|
||||||
|
|
||||||
|
var data = JSON.parse($(this).attr('data-region'));
|
||||||
|
show = data.name;
|
||||||
|
//setBoxStyle();
|
||||||
|
boxLayer.changed();
|
||||||
|
});
|
||||||
|
$( document ).on("mouseout",".extract",function(){
|
||||||
|
var data = JSON.parse($(this).attr('data-region'));
|
||||||
|
show = '';
|
||||||
|
boxLayer.changed();
|
||||||
|
});
|
8
roles/osm-vector/templates/osm-vector.conf
Normal file
8
roles/osm-vector/templates/osm-vector.conf
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# For downloadable regional vector tilesets
|
||||||
|
Alias /maps {{ osm_vector_path }}
|
||||||
|
Alias /osm-vector {{ osm_vector_path }}
|
||||||
|
<Directory {{ osm_vector_path }}>
|
||||||
|
Options Indexes FollowSymLinks
|
||||||
|
AllowOverride All
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
|
@ -15,6 +15,7 @@ pip_packages_dir: "{{ iiab_base }}/pip-packages"
|
||||||
yum_packages_dir: "{{ iiab_base }}/yum-packages"
|
yum_packages_dir: "{{ iiab_base }}/yum-packages"
|
||||||
downloads_dir: "{{ iiab_base }}/downloads"
|
downloads_dir: "{{ iiab_base }}/downloads"
|
||||||
iiab_download_url: http://download.iiab.io/packages
|
iiab_download_url: http://download.iiab.io/packages
|
||||||
|
iiab_osm_url : http://download.iiab.io/content/OSM/vector-tiles/maplist/hidden
|
||||||
|
|
||||||
content_base: "/library"
|
content_base: "/library"
|
||||||
doc_base: "{{ content_base }}/www"
|
doc_base: "{{ content_base }}/www"
|
||||||
|
@ -350,6 +351,11 @@ mongodb_install: False
|
||||||
mongodb_enabled: False
|
mongodb_enabled: False
|
||||||
mongodb_port: 27018
|
mongodb_port: 27018
|
||||||
|
|
||||||
|
# Regional OSM vector maps take much less disk space than image versions
|
||||||
|
osm_vector_install: True
|
||||||
|
osm_vector_enabled: True
|
||||||
|
osm_vector_path: '{{ content_base }}/www/osm-vector'
|
||||||
|
|
||||||
# roles/sugarizer/meta/main.yml auto-invokes 2 above prereqs: mongodb & nodejs
|
# roles/sugarizer/meta/main.yml auto-invokes 2 above prereqs: mongodb & nodejs
|
||||||
# Might stall MongoDB on Power Failure: github.com/xsce/xsce/issues/879
|
# Might stall MongoDB on Power Failure: github.com/xsce/xsce/issues/879
|
||||||
# Sugarizer 1.0.1+ strategies to solve? github.com/iiab/iiab/pull/957
|
# Sugarizer 1.0.1+ strategies to solve? github.com/iiab/iiab/pull/957
|
||||||
|
|
Loading…
Reference in a new issue