Next
This commit is contained in:
Generated
+21
@@ -6385,6 +6385,11 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"flatted": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz",
|
||||
"integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg=="
|
||||
},
|
||||
"flatten": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz",
|
||||
@@ -16043,6 +16048,22 @@
|
||||
"electron-store": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"vuex-persist": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/vuex-persist/-/vuex-persist-2.2.0.tgz",
|
||||
"integrity": "sha512-o/qbBeMcKZZqMvCXc7kfIew/5cjHxlP1f53rx5YYp3r2tk2kxXYK/UZumxKn7OXywlurl2r0mgkuBzH6nIWFjw==",
|
||||
"requires": {
|
||||
"flatted": "^2.0.0",
|
||||
"lodash.merge": "^4.6.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"lodash.merge": {
|
||||
"version": "4.6.2",
|
||||
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
|
||||
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"vuex-persistedstate": {
|
||||
"version": "2.7.0",
|
||||
"resolved": "https://registry.npmjs.org/vuex-persistedstate/-/vuex-persistedstate-2.7.0.tgz",
|
||||
|
||||
@@ -78,6 +78,7 @@
|
||||
"vuetify": "^2.1.9",
|
||||
"vuex": "^3.0.1",
|
||||
"vuex-electron": "^1.0.0",
|
||||
"vuex-persist": "^2.2.0",
|
||||
"vuex-persistedstate": "^2.7.0",
|
||||
"worker-threads": "^1.0.0",
|
||||
"xamel": "^0.3.1"
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
function getApts (params) {
|
||||
console.log('Log')
|
||||
}
|
||||
|
||||
export {getApts}
|
||||
@@ -0,0 +1,41 @@
|
||||
<template>
|
||||
<div id="panel" width="100%">
|
||||
<div id="panel" width="100%" v-if="airport">
|
||||
<h1 class="leaflet-sidebar-header">
|
||||
Airports
|
||||
<div class="leaflet-sidebar-close">
|
||||
<i class="fa fa-caret-left"></i>
|
||||
</div>
|
||||
</h1>
|
||||
<el-row>
|
||||
<el-col :span="7">ICAO : </el-col>
|
||||
<el-col :span="15">{{ this.$store.state.Editable.data.properties.icao }}</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="7">Name : </el-col>
|
||||
<el-col :span="15">{{ this.$store.state.Editable.data.properties.name }}</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="7">Flights : </el-col>
|
||||
<el-col :span="15">{{ this.$store.state.Editable.data.properties.flights }}</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="7">Airlines : </el-col>
|
||||
<el-col :span="15">{{ this.$store.state.Editable.data.properties.airlines }}</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="js">
|
||||
export default {
|
||||
computed: {
|
||||
airport: function () {
|
||||
return this.$store.state.Editable.type === 'airport'
|
||||
},
|
||||
airports_directory: function () {
|
||||
return this.$store.state.Settings.settings.airportsDirectory
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -5,30 +5,40 @@
|
||||
</template>
|
||||
|
||||
<script lang="js">
|
||||
import { LMap, LMarker } from 'vue2-leaflet'
|
||||
import L from 'leaflet'
|
||||
|
||||
export default {
|
||||
name: 'edit-layer',
|
||||
props: [],
|
||||
mounted () {
|
||||
this.add()
|
||||
console.log(LMap)
|
||||
console.log(LMarker)
|
||||
console.log(L)
|
||||
this.$store.dispatch('getAirports')
|
||||
console.log(this.$store.state.Airports.airports)
|
||||
LMap.on('dragend', function onDragEnd () {
|
||||
var width = L.Map.getBounds().getEast() - L.Map.getBounds().getWest()
|
||||
var height = L.Map.getBounds().getNorth() - L.Map.getBounds().getSouth()
|
||||
console.log(
|
||||
'center:' + L.Map.getCenter() + '\n' +
|
||||
'width:' + width + '\n' +
|
||||
'height:' + height + '\n' +
|
||||
'size in pixels:' + L.Map.getSize()
|
||||
)
|
||||
})
|
||||
},
|
||||
beforeDestroy () {
|
||||
this.remove()
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
deferredMountedTo (parent) {
|
||||
this.sidebar = L.control.sidebar({
|
||||
autopan: false, // whether to maintain the centered map point when opening the sidebar
|
||||
closeButton: true, // whether t add a close button to the panes
|
||||
container: 'sidebar', // the DOM container or #ID of a predefined sidebar container that should be used
|
||||
position: 'left' // left or right
|
||||
})
|
||||
parent.addControl(this.sidebar)
|
||||
console.log(parent)
|
||||
console.log(L)
|
||||
},
|
||||
remove () {
|
||||
if (this.sidebar) {
|
||||
|
||||
@@ -1,15 +1,31 @@
|
||||
<template>
|
||||
<l-map :zoom="zoom" :center="center">
|
||||
<l-tile-layer :url="url" :attribution="attribution"></l-tile-layer>
|
||||
<l-marker :lat-lng="marker"></l-marker>
|
||||
<LeafletSidebar></LeafletSidebar>
|
||||
<EditLayer></EditLayer>
|
||||
</l-map>
|
||||
<l-map
|
||||
:zoom="zoom"
|
||||
:center="center"
|
||||
@update:zoom="zoomUpdated"
|
||||
@update:center="centerUpdated"
|
||||
@update:bounds="boundsUpdated"
|
||||
>
|
||||
<l-tile-layer :url="url" :attribution="attribution"></l-tile-layer>
|
||||
<!--<l-marker :lat-lng="marker"></l-marker>-->
|
||||
<LeafletSidebar></LeafletSidebar>
|
||||
<EditLayer></EditLayer>
|
||||
<l-layer-group layerType="overlay" name="Sources">
|
||||
<l-circle
|
||||
v-for="(item, index) in this.$store.state.Airports.airports"
|
||||
:key="index"
|
||||
:lat-lng="[item.geometry.coordinates[1], item.geometry.coordinates[0]]"
|
||||
:radius="((item.properties.flights+5)*20)"
|
||||
:color="item.properties.color"
|
||||
@click="onClick(item)"
|
||||
></l-circle>
|
||||
</l-layer-group>
|
||||
</l-map>
|
||||
</template>
|
||||
|
||||
<script lang="js">
|
||||
import 'leaflet/dist/leaflet.css'
|
||||
import { LMap, LTileLayer, LMarker } from 'vue2-leaflet'
|
||||
import { LMap, LTileLayer, LMarker, LCircle, LLayerGroup } from 'vue2-leaflet'
|
||||
import LeafletSidebar from './LeafletSidebar'
|
||||
import EditLayer from './EditLayer'
|
||||
import L from 'leaflet'
|
||||
@@ -24,21 +40,37 @@
|
||||
})
|
||||
export default {
|
||||
name: 'flightgear-map',
|
||||
components: { LMap, LTileLayer, LMarker, LeafletSidebar, EditLayer },
|
||||
components: { LMap, LTileLayer, LMarker, LCircle, LeafletSidebar, EditLayer, LLayerGroup },
|
||||
props: [],
|
||||
mounted () {
|
||||
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
zoom: 13,
|
||||
center: L.latLng(47.413220, -1.219482),
|
||||
zoom: this.$store.state.Settings.zoom,
|
||||
center: this.$store.state.Settings.center,
|
||||
url: 'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
|
||||
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors',
|
||||
marker: L.latLng(47.413220, -1.219482)
|
||||
marker: L.latLng(47.413220, -1.219482),
|
||||
airports: this.$store.state.Airports.airports
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onClick (item) {
|
||||
console.log(item)
|
||||
this.$store.commit('SET_EDIT_AIRPORT', item)
|
||||
},
|
||||
zoomUpdated (zoom) {
|
||||
this.zoom = zoom
|
||||
this.$store.commit('ZOOM', this.zoom)
|
||||
},
|
||||
centerUpdated (center) {
|
||||
this.center = center
|
||||
this.$store.commit('CENTER', this.center)
|
||||
},
|
||||
boundsUpdated (bounds) {
|
||||
this.bounds = bounds
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -47,13 +79,13 @@
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.vue2leaflet-map {
|
||||
height: 100%;
|
||||
}
|
||||
.l-map{
|
||||
height: 100%;
|
||||
}
|
||||
.flightgear-map {
|
||||
color: aqua
|
||||
}
|
||||
.vue2leaflet-map {
|
||||
height: 100%;
|
||||
}
|
||||
.l-map {
|
||||
height: 100%;
|
||||
}
|
||||
.flightgear-map {
|
||||
color: aqua;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
<div class="leaflet-sidebar-tabs">
|
||||
<ul role="tablist"> <!-- top aligned tabs -->
|
||||
<li><a href="#home" role="tab"><i class="fa fa-bars"></i></a></li>
|
||||
<li><a href="#airports" role="tab"><i class="fa fa-pencil"></i></a></li>
|
||||
<li><a href="#scan" role="tab"><i class="fa fa-search"></i></a></li>
|
||||
</ul>
|
||||
|
||||
@@ -21,7 +22,14 @@
|
||||
</h1>
|
||||
<p>A responsive sidebar for mapping libraries</p>
|
||||
</div>
|
||||
<div class="leaflet-sidebar-pane" id="airports">
|
||||
<AirportEdit></AirportEdit>
|
||||
</div>
|
||||
<div class="leaflet-sidebar-pane" id="scan">
|
||||
<h1 class="leaflet-sidebar-header">
|
||||
Scanning
|
||||
<div class="leaflet-sidebar-close"><i class="fa fa-caret-left"></i></div>
|
||||
</h1>
|
||||
<RunScan></RunScan>
|
||||
</div>
|
||||
<div class="leaflet-sidebar-pane" id="settings">
|
||||
@@ -36,13 +44,14 @@
|
||||
import 'font-awesome/css/font-awesome.css'
|
||||
import {} from 'leaflet-sidebar-v2'
|
||||
import L from 'leaflet'
|
||||
import AirportEdit from './AirportEdit'
|
||||
import SettingsPanel from './SettingsPanel'
|
||||
import RunScan from './RunScan'
|
||||
import FileSelect from './FileSelect'
|
||||
|
||||
export default {
|
||||
name: 'leaflet-sidebar',
|
||||
components: { SettingsPanel, RunScan, FileSelect },
|
||||
components: { AirportEdit, SettingsPanel, RunScan, FileSelect },
|
||||
props: [],
|
||||
mounted () {
|
||||
this.add()
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-container direction='vertical'>
|
||||
<el-button @click="scanAPT()">Scan APT File</el-button>
|
||||
<el-button @click="scanGroundnets()">Scan Groundnet Files</el-button>
|
||||
<el-button @click="scanTraffic()">Scan Traffic Files</el-button>
|
||||
</el-container>
|
||||
<el-container direction="vertical">
|
||||
<el-button @click="scanAPT()">Scan APT File</el-button>
|
||||
<el-button @click="scanGroundnets()">Scan Groundnet Files</el-button>
|
||||
<el-button @click="scanTraffic()">Scan Traffic Files</el-button>
|
||||
</el-container>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -38,11 +38,14 @@
|
||||
console.log(fileUrl('src/renderer/utils/worker.js'))
|
||||
|
||||
// var worker = new Worker(fileUrl('src/renderer/utils/worker.js'))
|
||||
worker.postMessage('scanapt')
|
||||
worker.postMessage(['scanapt'])
|
||||
// the reply
|
||||
var store = this.$store
|
||||
worker.onmessage = function (e) {
|
||||
if (e.data === 'DONE') {
|
||||
console.log('DONE')
|
||||
store.dispatch('getAirports')
|
||||
worker.terminate()
|
||||
}
|
||||
console.log(e.data)
|
||||
}
|
||||
@@ -60,12 +63,14 @@
|
||||
const worker = new Worker(winURL)
|
||||
console.log(fileUrl('src/renderer/utils/worker.js'))
|
||||
|
||||
// var worker = new Worker(fileUrl('src/renderer/utils/worker.js'))
|
||||
worker.postMessage('scan')
|
||||
worker.postMessage(['scan', this.$store.state.Settings.settings.airportsDirectory])
|
||||
// the reply
|
||||
var store = this.$store
|
||||
worker.onmessage = function (e) {
|
||||
if (e.data === 'DONE') {
|
||||
console.log('DONE')
|
||||
store.dispatch('getAirports')
|
||||
worker.terminate()
|
||||
}
|
||||
console.log(e.data)
|
||||
}
|
||||
@@ -83,13 +88,14 @@
|
||||
|
||||
const worker = new Worker(winURL)
|
||||
console.log(fileUrl('src/renderer/utils/worker.js'))
|
||||
|
||||
// var worker = new Worker(fileUrl('src/renderer/utils/worker.js'))
|
||||
worker.postMessage('scanai')
|
||||
worker.postMessage(['scanai', this.$store.state.Settings.settings.flightgearDirectory])
|
||||
// the reply
|
||||
var store = this.$store
|
||||
worker.onmessage = function (e) {
|
||||
if (e.data === 'DONE') {
|
||||
console.log('DONE')
|
||||
store.dispatch('getAirports')
|
||||
worker.terminate()
|
||||
}
|
||||
console.log(e.data)
|
||||
}
|
||||
|
||||
@@ -7,11 +7,18 @@
|
||||
</div>
|
||||
</h1>
|
||||
<div id="panel" width="100%">
|
||||
<el-row>
|
||||
<el-col :span="7">Airports Directory</el-col>
|
||||
<el-col :span="15">{{ airports_directory }}</el-col>
|
||||
<el-col :span="2">
|
||||
<directory-select @input="airportsDirectorySelect"></directory-select>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="7">Flightgear Directory</el-col>
|
||||
<el-col :span="15">{{ flightgear_directory }}</el-col>
|
||||
<el-col :span="2">
|
||||
<directory-select @input="directorySelect"></directory-select>
|
||||
<directory-select @input="flightgearDirectorySelect"></directory-select>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
@@ -33,14 +40,21 @@
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
directorySelect: function (flightgearDirectory) {
|
||||
flightgearDirectorySelect: function (flightgearDirectory) {
|
||||
console.log(flightgearDirectory)
|
||||
this.$store.commit('SETTINGS_DIRECTORY', flightgearDirectory.path)
|
||||
this.$store.commit('FLIGHTGEAR_DIRECTORY', flightgearDirectory.path)
|
||||
},
|
||||
airportsDirectorySelect: function (flightgearDirectory) {
|
||||
console.log(flightgearDirectory)
|
||||
this.$store.commit('AIPORTS_DIRECTORY', flightgearDirectory.path)
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
flightgear_directory: function () {
|
||||
return this.$store.state.Settings.settings.flightgearDirectory
|
||||
},
|
||||
airports_directory: function () {
|
||||
return this.$store.state.Settings.settings.airportsDirectory
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@ export default new VueIdb({
|
||||
},
|
||||
apis: {
|
||||
bigs: {
|
||||
all: () => axios.get('/dev/data/data.json')
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
/* eslint-disable */
|
||||
const DB_NAME = 'flightgear';
|
||||
const DB_VERSION = 2;
|
||||
let DB;
|
||||
|
||||
export default {
|
||||
|
||||
async getDb() {
|
||||
return new Promise((resolve, reject) => {
|
||||
|
||||
if(DB) { return resolve(DB); }
|
||||
console.log('OPENING DB', DB);
|
||||
let request = window.indexedDB.open(DB_NAME, DB_VERSION);
|
||||
|
||||
request.onerror = e => {
|
||||
console.log('Error opening db', e);
|
||||
reject('Error');
|
||||
};
|
||||
|
||||
request.onsuccess = e => {
|
||||
DB = e.target.result;
|
||||
resolve(DB);
|
||||
};
|
||||
|
||||
request.onupgradeneeded = e => {
|
||||
console.log('onupgradeneeded');
|
||||
let db = e.target.result;
|
||||
db.createObjectStore("airports", { autoIncrement: true, keyPath:'properties.icao' });
|
||||
};
|
||||
});
|
||||
},
|
||||
async deleteAirport(airport) {
|
||||
|
||||
let db = await this.getDb();
|
||||
|
||||
return new Promise(resolve => {
|
||||
|
||||
let trans = db.transaction(['airports'],'readwrite');
|
||||
trans.oncomplete = () => {
|
||||
resolve();
|
||||
};
|
||||
|
||||
let store = trans.objectStore('airports');
|
||||
store.delete(airport.features.icao);
|
||||
});
|
||||
},
|
||||
async getAirports() {
|
||||
|
||||
let db = await this.getDb();
|
||||
|
||||
return new Promise(resolve => {
|
||||
|
||||
let trans = db.transaction(['airports'],'readonly');
|
||||
trans.oncomplete = () => {
|
||||
resolve(airports);
|
||||
};
|
||||
|
||||
let store = trans.objectStore('airports');
|
||||
let airports = [];
|
||||
|
||||
store.openCursor().onsuccess = e => {
|
||||
let cursor = e.target.result;
|
||||
if (cursor) {
|
||||
airports.push(cursor.value)
|
||||
cursor.continue();
|
||||
}
|
||||
};
|
||||
|
||||
});
|
||||
},
|
||||
|
||||
async saveAirport(airport) {
|
||||
|
||||
let db = await this.getDb();
|
||||
|
||||
return new Promise(resolve => {
|
||||
|
||||
let trans = db.transaction(['airports'],'readwrite');
|
||||
trans.oncomplete = () => {
|
||||
resolve();
|
||||
};
|
||||
|
||||
let store = trans.objectStore('airports');
|
||||
store.put(airport);
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import Vuex from 'vuex'
|
||||
// import from 'electron-settings'
|
||||
// import the auto exporter
|
||||
import createPersistedState from 'vuex-persistedstate'
|
||||
|
||||
import createLogger from 'vuex/dist/logger'
|
||||
import modules from './modules'
|
||||
|
||||
@@ -12,5 +12,5 @@ const debug = process.env.NODE_ENV !== 'production'
|
||||
export default new Vuex.Store({
|
||||
modules,
|
||||
strict: debug,
|
||||
plugins: debug ? [createLogger()] : [] // set logger only for development
|
||||
plugins: debug ? [createLogger(), createPersistedState({paths: ['Settings']})] : [] // set logger only for development
|
||||
})
|
||||
|
||||
@@ -1,22 +1,46 @@
|
||||
/* eslint-disable */
|
||||
import idb from '../api/airports';
|
||||
|
||||
const ADD_AIRPORT = 'ADD_AIRPORT';
|
||||
const SET_AIRPORTS = 'SET_AIRPORTS';
|
||||
const RESET_AIRPORTS = 'RESET_AIRPORTS';
|
||||
|
||||
const state = {
|
||||
main: 0
|
||||
airports: []
|
||||
}
|
||||
|
||||
const mutations = {
|
||||
DECREMENT_MAIN_COUNTER (state) {
|
||||
state.main--
|
||||
'DELETE_INDEXED_DB' () { },
|
||||
ADD_AIRPORT (state, airports) {
|
||||
state.airports.push(airports);
|
||||
},
|
||||
INCREMENT_MAIN_COUNTER (state) {
|
||||
state.main++
|
||||
}
|
||||
SET_AIRPORTS (state, airports) {
|
||||
state.airports = airports;
|
||||
},
|
||||
RESET_AIRPORTS (state) {
|
||||
state.airports = [];
|
||||
},
|
||||
|
||||
}
|
||||
|
||||
const actions = {
|
||||
someAsyncTask ({ commit }) {
|
||||
// do something async
|
||||
commit('INCREMENT_MAIN_COUNTER')
|
||||
}
|
||||
}
|
||||
async deleteAirport(context, airport) {
|
||||
await idb.deleteAirport(airport);
|
||||
},
|
||||
async getAirports(context) {
|
||||
context.commit(RESET_AIRPORTS);
|
||||
let airports = await idb.getAirports();
|
||||
// let newAirports = [];
|
||||
// airports.forEach(c => {
|
||||
// newAirports.push(c);
|
||||
// });
|
||||
context.commit(SET_AIRPORTS, airports
|
||||
.filter(point => typeof point.geometry.coordinates !== "undefined" )
|
||||
.filter(point => point.properties.flights > 0 ));
|
||||
},
|
||||
async saveAirport(context, airport) {
|
||||
await idb.saveAirport(airport);
|
||||
}}
|
||||
|
||||
export default {
|
||||
state,
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
const state = {
|
||||
main: 0
|
||||
}
|
||||
|
||||
const mutations = {
|
||||
DECREMENT_MAIN_COUNTER (state) {
|
||||
state.main--
|
||||
},
|
||||
INCREMENT_MAIN_COUNTER (state) {
|
||||
state.main++
|
||||
}
|
||||
}
|
||||
|
||||
const actions = {
|
||||
someAsyncTask ({ commit }) {
|
||||
// do something async
|
||||
commit('INCREMENT_MAIN_COUNTER')
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
state,
|
||||
mutations,
|
||||
actions
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
const state = {
|
||||
type: 'airport',
|
||||
data: Object
|
||||
}
|
||||
|
||||
const SET_EDIT_AIRPORT = 'SET_EDIT_AIRPORT'
|
||||
|
||||
const mutations = {
|
||||
SET_EDIT_AIRPORT (state, airport) {
|
||||
state.data = airport
|
||||
state.type = 'airport'
|
||||
}
|
||||
}
|
||||
|
||||
const actions = {
|
||||
async setAirport (context, airport) {
|
||||
context.commit(SET_EDIT_AIRPORT, airport)
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
state,
|
||||
mutations,
|
||||
actions
|
||||
}
|
||||
@@ -1,17 +1,27 @@
|
||||
import createPersistedState from 'vuex-persistedstate'
|
||||
|
||||
const state = {
|
||||
settings: { flightgearDirectory: '.' }
|
||||
settings: { flightgearDirectory: '.' },
|
||||
zoom: 14,
|
||||
center: [47.413220, -1.219482]
|
||||
}
|
||||
|
||||
const mutations = {
|
||||
'DELETE_INDEXED_DB' () { },
|
||||
'SETTINGS_DIRECTORY' (state, flightgearDirectory) {
|
||||
'FLIGHTGEAR_DIRECTORY' (state, flightgearDirectory) {
|
||||
state.settings.flightgearDirectory = flightgearDirectory
|
||||
},
|
||||
'AIPORTS_DIRECTORY' (state, airportsDirectory) {
|
||||
state.settings.airportsDirectory = airportsDirectory
|
||||
},
|
||||
'ZOOM' (state, zoom) {
|
||||
state.zoom = zoom
|
||||
},
|
||||
'CENTER' (state, center) {
|
||||
state.center = center
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const plugins = [createPersistedState()]
|
||||
const plugins = []
|
||||
|
||||
const actions = {
|
||||
}
|
||||
|
||||
@@ -8,15 +8,6 @@ async function initDB() {
|
||||
if (features == null) {
|
||||
console.log("Loading DB");
|
||||
console.log(this.indexedDB);
|
||||
// var deleteRequest = indexedDB.deleteDatabase("flightgear");
|
||||
// deleteRequest.onerror = function (event) {
|
||||
// console.log(event);
|
||||
// reject(event);
|
||||
// };
|
||||
// deleteRequest.onsuccess = function (event) {
|
||||
// console.log(event);
|
||||
// };
|
||||
|
||||
var request = this.indexedDB.open("flightgear", 2);
|
||||
request.onerror = function (event) {
|
||||
reject(event);
|
||||
@@ -58,25 +49,6 @@ async function initDB() {
|
||||
}
|
||||
|
||||
};
|
||||
// db.loadDatabase({}, function (err) {
|
||||
// if (err) {
|
||||
// console.error("Error loading DB");
|
||||
// console.error(err);
|
||||
// db.addCollection('features', {
|
||||
// unique: ["properties.icao"], autoupdate: true
|
||||
// });
|
||||
// features = db.getCollection('features');
|
||||
// }
|
||||
// features = db.getCollection('features');
|
||||
// if( features == null ){
|
||||
// db.addCollection('features', {
|
||||
// unique: ["properties.icao"], autoupdate: true
|
||||
// });
|
||||
// features = db.getCollection('features');
|
||||
// }
|
||||
// console.log("Loaded " + features.count() + " features");
|
||||
// resolve(features);
|
||||
// });
|
||||
}
|
||||
else {
|
||||
resolve(features);
|
||||
|
||||
+119
-61
@@ -1,89 +1,147 @@
|
||||
/* eslint-disable */
|
||||
const lineReader = require('readline');
|
||||
|
||||
var icao;
|
||||
|
||||
var scanMethods = {
|
||||
1: (l, apts) => {
|
||||
console.log('Airport:', l);
|
||||
saveName(apts, l[4], l.slice(5).join(' ').replace('\t', ' '));
|
||||
},
|
||||
99: (l) => {
|
||||
console.log('Finished');
|
||||
}
|
||||
1: (l, apts) => {
|
||||
console.log('Airport:', l);
|
||||
icao = l[4];
|
||||
saveName(apts, l[4], l.slice(5).join(' ').replace('\t', ' '));
|
||||
},
|
||||
14: (l, apts) => {
|
||||
console.log('Viewport:', l);
|
||||
saveCoordinates(apts, icao, l[1], l[2]);
|
||||
},
|
||||
99: (l) => {
|
||||
console.log('Finished');
|
||||
}
|
||||
};
|
||||
|
||||
async function saveName(features, icao, name) {
|
||||
var promise = new Promise(function (resolve, reject) {
|
||||
var promise = new Promise(function (resolve, reject) {
|
||||
|
||||
var transaction = features.transaction("airports", "readwrite");
|
||||
var objectStore = transaction.objectStore("airports");
|
||||
var objectStoreRequest = objectStore.get(icao);
|
||||
|
||||
objectStoreRequest.onsuccess = function (event) {
|
||||
console.log(event);
|
||||
var feature = objectStoreRequest.result;
|
||||
if (!feature) {
|
||||
feature = {
|
||||
"type": "Feature",
|
||||
'properties': { 'icao': icao, 'twr': false, 'threshold': false, 'flights': 0, airlines: [] },
|
||||
'geometry': {
|
||||
"type": "Point"
|
||||
}
|
||||
};
|
||||
var transaction = features.transaction("airports", "readwrite");
|
||||
var objectStore = transaction.objectStore("airports");
|
||||
var objectStoreRequest = objectStore.get(icao);
|
||||
|
||||
objectStoreRequest.onsuccess = function (event) {
|
||||
console.log(event);
|
||||
var feature = objectStoreRequest.result;
|
||||
if (!feature) {
|
||||
feature = {
|
||||
"type": "Feature",
|
||||
'properties': { 'icao': icao, 'twr': false, 'threshold': false, 'flights': 0, airlines: [] },
|
||||
'geometry': {
|
||||
"type": "Point"
|
||||
}
|
||||
feature.properties.name = name;
|
||||
feature.properties.icao = icao;
|
||||
console.log("ICAO : " + feature.properties.icao);
|
||||
// Create another request that inserts the item back into the database
|
||||
var updateAirportRequest = objectStore.put(feature);
|
||||
|
||||
// Log the transaction that originated this request
|
||||
console.log("The transaction that originated this request is " + updateAirportRequest.updateAirportRequest);
|
||||
|
||||
// When this new request succeeds, run the displayData() function again to update the display
|
||||
updateAirportRequest.onsuccess = function () {
|
||||
console.log("Stored");
|
||||
resolve();
|
||||
};
|
||||
updateAirportRequest.onerror = function (event) {
|
||||
console.log("Error " + event);
|
||||
reject(event);
|
||||
};
|
||||
};
|
||||
objectStoreRequest.onerror = function (event) {
|
||||
console.log("Error " + event);
|
||||
reject(event);
|
||||
};
|
||||
});
|
||||
}
|
||||
feature.properties.name = name;
|
||||
feature.properties.icao = icao;
|
||||
console.log("ICAO : " + feature.properties.icao);
|
||||
// Create another request that inserts the item back into the database
|
||||
var updateAirportRequest = objectStore.put(feature);
|
||||
|
||||
return promise;
|
||||
// Log the transaction that originated this request
|
||||
console.log("The transaction that originated this request is " + updateAirportRequest.updateAirportRequest);
|
||||
|
||||
// When this new request succeeds, run the displayData() function again to update the display
|
||||
updateAirportRequest.onsuccess = function () {
|
||||
console.log("Stored");
|
||||
resolve();
|
||||
};
|
||||
updateAirportRequest.onerror = function (event) {
|
||||
console.log("Error " + event);
|
||||
reject(event);
|
||||
};
|
||||
};
|
||||
objectStoreRequest.onerror = function (event) {
|
||||
console.log("Error " + event);
|
||||
reject(event);
|
||||
};
|
||||
});
|
||||
return promise;
|
||||
}
|
||||
|
||||
function scanAPTIntoDB(f, apts) {
|
||||
console.log(f);
|
||||
lineReader.createInterface({
|
||||
async function saveCoordinates(features, icao, lat, lon) {
|
||||
var promise = new Promise(function (resolve, reject) {
|
||||
|
||||
var transaction = features.transaction("airports", "readwrite");
|
||||
var objectStore = transaction.objectStore("airports");
|
||||
var objectStoreRequest = objectStore.get(icao);
|
||||
|
||||
objectStoreRequest.onsuccess = function (event) {
|
||||
console.log(event);
|
||||
var feature = objectStoreRequest.result;
|
||||
if (!feature) {
|
||||
feature = {
|
||||
"type": "Feature",
|
||||
'properties': { 'icao': icao, 'twr': false, 'threshold': false, 'flights': 0, airlines: [] },
|
||||
'geometry': {
|
||||
"type": "Point"
|
||||
}
|
||||
};
|
||||
}
|
||||
feature.geometry.coordinates = [lon, lat];
|
||||
console.log("ICAO : " + feature.properties.icao);
|
||||
// Create another request that inserts the item back into the database
|
||||
var updateAirportRequest = objectStore.put(feature);
|
||||
|
||||
// Log the transaction that originated this request
|
||||
console.log("The transaction that originated this request is " + updateAirportRequest.updateAirportRequest);
|
||||
|
||||
// When this new request succeeds, run the displayData() function again to update the display
|
||||
updateAirportRequest.onsuccess = function () {
|
||||
console.log("Stored");
|
||||
resolve();
|
||||
};
|
||||
updateAirportRequest.onerror = function (event) {
|
||||
console.log("Error " + event);
|
||||
reject(event);
|
||||
};
|
||||
};
|
||||
objectStoreRequest.onerror = function (event) {
|
||||
console.log("Error " + event);
|
||||
reject(event);
|
||||
};
|
||||
});
|
||||
return promise;
|
||||
}
|
||||
|
||||
async function scanAPTIntoDB(f, features) {
|
||||
var promise = new Promise(function (resolve, reject) {
|
||||
try {
|
||||
lineReader.createInterface({
|
||||
input: fs.createReadStream(f)
|
||||
}).on('line', function (line) {
|
||||
}).on('line', function (line) {
|
||||
var fields = line.split(/[ ]+/);
|
||||
// var fields = line.match('([0-9]+)');
|
||||
if (fields == null)
|
||||
return;
|
||||
return;
|
||||
var scanMethod = scanMethods[fields[0]];
|
||||
if (scanMethod != null) {
|
||||
scanMethod(fields, apts);
|
||||
scanMethod(fields, features);
|
||||
}
|
||||
else {
|
||||
if (fields[0] == '99') {
|
||||
lineReader.close();
|
||||
}
|
||||
// console.log('Ignored:', line);
|
||||
if (fields[0] == '99') {
|
||||
lineReader.close();
|
||||
}
|
||||
// console.log('Ignored:', line);
|
||||
}
|
||||
}).on('error', function (err) {
|
||||
}).on('error', function (err) {
|
||||
console.log(err);
|
||||
lr.close();
|
||||
}).on('close', function () {
|
||||
}).on('close', function () {
|
||||
console.log("End");
|
||||
apts.close();
|
||||
});
|
||||
features.close();
|
||||
this.postMessage('DONE');
|
||||
});
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// export default { scan, name }
|
||||
|
||||
+132
-49
@@ -9,7 +9,7 @@
|
||||
// const apt = require('apt.js');
|
||||
|
||||
async function asyncForEach(array, callback) {
|
||||
console.log("Len " + array.length);
|
||||
console.log("AsyncForEach Len " + array.length);
|
||||
for (let index = 0; index < array.length; index++) {
|
||||
try {
|
||||
var res = await callback(array[index], index, array);
|
||||
@@ -32,6 +32,7 @@ async function waitFor(milliseconds) {
|
||||
return new Promise(resolve => setTimeout(resolve, milliseconds));
|
||||
}
|
||||
|
||||
|
||||
async function scanGroundnetFiles(p, features) {
|
||||
var promise = new Promise(function (resolve, reject) {
|
||||
try {
|
||||
@@ -68,6 +69,50 @@ async function scanGroundnetFiles(p, features) {
|
||||
});
|
||||
}
|
||||
|
||||
async function scanTrafficFiles(p, features) {
|
||||
var promise = new Promise(function (resolve, reject) {
|
||||
try {
|
||||
console.log('Start Groundnets ' + p);
|
||||
var files = traverseDir(p);
|
||||
console.log(files);
|
||||
|
||||
asyncForEach(files, async f => {
|
||||
//await waitFor(5000);
|
||||
try {
|
||||
var text = await readAI(f, features);
|
||||
console.log(text);
|
||||
resolve(text);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
reject(error);
|
||||
}
|
||||
}).then(t => {
|
||||
console.log("Finished");
|
||||
features.close();
|
||||
resolve();
|
||||
this.postMessage('DONE');
|
||||
}).catch(reason => {
|
||||
console.log("Crashed");
|
||||
console.log(reason);
|
||||
features.close()
|
||||
this.postMessage('DONE');
|
||||
});
|
||||
|
||||
//walkDir(p, f => { readGroundnet(f, features) });
|
||||
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {*} p
|
||||
* @param {*} features
|
||||
*/
|
||||
|
||||
function scanTrafficIntoDB(p, features) {
|
||||
try {
|
||||
console.log('Start Traffic ' + p + ' ' + features);
|
||||
@@ -85,9 +130,11 @@ function scanTrafficIntoDB(p, features) {
|
||||
console.log("No more entries!");
|
||||
}
|
||||
};
|
||||
|
||||
walkDir(p, f => { readAI(f, features) });
|
||||
console.log("Closing");
|
||||
features.close();
|
||||
this.postMessage('DONE');
|
||||
console.log("End Traffic");
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
@@ -123,56 +170,88 @@ function walkDir(dir, callback) {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {*} f
|
||||
* @param {*} apts
|
||||
*/
|
||||
|
||||
function readAI(f, apts) {
|
||||
try {
|
||||
console.log(path.basename(f));
|
||||
// Reset
|
||||
var airline = path.basename(f).match('([^.]+)');
|
||||
if (airline == null)
|
||||
return;
|
||||
var xmlSource = fs.readFileSync(f, 'utf8').toString();
|
||||
console.debug("read " + path.basename(f));
|
||||
// var doc = new domParser().parseFromString(xmlSource );
|
||||
// console.log("parsed ");
|
||||
// var flights = xpath.select("/trafficlist/flight", doc);
|
||||
// console.log("selected flight ");
|
||||
// console.log(flights);
|
||||
var dat = tXml(xmlSource);
|
||||
// console.log(dat);
|
||||
console.log(dat[0].children[0]);
|
||||
var promise = new Promise(function (resolve, reject) {
|
||||
try {
|
||||
console.log(path.basename(f));
|
||||
// Reset
|
||||
var airline = path.basename(f).match('([^.]+)\.xml');
|
||||
if (airline == null){
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
var xmlSource = fs.readFileSync(f, 'utf8').toString();
|
||||
console.debug("read airline " + path.basename(f));
|
||||
// var doc = new domParser().parseFromString(xmlSource );
|
||||
// console.log("parsed ");
|
||||
// var flights = xpath.select("/trafficlist/flight", doc);
|
||||
// console.log("selected flight ");
|
||||
// console.log(flights);
|
||||
var dat = tXml(xmlSource);
|
||||
// console.log(dat);
|
||||
if( !dat || !dat[0] || !dat[0].children || !dat[0].children[0] ) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
var flightNodes = dat[0].children[0].children.filter(e => e.tagName === 'flight');
|
||||
flightNodes = tXml.simplify(flightNodes);
|
||||
console.log(dat[0].children[0]);
|
||||
|
||||
console.log(flightNodes.flight);
|
||||
var flightNodes = dat[0].children[0].children.filter(e => e.tagName === 'flight');
|
||||
flightNodes = tXml.simplify(flightNodes);
|
||||
if (!flightNodes || !flightNodes.flight) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("Departure flights " + flightNodes.flight.length);
|
||||
console.log(flightNodes.flight);
|
||||
|
||||
var merged = new Array();
|
||||
console.log("Departure flights " + flightNodes.flight.length);
|
||||
|
||||
flightNodes.flight.map(n => {
|
||||
merged.push(n.departure.port);
|
||||
merged.push(n.arrival.port);
|
||||
}).sort();
|
||||
var merged = new Array();
|
||||
|
||||
var counts = {};
|
||||
for (var i = 0; i < merged.length; i++) {
|
||||
counts[merged[i]] = 1 + (counts[merged[i]] || 0);
|
||||
flightNodes.flight.map(n => {
|
||||
merged.push(n.departure.port);
|
||||
merged.push(n.arrival.port);
|
||||
}).sort();
|
||||
|
||||
var counts = {};
|
||||
for (var i = 0; i < merged.length; i++) {
|
||||
counts[merged[i]] = 1 + (counts[merged[i]] || 0);
|
||||
}
|
||||
|
||||
asyncForEach(Object.keys(counts), async key => {
|
||||
console.log(key);
|
||||
await store(key, airline[0], counts[key]);
|
||||
}).then(t => {
|
||||
console.log("Finished");
|
||||
resolve();
|
||||
}).catch(reason => {
|
||||
console.log("Crashed");
|
||||
console.log(reason);
|
||||
features.close()
|
||||
});
|
||||
//for (var key in counts) {
|
||||
// store(key, airline[0], counts[key]);
|
||||
//}
|
||||
|
||||
// var flights = xpath.select("/trafficlist/flight/departure/port/text()", doc);
|
||||
// console.log(nodes);
|
||||
// console.log(nodes);
|
||||
// nodes = xpath.select("/trafficlist/flight/arrival/port/text()", doc);
|
||||
// console.log(nodes);
|
||||
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
reject(error);
|
||||
}
|
||||
|
||||
for (var key in counts) {
|
||||
store(key, airline[0], counts[key]);
|
||||
}
|
||||
|
||||
// var flights = xpath.select("/trafficlist/flight/departure/port/text()", doc);
|
||||
// console.log(nodes);
|
||||
// console.log(nodes);
|
||||
// nodes = xpath.select("/trafficlist/flight/arrival/port/text()", doc);
|
||||
// console.log(nodes);
|
||||
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
});
|
||||
return promise;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -184,7 +263,7 @@ function readAI(f, apts) {
|
||||
|
||||
function store(icao, airline, value) {
|
||||
var promise = new Promise(function (resolve, reject) {
|
||||
console.log("Airport " + icao + " has " + value + " flights");
|
||||
console.log("Airport " + icao + " has " + value + " new flights");
|
||||
// Make a request to get a record by key from the object store
|
||||
var transaction = features.transaction("airports", "readwrite");
|
||||
var objectStore = transaction.objectStore("airports");
|
||||
@@ -313,10 +392,15 @@ async function readGroundnet(f, features) {
|
||||
}
|
||||
} else if (filename[2] == 'groundnet') {
|
||||
console.log('groundnet : ' + filename[1]);
|
||||
var nodes = dat['?xml'].groundnet.TaxiNodes;
|
||||
feature['properties']['groundnet'] = nodes ? true : false;
|
||||
var nodes = dat['?xml'].groundnet.Parking;
|
||||
feature['properties']['parking'] = nodes ? true : false;
|
||||
if (dat['?xml'].groundnet) {
|
||||
var nodes = dat['?xml'].groundnet.TaxiNodes;
|
||||
if (nodes && nodes.node) {
|
||||
console.log(nodes);
|
||||
}
|
||||
feature['properties']['groundnet'] = nodes && nodes.node ? nodes.node.length : 0;
|
||||
var nodes = dat['?xml'].groundnet.parkingList;
|
||||
feature['properties']['parking'] = nodes && nodes.Parking ? nodes.Parking.length : 0;
|
||||
}
|
||||
} else if (filename[2] == 'ils') {
|
||||
console.log('ils : ' + filename[1]);
|
||||
if (dat['?xml'].PropertyList.runways) {
|
||||
@@ -380,7 +464,6 @@ function createFeature(icao) {
|
||||
}
|
||||
|
||||
function mean(coord1, coord2) {
|
||||
|
||||
return (coord1 + coord2) / 2;
|
||||
}
|
||||
// export default { scanAPT, scanTraffic, scanGroundnet }
|
||||
|
||||
@@ -18,8 +18,8 @@ function errorReceiver(event) {
|
||||
onmessage = function (event) {
|
||||
postMessage('scanStarted');
|
||||
console.log(event.data);
|
||||
if (event.data === 'scan') {
|
||||
scanGroundnet().then(result => {
|
||||
if (event.data[0] === 'scan') {
|
||||
scanGroundnet(event.data[1]).then(result => {
|
||||
console.log("DONE Scanning");
|
||||
postMessage('DONE', 'this');
|
||||
// event.origin.webContents.send('scanFinished');
|
||||
@@ -28,8 +28,8 @@ onmessage = function (event) {
|
||||
console.log('Crashed');
|
||||
console.log(result);
|
||||
});
|
||||
} else if (event.data === 'scanai') {
|
||||
scanai().then(result => {
|
||||
} else if (event.data[0] === 'scanai') {
|
||||
scanai(event.data[1]).then(result => {
|
||||
console.log("DONE Scanning");
|
||||
postMessage('DONE');
|
||||
// event.origin.webContents.send('scanFinished');
|
||||
@@ -39,8 +39,8 @@ onmessage = function (event) {
|
||||
console.log(result);
|
||||
});
|
||||
}
|
||||
else if (event.data === 'scanapt') {
|
||||
scanAPT().then(result => {
|
||||
else if (event.data[0] === 'scanapt') {
|
||||
scanAPT(event.data[1]).then(result => {
|
||||
console.log("DONE Scanning");
|
||||
postMessage('DONE');
|
||||
// event.origin.webContents.send('scanFinished');
|
||||
@@ -53,28 +53,34 @@ onmessage = function (event) {
|
||||
}
|
||||
};
|
||||
|
||||
async function scanGroundnet() {
|
||||
async function scanGroundnet(fdir) {
|
||||
var promise = new Promise(function (resolve, reject) {
|
||||
return initDB().then(features => {
|
||||
var d = path.join(homedir, '/Documents/Flightgear/main/Airports/A');
|
||||
var d = path.join(fdir);
|
||||
scanGroundnetFiles(d, features);
|
||||
});
|
||||
});
|
||||
return promise;
|
||||
}
|
||||
|
||||
function scanai() {
|
||||
return initDB().then(features => {
|
||||
scanTrafficIntoDB("C:/GIT/fgmeta/fgdata/AI/Traffic", features);
|
||||
async function scanai(fdir) {
|
||||
var promise = new Promise(function (resolve, reject) {
|
||||
return initDB().then(features => {
|
||||
var d = path.join(fdir);
|
||||
scanTrafficFiles(d, features);
|
||||
});
|
||||
});
|
||||
return promise;
|
||||
}
|
||||
|
||||
async function scanAPT() {
|
||||
return initDB().then(features => {
|
||||
var d = path.join(homedir, 'Documents/apt.dat');
|
||||
scanAPTIntoDB(d, features);
|
||||
console.log("Closed DB");
|
||||
var promise = new Promise(function (resolve, reject) {
|
||||
return initDB().then(features => {
|
||||
var d = path.join(homedir, 'Documents/apt.dat');
|
||||
scanAPTIntoDB(d, features);
|
||||
});
|
||||
});
|
||||
return promise;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user