├── server ├── README.md ├── app │ ├── forms.pyc │ ├── views.pyc │ ├── __init__.pyc │ ├── models.pyc │ ├── __pycache__ │ │ ├── forms.cpython-35.pyc │ │ ├── views.cpython-35.pyc │ │ ├── models.cpython-35.pyc │ │ ├── __init__.cpython-35.pyc │ │ └── __init__.cpython-36.pyc │ ├── __init__.py │ ├── forms.py │ ├── templates │ │ ├── index.html │ │ ├── base.html │ │ └── login.html │ ├── views.py │ └── models.py ├── __pycache__ │ ├── config.cpython-35.pyc │ └── model.cpython-35.pyc ├── db_upgrade.py ├── db_downgrade.py ├── db_create.py ├── config.py ├── db_migrate.py ├── mapping.py ├── delete_repetition.py ├── construct_ipin.py ├── mapping.csv └── main_build_DB.py ├── img ├── 4Dir.png ├── 4Y_1.png ├── 4Y_2.png ├── 4Y_3.png ├── 4Y_4.png ├── ori.PNG ├── tra.png ├── floor_4.png ├── floor_5.png ├── axisdevice.png ├── diff_batch_size.png ├── diff_time_steps.png ├── error_LSTM_all.png ├── Location_Of_Data.jpg ├── diff_hidden_nodes.png └── model_ts=30_hn=128_bs=5_ep=100.png ├── Dataset └── TimeStamp │ ├── TimeStamp_4th_floor_MIX2.xlsx │ ├── TimeStamp_Ori_4th_floor.xlsx │ ├── TimeStamp_4th_floor_HuaWei.xlsx │ └── TimeStamp_5th_floor_HuaWei.xlsx ├── Data_Processing ├── README.md ├── Analysis_evaluation_data.py ├── BoxPlot_error.py ├── calculate_loc_final.py └── acc_loss_plot.py ├── .gitignore ├── LICENSE ├── random_waypoint_model └── README.md ├── 2D_Interpolation └── Interpolation.py ├── README.md ├── algorithm ├── LSTM_trajectory_estimation.py └── waypoint_trace.csv ├── floor4_new_data.csv └── floor5_new_data.csv /server/README.md: -------------------------------------------------------------------------------- 1 | Just run 'main_build_DB.py' for server part. 2 | 3 | -------------------------------------------------------------------------------- /img/4Dir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/4Dir.png -------------------------------------------------------------------------------- /img/4Y_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/4Y_1.png -------------------------------------------------------------------------------- /img/4Y_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/4Y_2.png -------------------------------------------------------------------------------- /img/4Y_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/4Y_3.png -------------------------------------------------------------------------------- /img/4Y_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/4Y_4.png -------------------------------------------------------------------------------- /img/ori.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/ori.PNG -------------------------------------------------------------------------------- /img/tra.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/tra.png -------------------------------------------------------------------------------- /img/floor_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/floor_4.png -------------------------------------------------------------------------------- /img/floor_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/floor_5.png -------------------------------------------------------------------------------- /img/axisdevice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/axisdevice.png -------------------------------------------------------------------------------- /server/app/forms.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/server/app/forms.pyc -------------------------------------------------------------------------------- /server/app/views.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/server/app/views.pyc -------------------------------------------------------------------------------- /img/diff_batch_size.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/diff_batch_size.png -------------------------------------------------------------------------------- /img/diff_time_steps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/diff_time_steps.png -------------------------------------------------------------------------------- /img/error_LSTM_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/error_LSTM_all.png -------------------------------------------------------------------------------- /server/app/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/server/app/__init__.pyc -------------------------------------------------------------------------------- /server/app/models.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/server/app/models.pyc -------------------------------------------------------------------------------- /img/Location_Of_Data.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/Location_Of_Data.jpg -------------------------------------------------------------------------------- /img/diff_hidden_nodes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/diff_hidden_nodes.png -------------------------------------------------------------------------------- /img/model_ts=30_hn=128_bs=5_ep=100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/img/model_ts=30_hn=128_bs=5_ep=100.png -------------------------------------------------------------------------------- /server/__pycache__/config.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/server/__pycache__/config.cpython-35.pyc -------------------------------------------------------------------------------- /server/__pycache__/model.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/server/__pycache__/model.cpython-35.pyc -------------------------------------------------------------------------------- /server/app/__pycache__/forms.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/server/app/__pycache__/forms.cpython-35.pyc -------------------------------------------------------------------------------- /server/app/__pycache__/views.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/server/app/__pycache__/views.cpython-35.pyc -------------------------------------------------------------------------------- /server/app/__pycache__/models.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/server/app/__pycache__/models.cpython-35.pyc -------------------------------------------------------------------------------- /Dataset/TimeStamp/TimeStamp_4th_floor_MIX2.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/Dataset/TimeStamp/TimeStamp_4th_floor_MIX2.xlsx -------------------------------------------------------------------------------- /Dataset/TimeStamp/TimeStamp_Ori_4th_floor.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/Dataset/TimeStamp/TimeStamp_Ori_4th_floor.xlsx -------------------------------------------------------------------------------- /server/app/__pycache__/__init__.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/server/app/__pycache__/__init__.cpython-35.pyc -------------------------------------------------------------------------------- /server/app/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/server/app/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /Dataset/TimeStamp/TimeStamp_4th_floor_HuaWei.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/Dataset/TimeStamp/TimeStamp_4th_floor_HuaWei.xlsx -------------------------------------------------------------------------------- /Dataset/TimeStamp/TimeStamp_5th_floor_HuaWei.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Carloslee96/Indoor-Localization/HEAD/Dataset/TimeStamp/TimeStamp_5th_floor_HuaWei.xlsx -------------------------------------------------------------------------------- /Data_Processing/README.md: -------------------------------------------------------------------------------- 1 | # Order of usage 2 | 3 | 1. calculate_loc_final.py 4 | 2. Analysis_evaluation_data.py 5 | 3. acc_loss_plot.py 6 | 4. BoxPlot_error.py 7 | 8 | -------------------------------------------------------------------------------- /server/app/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask_sqlalchemy import SQLAlchemy 3 | 4 | app = Flask(__name__) 5 | app.config.from_object('config') 6 | db = SQLAlchemy(app) 7 | 8 | from app import views, models -------------------------------------------------------------------------------- /server/app/forms.py: -------------------------------------------------------------------------------- 1 | from flask_wtf import Form 2 | from wtforms import StringField, BooleanField 3 | from wtforms.validators import DataRequired 4 | 5 | class LoginForm(Form): 6 | openid = StringField('openid', validators=[DataRequired()]) 7 | remember_me = BooleanField('remember_me', default=False) -------------------------------------------------------------------------------- /server/app/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | {% extends "base.html" %} 3 | 4 | {% block content %} 5 |

Hi, {{ user.nickname }}!

6 | {% for post in posts %} 7 |

8 | {{ post.author.nickname }} says: {{ post.body }} 9 |

10 | {% endfor %} 11 | {% endblock %} 12 | -------------------------------------------------------------------------------- /server/db_upgrade.py: -------------------------------------------------------------------------------- 1 | #!flask/bin/python 2 | from migrate.versioning import api 3 | from config import SQLALCHEMY_DATABASE_URI 4 | from config import SQLALCHEMY_MIGRATE_REPO 5 | api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 6 | v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 7 | print('Current database version: ' + str(v)) -------------------------------------------------------------------------------- /server/db_downgrade.py: -------------------------------------------------------------------------------- 1 | #!flask/bin/python 2 | from migrate.versioning import api 3 | from config import SQLALCHEMY_DATABASE_URI 4 | from config import SQLALCHEMY_MIGRATE_REPO 5 | v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 6 | api.downgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, v - 1) 7 | v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 8 | print('Current database version: ' + str(v)) -------------------------------------------------------------------------------- /server/db_create.py: -------------------------------------------------------------------------------- 1 | #!flask/bin/python 2 | from migrate.versioning import api 3 | from config import SQLALCHEMY_DATABASE_URI 4 | from config import SQLALCHEMY_MIGRATE_REPO 5 | from app import db 6 | import os.path 7 | db.create_all() 8 | if not os.path.exists(SQLALCHEMY_MIGRATE_REPO): 9 | api.create(SQLALCHEMY_MIGRATE_REPO, 'database repository') 10 | api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 11 | else: 12 | api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, api.version(SQLALCHEMY_MIGRATE_REPO)) 13 | -------------------------------------------------------------------------------- /server/app/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% if title %} 4 | {{ title }} - microblog 5 | {% else %} 6 | microblog 7 | {% endif %} 8 | 9 | 10 |
Microblog: Home
11 |
12 | {% with messages = get_flashed_messages() %} 13 | {% if messages %} 14 | 19 | {% endif %} 20 | {% endwith %} 21 | {% block content %}{% endblock %} 22 | 23 | 24 | -------------------------------------------------------------------------------- /server/config.py: -------------------------------------------------------------------------------- 1 | import os 2 | WTF_CSRF_ENABLED = True 3 | SECRET_KEY = 'you-will-never-guess' 4 | 5 | basedir = os.path.abspath(os.path.dirname(__file__)) 6 | 7 | SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db') 8 | SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository') 9 | 10 | '''OPENID_PROVIDERS = [ 11 | {'name': 'Google', 'url': 'https://www.google.com/accounts/o8/id'}, 12 | {'name': 'Yahoo', 'url': 'https://me.yahoo.com'}, 13 | {'name': 'AOL', 'url': 'http://openid.aol.com/'}, 14 | {'name': 'Flickr', 'url': 'http://www.flickr.com/'}, 15 | {'name': 'MyOpenID', 'url': 'https://www.myopenid.com'}]''' 16 | 17 | -------------------------------------------------------------------------------- /server/db_migrate.py: -------------------------------------------------------------------------------- 1 | #!flask/bin/python 2 | import imp 3 | from migrate.versioning import api 4 | from app import db 5 | from config import SQLALCHEMY_DATABASE_URI 6 | from config import SQLALCHEMY_MIGRATE_REPO 7 | 8 | v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 9 | migration = SQLALCHEMY_MIGRATE_REPO + ('/versions/%03d_migration.py' % (v+1)) 10 | tmp_module = imp.new_module('old_model') 11 | old_model = api.create_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 12 | exec(old_model, tmp_module.__dict__) 13 | script = api.make_update_script_for_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, tmp_module.meta, db.metadata) 14 | open(migration, "wt").write(script) 15 | api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 16 | v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 17 | print('New migration saved as ' + migration) 18 | print('Current database version: ' + str(v)) -------------------------------------------------------------------------------- /server/mapping.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | from app import db, models 4 | import csv 5 | 6 | length = 200 7 | 8 | PYTHONIOENCODING="UTF-8" #set the utf-8 encode mode 9 | 10 | def rawList(): 11 | with open('mapping.csv', 'r', newline='') as csvfile: 12 | #APsList = models.User.query.all() 13 | reader = csv.reader(csvfile) 14 | APs = [row[0] for row in reader] 15 | 16 | APlength = len(APs) 17 | 18 | lists = [[0 for col in range(3)] for row in range(APlength)] 19 | 20 | row = 0 21 | for AP in APs: 22 | #dict_APs.update({AP:i}) 23 | lists[row][0] = AP 24 | lists[row][1] = '-110' 25 | lists[row][2] = 'ee' 26 | row += 1 27 | 28 | return lists 29 | 30 | def checkAP(list, AP): 31 | row = 0 32 | 33 | for row in range(0,length): 34 | if AP == list[row][0]: 35 | return row 36 | return 'none' 37 | 38 | 39 | list = rawList() 40 | print(list) 41 | print(checkAP(list, '4c:fa:ca:1f:41:40')) 42 | #print(list) -------------------------------------------------------------------------------- /Data_Processing/Analysis_evaluation_data.py: -------------------------------------------------------------------------------- 1 | ''' 2 | By Zhenghang(Klaus) Zhong 3 | 4 | To get the difference of every estimated point and real point 5 | ''' 6 | 7 | import csv 8 | import os 9 | import numpy as np 10 | import pandas as pd 11 | import math 12 | 13 | with open('all_steps.csv', 'r', newline='') as csvfile: 14 | reader = csv.reader(csvfile) 15 | dataset_evaluate = np.array([row[1:] for row in reader]) 16 | 17 | with open('test_raw_loc.csv', 'r', newline='') as csvfile: 18 | reader = csv.reader(csvfile) 19 | dataset_raw = np.array([row[1:] for row in reader]) 20 | 21 | dis_diff = [] 22 | for i in range(len(dataset_raw)): 23 | x_pow_diff = math.pow(dataset_evaluate[i][0].astype('float')-dataset_raw[i][0].astype('float'),2) 24 | y_pow_diff = math.pow(dataset_evaluate[i][1].astype('float')-dataset_raw[i][1].astype('float'),2) 25 | dis_diff.append(math.sqrt(x_pow_diff+y_pow_diff)) 26 | 27 | print(dis_diff) 28 | dis_diff = pd.DataFrame(dis_diff) 29 | dis_diff.to_csv('dis_diff.csv', mode='a', header=False) -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | # Android Studio captures folder 33 | captures/ 34 | 35 | # Intellij 36 | *.iml 37 | .idea/workspace.xml 38 | .idea/tasks.xml 39 | .idea/gradle.xml 40 | .idea/dictionaries 41 | .idea/libraries 42 | 43 | # Keystore files 44 | *.jks 45 | 46 | # External native build folder generated in Android Studio 2.2 and later 47 | .externalNativeBuild 48 | 49 | # Google Services (e.g. APIs or Firebase) 50 | google-services.json 51 | 52 | # Freeline 53 | freeline.py 54 | freeline/ 55 | freeline_project_description.json 56 | *.DESKTOP-0Q5UDGQ 57 | *.DESKTOP-0Q5UDGQ 58 | *.DESKTOP-0Q5UDGQ 59 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Zhong Zhenghang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /server/app/views.py: -------------------------------------------------------------------------------- 1 | from flask import render_template, flash, redirect 2 | from app import app 3 | from .forms import LoginForm 4 | 5 | 6 | @app.route('/') 7 | @app.route('/index') 8 | def index(): 9 | user = {'nickname': 'Miguel'} 10 | posts = [ 11 | { 12 | 'author': {'nickname': 'John'}, 13 | 'body': 'Beautiful day in Portland!' 14 | }, 15 | { 16 | 'author': {'nickname': 'Susan'}, 17 | 'body': 'The Avengers movie was so cool!' 18 | } 19 | ] 20 | return render_template('index.html', 21 | title='Home', 22 | user=user, 23 | posts=posts) 24 | 25 | 26 | @app.route('/login', methods=['GET', 'POST']) 27 | def login(): 28 | form = LoginForm() 29 | if form.validate_on_submit(): 30 | flash('Login requested for OpenID="%s", remember_me=%s' % 31 | (form.openid.data, str(form.remember_me.data))) 32 | return redirect('/index') 33 | return render_template('login.html', 34 | title='Sign In', 35 | form=form, 36 | providers=app.config['OPENID_PROVIDERS']) 37 | -------------------------------------------------------------------------------- /server/app/templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | {% extends "base.html" %} 3 | 4 | {% block content %} 5 | 18 |

Sign In

19 |
20 | {{ form.hidden_tag() }} 21 |

22 | Please enter your OpenID, or select one of the providers below:
23 | {{ form.openid(size=80) }} 24 | {% for error in form.openid.errors %} 25 | [{{ error }}] 26 | {% endfor %}
27 | |{% for pr in providers %} 28 | {{ pr.name }} | 29 | {% endfor %} 30 |

31 |

{{ form.remember_me }} Remember Me

32 |

33 |
34 | {% endblock %} 35 | -------------------------------------------------------------------------------- /Data_Processing/BoxPlot_error.py: -------------------------------------------------------------------------------- 1 | #By Zhenghang(Klaus) Zhong 2 | 3 | #Box Plot of error distribution 4 | 5 | from pandas import DataFrame 6 | from pandas import read_csv 7 | import pandas as pd 8 | import numpy as np 9 | from matplotlib import pyplot 10 | # load results into a dataframe 11 | filenames_128 = ['dis_diff_128.csv'] 12 | filenames_256 = ['dis_diff_256.csv'] 13 | filenames_512 = ['dis_diff_512.csv'] 14 | results = DataFrame() 15 | 16 | for name in filenames_128: 17 | results_128 = read_csv(name, header=0,usecols = [1]) 18 | # describe all results, as 1 unit = 10cm, we want to transfer to meters, /10 19 | results_128 = results_128.div(10, axis = 0) 20 | 21 | for name in filenames_256: 22 | results_256 = read_csv(name, header=0,usecols = [1]) 23 | # describe all results 24 | results_256 = results_256.div(10, axis = 0) 25 | 26 | for name in filenames_512: 27 | results_512 = read_csv(name, header=0,usecols = [1]) 28 | # describe all results 29 | results_512 = results_512.div(10, axis = 0) 30 | 31 | print(results_128.describe()) 32 | print(results_256.describe()) 33 | print(results_512.describe()) 34 | 35 | # box and whisker plot 36 | df = pd.DataFrame(np.concatenate((results_128,results_512),axis = 1), 37 | columns=['128', '512']) 38 | 39 | df.boxplot(sym='k',showmeans = True,showfliers = False,return_type='dict') 40 | #results_256.boxplot(sym='k',showmeans = True,whis = [0,8],showfliers = False,return_type='dict') 41 | 42 | pyplot.xlabel('Hidden node') 43 | pyplot.ylabel('Error (m)') 44 | pyplot.show() -------------------------------------------------------------------------------- /server/app/models.py: -------------------------------------------------------------------------------- 1 | from app import db 2 | 3 | class User(db.Model): 4 | id = db.Column(db.Integer, primary_key=True) 5 | Building = db.Column(db.String(10), index=True, unique=False) 6 | Room = db.Column(db.String(10), index=True, unique=False) 7 | Location_x = db.Column(db.String(20), index=True, unique=False) 8 | Location_y = db.Column(db.String(20), index=True, unique=False) 9 | SSID = db.Column(db.String(20), index=True, unique=False) 10 | BSSID = db.Column(db.String(20), index=True, unique=False) 11 | Frequency = db.Column(db.String(10), index=True, unique=False) 12 | Level = db.Column(db.String(10), index=True, unique=False) 13 | Model = db.Column(db.String(10), index=True, unique=False) 14 | Time = db.Column(db.String(10), index=True, unique=False) 15 | def __repr__(self): 16 | return '' % (self.id) 17 | 18 | 19 | 20 | 21 | '''class User(db.Model): 22 | id = db.Column(db.Integer, primary_key=True) 23 | nickname = db.Column(db.String(64), index=True, unique=True) 24 | email = db.Column(db.String(120), index=True, unique=True) 25 | posts = db.relationship('Post', backref='author', lazy='dynamic') 26 | 27 | def __repr__(self): 28 | return '' % (self.nickname) 29 | 30 | class Post(db.Model): 31 | id = db.Column(db.Integer, primary_key = True) 32 | body = db.Column(db.String(140)) 33 | timestamp = db.Column(db.DateTime) 34 | user_id = db.Column(db.Integer, db.ForeignKey('user.id')) 35 | 36 | def __repr__(self): 37 | return '' % (self.body) 38 | 39 | nickname = db.Column(db.String(64), index=True, unique=True) 40 | email = db.Column(db.String(120), index=True, unique=True)''' -------------------------------------------------------------------------------- /Data_Processing/calculate_loc_final.py: -------------------------------------------------------------------------------- 1 | ''' 2 | By Zhenghang(Klaus) Zhong 3 | 4 | With data structure of samples X time_steps X features, and the time steps are 5 | created by sliding Window, which means there are a lot of repeating data in input 6 | as well as output, the data sample is like (if with one feature): 7 | 8 | [1 2 3 4 5 6 9 | 2 3 4 5 6 7 10 | 3 4 5 6 7 8 11 | 4 5 6 7 8 9] 12 | 13 | The output is similar, to get a better location coordination, we get location info 14 | of one point based on the mean of all its estimated state, that is its final location. 15 | 16 | For above example, we have input of 9 points' info. 17 | 18 | ''' 19 | 20 | import csv 21 | import os 22 | import numpy as np 23 | import pandas as pd 24 | 25 | #Adjust according to parameter setting 26 | time_step = 30 27 | 28 | def mean_of_line(dataset, item, all_steps): 29 | #the points number that is smaller than length of dataset 30 | if item < len(dataset): 31 | # 20 is decided by the time steps 32 | if item >= time_step: 33 | number = time_step 34 | else: 35 | number = item + 1 36 | 37 | row = len(dataset) 38 | length = len(dataset[0]) 39 | total = 0 40 | j = 0 41 | 42 | for i in range(number): 43 | total += dataset[item][j].astype('float') 44 | item -= 1 45 | j +=1 46 | mean = total / number 47 | all_steps.append(mean) 48 | if(item == 0): 49 | print('0:',mean) 50 | #Last several points (whos number equal to (time_step -1)) 51 | else: 52 | row_start = len(dataset)-1 53 | total = 0 54 | j = item - len(dataset)+1 55 | #print('lengh:',time_step - (item - len(dataset)+1)) 56 | for i in range(time_step - (item - len(dataset)+1)): 57 | total += dataset[row_start][j].astype('float') 58 | row_start -= 1 59 | j += 1 60 | mean = total / (time_step - (item - len(dataset)+1)) 61 | all_steps.append(mean) 62 | 63 | # read the raw output data 64 | with open('yhat_loc_x.csv', 'r', newline='') as csvfile: 65 | reader = csv.reader(csvfile) 66 | dataset_x = np.array([row[1:] for row in reader]) 67 | print(dataset_x) 68 | with open('yhat_loc_y.csv', 'r', newline='') as csvfile: 69 | reader = csv.reader(csvfile) 70 | dataset_y = np.array([row[1:] for row in reader]) 71 | 72 | #get the final estimated location of all points with x and y coordinates 73 | all_steps_x = [] 74 | for x in range(len(dataset_x)+(time_step-1)): 75 | mean_of_line(dataset_x,x,all_steps_x) 76 | all_steps_x = pd.DataFrame(all_steps_x) 77 | all_steps_x.to_csv('all_steps_x.csv', mode='w', header=['Loc_x']) 78 | 79 | all_steps_y = [] 80 | for y in range(len(dataset_y)+(time_step-1)): 81 | mean_of_line(dataset_y,y,all_steps_y) 82 | #print(all_steps_y) 83 | all_steps_y = pd.DataFrame(all_steps_y) 84 | all_steps_y.to_csv('all_steps_y.csv', mode='w', header=['Loc_y']) 85 | 86 | all_steps_x= pd.read_csv(filepath_or_buffer = 'all_steps_x.csv', sep = ',',usecols = [1]) 87 | all_steps_y= pd.read_csv(filepath_or_buffer = 'all_steps_y.csv', sep = ',',usecols = [1]) 88 | 89 | all_steps = pd.concat([all_steps_x,all_steps_y],axis = 1) 90 | all_steps.to_csv('all_steps.csv', mode='w', header=['Loc_x','Loc_y']) 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /random_waypoint_model/README.md: -------------------------------------------------------------------------------- 1 | Description 2 | ----------- 3 | This is a python library for simulation of mobility and contact models. 4 | 5 | The following mobility models that simulate node movements are available: 6 | 7 | - Random Walk 8 | - Random Waypoint 9 | - Random Direction 10 | - Truncated Levy Walk [[1]](#references) 11 | - Gauss-Markov [[2]](#references) 12 | - Reference Point Group Mobility model [[3]](#references) 13 | - Time-variant Community [[4]](#references) 14 | 15 | In addition to models that simulate node position in time, this library also provides some models 16 | that simulate node contacts: 17 | - Dynamic G(n,p), a dynamic version of the Erdős–Rényi model [[5]](#references) 18 | - Dynamic G(n,m), another dynamic version of the Erdős–Rényi model [[5]](#references) 19 | - The edge-Markovian dynamic graph model [[6]](#references) 20 | - The continuous-time edge-Markovian dynamic graph model [[7]](#references) 21 | - The Model B, as described in [[8]](#references) 22 | 23 | Installation 24 | ------------ 25 | 26 | setuptools - from Git repository 27 | 28 | ```bash 29 | > git clone git://github.com/panisson/pymobility.git 30 | > cd pymobility 31 | > python setup.py install (run as admin/root) 32 | ``` 33 | 34 | Dependencies 35 | ------------ 36 | NumPy and Matplotlib 37 | 38 | Examples 39 | -------- 40 | ### Mobility Models 41 | In a python shell, you can instantiate the mobility models available 42 | in the pymobility.models.mobility package. 43 | For example, to create a Random Waypoint model instace, use the following commands: 44 | ```python 45 | >>> from pymobility.models.mobility import random_waypoint 46 | >>> rw = random_waypoint(200, dimensions=(100, 100), velocity=(0.1, 1.0), wt_max=1.0) 47 | ``` 48 | This will create a Random Waypoint instance with 200 nodes in a simulation area of 100x100 units, 49 | velocity chosen from a uniform distribution between 0.1 and 1.0 units/step 50 | and maximum waiting time of 1.0 steps. 51 | This object is a generator that yields the position of the nodes in each step. 52 | For example, to print a 2-dimensional array with the node positions produced in the first step, call 53 | ```python 54 | >>> positions = next(rw) 55 | >>> print positions 56 | ``` 57 | You can also iterate over the positions produced in each step: 58 | ```python 59 | >>> for positions in rw: 60 | ... print positions 61 | ... 62 | ``` 63 | ### Contact Models 64 | The contact models are available in the pymobility.models.contact package. 65 | Differently from the mobility package that yield node positions for each time step, 66 | the contact models yield a list of node pairs that were in contact at each time step. 67 | For example, to create a Dynamic G(n,p) model instance, use the following commands: 68 | ```python 69 | >>> from pymobility.models.contact import dynamic_gnp 70 | >>> m = dynamic_gnp(200, p=0.01) 71 | ``` 72 | This will create a Dynamic G(n,p) model instance with 200 nodes that generates a list of contacts 73 | at each time step. 74 | The probability of any edge appearing at each step is defined by the parameter *p*. 75 | Now you can iterate over the list of contacts produced in each time step: 76 | ```python 77 | >>> for contacts in m: 78 | ... for source, target in contacts: 79 | ... print (source, target) 80 | ``` 81 | 82 | ### Simulation and Visualization 83 | The script pymobility/simulation.py, under the src directory, contains examples on how to run different models 84 | and to plot the points in a simulation area using Matplotlib. 85 | To run it, open a shell prompt, go to the src directory and run the following command: 86 | ```bash 87 | python pymobility/simulation.py 88 | ``` 89 | 90 | Contributing 91 | ------------ 92 | If you have a Github account please fork the repository, 93 | create a topic branch, and commit your changes. 94 | Then submit a pull request from that branch. 95 | 96 | License 97 | ------- 98 | Written by André Panisson 99 | Copyright (C) 2012 Istituto per l'Interscambio Scientifico I.S.I. 100 | You can contact us by email (isi@isi.it) or write to: 101 | ISI Foundation, Via Alassio 11/c, 10126 Torino, Italy. 102 | 103 | The Model B was implemented with the contribution of Juliette Stehle. 104 | 105 | References 106 | ---------- 107 | [1] Injong Rhee, Minsu Shin, Seongik Hong, Kyunghan Lee, and Song Chong. On the Levy-Walk Nature of Human Mobility. 108 | In 2008 IEEE INFOCOM - Proceedings of the 27th Conference on Computer Communications, pages 924-932. April 2008. 109 | 110 | [2] Camp, T., Boleng, J. & Davies, V. A survey of mobility models for ad hoc network research. 111 | Wireless Communications and Mobile Computing 2, 483-502 (2002). 112 | 113 | [3] Xiaoyan Hong, Mario Gerla, Guangyu Pei, and Ching-Chuan Chiang. 1999. 114 | A group mobility model for ad hoc wireless networks. In Proceedings of the 115 | 2nd ACM international workshop on Modeling, analysis and simulation of 116 | wireless and mobile systems (MSWiM '99). ACM, New York, NY, USA, 53-60. 117 | 118 | [4] Wei-jen Hsu, Thrasyvoulos Spyropoulos, Konstantinos Psounis, and Ahmed Helmy, 119 | Modeling Time-variant User Mobility in Wireless Mobile Networks, INFOCOM 2007, May 2007. 120 | 121 | [5] Andrea E. F. Clementi, Francesco Pasquale, Angelo Monti, and Riccardo Silvestri. 2007. 122 | Communication in dynamic radio networks. In Proceedings of the twenty-sixth annual 123 | ACM symposium on Principles of distributed computing (PODC '07). ACM, New York, NY, USA, 205-214. 124 | 125 | [6] Andrea E.F. Clementi, Claudio Macci, Angelo Monti, Francesco Pasquale, and Riccardo Silvestri. 2008. 126 | Flooding time in edge-Markovian dynamic graphs. In Proceedings of the 127 | twenty-seventh ACM symposium on Principles of distributed computing (PODC '08). 128 | ACM, New York, NY, USA, 213-222. 129 | 130 | [7] Augustin Chaintreau, Abderrahmen Mtibaa, Laurent Massoulie, and Christophe Diot. 2007. 131 | The diameter of opportunistic mobile networks. In Proceedings of the 132 | 2007 ACM CoNEXT conference (CoNEXT '07). ACM, New York, NY, USA, , Article 12 , 12 pages. 133 | 134 | [8] Stehle, J., Barrat, A. & Bianconi, G. Dynamical and bursty interactions in social networks. 135 | Physical Review E 81, 1-4 (2010). Available online at: http://link.aps.org/doi/10.1103/PhysRevE.81.035101 136 | -------------------------------------------------------------------------------- /Data_Processing/acc_loss_plot.py: -------------------------------------------------------------------------------- 1 | #By Zhenghang(Klaus) Zhong 2 | 3 | import matplotlib.pyplot as plt 4 | import csv 5 | import pandas as pd 6 | 7 | # file name strcture 8 | # log_ts=20_128_10_120 (time_steps, hidden nodes, batch size, epochs, listed values are default) 9 | 10 | #batch size 11 | filename_20_128_1_30 = 'log_1_30.csv' 12 | filename_20_128_5_30 = 'log_5_30.csv' 13 | filename_20_128_10_30 = 'log_10_30.csv' 14 | filename_20_128_20_30 = 'log_20_30.csv' 15 | 16 | #batch size 17 | filename_20_256_5_30 = 'log_ts=20_256_5_30.csv' 18 | filename_20_256_10_30 = 'log_256_10_30.csv' 19 | filename_20_256_20_30 = 'log_256_20_30.csv' 20 | filename_20_256_30_30 = 'log_256_30_30.csv' 21 | filename_20_256_40_30 = 'log_256_40_30.csv' 22 | 23 | #batch size 24 | filename_20_16_20_30 = 'log_16_20_30.csv' 25 | filename_20_32_20_30 = 'log_32_20_30.csv' 26 | filename_20_64_20_30 = 'log_64_20_30.csv' 27 | filename_20_128_20_30 = 'log_20_30.csv' 28 | filename_20_256_20_30 = 'log_256_20_30.csv' 29 | filename_20_512_20_30 = 'log_512_20_30.csv' 30 | 31 | #time steps 32 | filename_10_128_10_120 = 'log_ts=10_128_10_120.csv' 33 | filename_20_128_10_30 = 'log_ts=20_128_10_120.csv' 34 | #filename_20_128_10_30 = 'log_10_30.csv' 35 | filename_30_128_10_120 = 'log_ts=30_128_10_120.csv' 36 | filename_40_128_10_30 = 'log_ts=40_128_10_30.csv' 37 | 38 | filename_20_128_20_100 = 'log_20_100.csv' 39 | 40 | filename_20_128_10_120 = 'log_ts=20_128_10_120.csv' 41 | 42 | filename_30_512_5_100 = 'log_ts=30_512_5_100.csv' 43 | 44 | def returnAccLoss(filename): 45 | csvfile = open(filename, "r") 46 | Hlength=len(csvfile.readlines()) 47 | print('File \'%s\' length: %d' % (filename, Hlength-1)) 48 | 49 | epochs= pd.read_csv(filepath_or_buffer = filename, sep = ',')["epochs"].values 50 | acc= pd.read_csv(filepath_or_buffer = filename, sep = ',')["acc"].values 51 | loss= pd.read_csv(filepath_or_buffer = filename, sep = ',')["loss"].values 52 | 53 | #epochs = epochs[:] + 1 54 | #print(epochs) 55 | return epochs, acc, loss 56 | 57 | epochs_20_128_1_30, acc_20_128_1_30, loss_20_128_1_30 = returnAccLoss(filename_20_128_1_30) 58 | epochs_20_128_5_30, acc_20_128_5_30, loss_20_128_5_30 = returnAccLoss(filename_20_128_5_30) 59 | epochs_20_128_10_30, acc_20_128_10_30, loss_20_128_10_30 = returnAccLoss(filename_20_128_10_30) 60 | epochs_20_128_20_30, acc_20_128_20_30, loss_20_128_20_30 = returnAccLoss(filename_20_128_20_30) 61 | epochs_20_128_10_120, acc_20_128_10_120, loss_20_128_10_120 = returnAccLoss(filename_20_128_10_120) 62 | ''' 63 | plt.plot(epochs_20_128_1_30,acc_20_128_1_30, color = 'green',label = 'batch_size = 1') 64 | plt.plot(epochs_20_128_5_30,acc_20_128_5_30, color = 'red',label = 'batch_size = 5') 65 | plt.plot(epochs_20_128_10_30,acc_20_128_10_30, color = 'black',label = 'batch_size = 10') 66 | plt.plot(epochs_20_128_20_30,acc_20_128_20_30, color = 'blue',label = 'batch_size = 20') 67 | plt.plot(epochs_20_128_10_120,acc_20_128_10_120, color = 'y',label = 'batch_size = 10_ep=120') 68 | ''' 69 | ''' 70 | plt.plot(epochs_20_128_1_30,loss_20_128_1_30, color = 'green',label = 'batch_size = 1') 71 | plt.plot(epochs_20_128_5_30,loss_20_128_5_30, color = 'red',label = 'batch_size = 5') 72 | plt.plot(epochs_20_128_10_30,loss_20_128_10_30, color = 'skyblue',label = 'batch_size = 10') 73 | plt.plot(epochs_20_128_20_30,loss_20_128_20_30, color = 'blue',label = 'batch_size = 20') 74 | ''' 75 | 76 | ''' 77 | # Comparing accuracy of different batchs size 78 | epochs_20_256_5_30, acc_20_256_5_30, loss_20_256_5_30 = returnAccLoss(filename_20_256_5_30) 79 | epochs_20_256_10_30, acc_20_256_10_30, loss_20_256_10_30 = returnAccLoss(filename_20_256_10_30) 80 | epochs_20_256_20_30, acc_20_256_20_30, loss_20_256_20_30 = returnAccLoss(filename_20_256_20_30) 81 | epochs_20_256_30_30, acc_20_256_30_30, loss_20_256_30_30 = returnAccLoss(filename_20_256_30_30) 82 | epochs_20_256_40_30, acc_20_256_40_30, loss_20_256_40_30 = returnAccLoss(filename_20_256_40_30) 83 | plt.plot(epochs_20_256_5_30,acc_20_256_5_30, color = 'black',label = 'batch_size = 5') 84 | plt.plot(epochs_20_256_10_30,acc_20_256_10_30, color = 'green',label = 'batch_size = 10') 85 | plt.plot(epochs_20_256_20_30,acc_20_256_20_30, color = 'red',label = 'batch_size = 20') 86 | plt.plot(epochs_20_256_30_30,acc_20_256_30_30, color = 'skyblue',label = 'batch_size = 30') 87 | plt.plot(epochs_20_256_40_30,acc_20_256_40_30, color = 'blue',label = 'batch_size = 40') 88 | ''' 89 | #begin drawing: comparing different batchs size 90 | #plt.title('') 91 | 92 | ''' 93 | #Comparing accuracy of different hidden nodes 94 | epochs_20_16_20_30, acc_20_16_20_30, loss_20_16_20_30 = returnAccLoss(filename_20_16_20_30) 95 | epochs_20_32_20_30, acc_20_32_20_30, loss_20_32_20_30 = returnAccLoss(filename_20_32_20_30) 96 | epochs_20_64_20_30, acc_20_64_20_30, loss_20_64_20_30 = returnAccLoss(filename_20_64_20_30) 97 | epochs_20_128_20_30, acc_20_128_20_30, loss_20_128_20_30 = returnAccLoss(filename_20_128_20_30) 98 | epochs_20_256_20_30, acc_20_256_20_30, loss_20_256_20_30 = returnAccLoss(filename_20_256_20_30) 99 | epochs_20_512_20_30, acc_20_512_20_30, loss_20_512_20_30 = returnAccLoss(filename_20_512_20_30) 100 | plt.plot(epochs_20_16_20_30,acc_20_16_20_30, color = 'black',label = 'hidden_nodes = 16') 101 | plt.plot(epochs_20_32_20_30,acc_20_32_20_30, color = 'green',label = 'hidden_nodes = 32') 102 | plt.plot(epochs_20_64_20_30,acc_20_64_20_30, color = 'red',label = 'hidden_nodes = 64') 103 | plt.plot(epochs_20_128_20_30,acc_20_128_20_30, color = 'skyblue',label = 'hidden_nodes = 128') 104 | plt.plot(epochs_20_256_20_30,acc_20_256_20_30, color = 'blue',label = 'hidden_nodes = 256') 105 | plt.plot(epochs_20_512_20_30,acc_20_512_20_30, color = 'y',label = 'hidden_nodes = 512') 106 | ''' 107 | ''' 108 | epochs_10_128_10_120, acc_10_128_10_120, loss_10_128_10_120 = returnAccLoss(filename_10_128_10_120) 109 | epochs_20_128_10_30, acc_20_128_10_30, loss_20_128_10_30 = returnAccLoss(filename_20_128_10_30) 110 | epochs_30_128_10_120, acc_30_128_10_120, loss_30_128_10_120 = returnAccLoss(filename_30_128_10_120) 111 | #epochs_40_128_10_30, acc_40_128_10_30, loss_40_128_10_120 = returnAccLoss(filename_40_128_10_30) 112 | 113 | plt.plot(epochs_10_128_10_120[0:91],acc_10_128_10_120[0:91], color = 'black',label = 'time_steps = 10') 114 | plt.plot(epochs_20_128_10_30,acc_20_128_10_30, color = 'green',label = 'time_steps = 20') 115 | plt.plot(epochs_30_128_10_120[0:91],acc_30_128_10_120[0:91], color = 'red',label = 'time_steps = 30') 116 | #plt.plot(epochs_40_128_10_30,acc_40_128_10_30, color = 'skyblue',label = 'time_steps = 40') 117 | ''' 118 | epochs_20_128_20_100, acc_20_128_20_100, loss_20_128_20_100 = returnAccLoss(filename_20_128_20_100) 119 | plt.plot(epochs_20_128_20_100,acc_20_128_20_100, color = 'y',label = 'ts = 20,hn=128,bs=20') 120 | 121 | epochs_30_512_5_100, acc_30_512_5_100, loss_30_512_5_100 = returnAccLoss(filename_30_512_5_100) 122 | plt.plot(epochs_30_512_5_100,acc_30_512_5_100, color = 'blue',label = 'ts = 30,hn=512,bs=5') 123 | 124 | 125 | 126 | plt.legend() 127 | plt.xlabel('Epoch') 128 | plt.ylabel('Accuracy') 129 | plt.grid() 130 | plt.show() 131 | ''' 132 | with open('log_1_30.csv','r') as csvfile: 133 | reader = csv.reader(csvfile) 134 | column = [row[2] for row in reader] 135 | ''' 136 | 137 | ''' 138 | csv_file = csv.reader(open('log_1_30.csv','r')) 139 | print(csv_file) 140 | 141 | for stu in csv_file: 142 | print(stu) 143 | ''' 144 | -------------------------------------------------------------------------------- /2D_Interpolation/Interpolation.py: -------------------------------------------------------------------------------- 1 | ''' 2 | By Zhenghang(Klaus) Zhong 3 | 4 | Assuming in a small indoor space, relationship between space and geomagnetic field intensity is linear 5 | 6 | Interpolation method is used for two purpose: 7 | 8 | 1. Imporve the precision of geomagnetic map 9 | 10 | 2. Work with random waypoint model, with generated walk trace 11 | get the points' magnetic field intensity in x,y,z coordination 12 | 13 | For 4th floor detection area, the size is 51 points X 6 points, 14 | we improve the precision by 6 times, which mean to interpolate 15 | 5 points between two raw points. 16 | 17 | For 5th floor detection area, the size is 51 points X 13 points, 18 | do the same way as 4th floor. 19 | ''' 20 | 21 | # coding: utf-8 22 | import csv 23 | import os 24 | import re #get number in string 25 | import math 26 | import numpy as np 27 | import pandas as pd 28 | import pylab as pl 29 | import matplotlib as mpl 30 | import matplotlib.pyplot as plt 31 | from scipy import interpolate 32 | from scipy.interpolate import griddata 33 | from scipy.interpolate import SmoothBivariateSpline as SBS 34 | from scipy.interpolate import CloughTocher2DInterpolator 35 | PYTHONIOENCODING="UTF-8" 36 | 37 | filename = '5N_all.csv' 38 | 39 | Loc_x = pd.read_csv(filepath_or_buffer = filename, sep = ',')["Loc_x"].values.astype('int') 40 | Loc_y = pd.read_csv(filepath_or_buffer = filename, sep = ',')["Loc_y"].values.astype('int') 41 | Mag_x = pd.read_csv(filepath_or_buffer = filename, sep = ',')["GeoX"].values.astype('float') 42 | Mag_y = pd.read_csv(filepath_or_buffer = filename, sep = ',')["GeoY"].values.astype('float') 43 | Mag_z = pd.read_csv(filepath_or_buffer = filename, sep = ',')["GeoZ"].values.astype('float') 44 | #Add one axis, transfer to 2-D data 45 | Loc_x = Loc_x[:,np.newaxis] 46 | Loc_y = Loc_y[:,np.newaxis] 47 | 48 | ''' 49 | #Old way of doing obove work 50 | 51 | with open('5N_all.csv', 'r', newline='') as csvfile: 52 | reader = csv.reader(csvfile) 53 | frames = [row for row in reader] 54 | frames = np.array(frames) 55 | 56 | Loc_x = frames[1:,518].astype('int') 57 | Loc_x = Loc_x[:,np.newaxis] 58 | Loc_y = frames[1:,519].astype('int') 59 | Loc_y = Loc_y[:,np.newaxis] 60 | Mag_x = frames[1:,524].astype('float') 61 | Mag_y = frames[1:,525].astype('float') 62 | Mag_z = frames[1:,526].astype('float') 63 | ''' 64 | Loc = np.concatenate((Loc_x,Loc_y),axis = 1) 65 | print(Loc.shape) 66 | 67 | # The shape of map is 50 X 12 68 | grid_x, grid_y = np.mgrid[0:50:0.01, 0:12:0.01] 69 | print(grid_x.shape) 70 | 71 | #Get total magnetic field intensity 72 | Mag = [] 73 | for i in range(len(Mag_x)): 74 | Mag.append( math.sqrt(Mag_x[i]*Mag_x[i]+Mag_y[i]*Mag_y[i]+Mag_z[i]*Mag_z[i])) 75 | 76 | #Show geomagnetic field with graph 77 | G_y_li = griddata(Loc, Mag, (grid_x, grid_y), method='linear') 78 | plt.plot() 79 | plt.imshow(G_y_li.T, extent=(0,50,0,12), origin='lower') 80 | plt.show() 81 | 82 | #Clough-Tocher 2-D Interpolation 83 | C_x = CloughTocher2DInterpolator(Loc, Mag_x, tol=1e-6) 84 | C_y = CloughTocher2DInterpolator(Loc, Mag_y, tol=1e-6) 85 | C_z = CloughTocher2DInterpolator(Loc, Mag_z, tol=1e-6) 86 | 87 | #For forth floor, we collect data in map of 51 X 6 points 88 | def interpolateMap(): 89 | with open('newMap_4S.csv', 'w', newline='') as csvfile: 90 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 91 | spamwriter.writerow(['Loc_x','Loc_y','Floor','Mag_x','Mag_y','Mag_z']) 92 | 93 | for x in range((51-1)*6+1): 94 | for y in range((6-1)*6+1): 95 | Loc_x = x 96 | Loc_y = y 97 | Mag_x = C_x(Loc_x/6,Loc_y/6).__float__() 98 | Mag_y = C_y(Loc_x/6,Loc_y/6).__float__() 99 | Mag_z = C_z(Loc_x/6,Loc_y/6).__float__() 100 | row = ([ 101 | Loc_x,Loc_y,'4S',Mag_x,Mag_y,Mag_z 102 | ]) 103 | spamwriter.writerow(row) 104 | 105 | #Interpolate magnetic values in terms of waypoint traces 106 | #The precision improve 6 times (interpolate 5 points between 2 detected points) 107 | def interpolateValues(): 108 | with open('waypoint_trace.csv', 'r', newline='') as csvfile: 109 | reader = csv.reader(csvfile) 110 | traces = [row for row in reader] 111 | traces = np.array(traces) 112 | #traces[1:][:].astype('float') 113 | 114 | with open('waypoint_trace_new.csv', 'w', newline='') as csvfile: 115 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 116 | spamwriter.writerow(['Loc_x','Loc_y','Floor','Mag_x','Mag_y','Mag_z']) 117 | 118 | for x in range(1,len(traces)): 119 | Loc_x = traces[x][0].astype('float') 120 | Loc_y = traces[x][1].astype('float') 121 | Mag_x = C_x(Loc_x/6,Loc_y/6).__float__() 122 | Mag_y = C_y(Loc_x/6,Loc_y/6).__float__() 123 | Mag_z = C_z(Loc_x/6,Loc_y/6).__float__() 124 | row = ([ 125 | traces[x][0],traces[x][1],'4',Mag_x,Mag_y,Mag_z 126 | ]) 127 | spamwriter.writerow(row) 128 | 129 | #For 5th floor 130 | def generate2Dmagnetic_5(): 131 | with open('newMap_5N.csv', 'r', newline='') as csvfile: 132 | reader = csv.reader(csvfile) 133 | frames = [row for row in reader] 134 | frames = np.array(frames) 135 | #frames = pd.DataFrame(frames) 136 | #frames = frames.reshape([len(frames), len(frames[1])]) 137 | 138 | Mag_x = frames[1:,3].astype('float') 139 | Mag_y = frames[1:,4].astype('float') 140 | Mag_z = frames[1:,5].astype('float') 141 | 142 | Mag_total = [] 143 | for i in range(len(Mag_x)): 144 | Mag_total.append(math.sqrt(Mag_x[i]*Mag_x[i]+Mag_y[i]*Mag_y[i]+Mag_z[i]*Mag_z[i])) 145 | #print(Mag_total) 146 | Mag_total = np.array(Mag_total).reshape(301,73) 147 | Mag_total = Mag_total.transpose() 148 | print(Mag_total.shape) 149 | print(Mag_total) 150 | x = np.arange(0,301,1) 151 | y = np.arange(0,73,1) 152 | X,Y = np.meshgrid(x,y) 153 | print(X) 154 | print(Y) 155 | #plt.contourf(X,Y,Mag_total) 156 | cset = plt.contourf(X,Y,Mag_total,7,alpha=0.99,cmap=plt.cm.hot) 157 | contour = plt.contour(X,Y,Mag_total,10,colors = 'k') 158 | #plt.clabel(contour,fontsize=10,colors = ('k')) 159 | plt.colorbar(cset,orientation='horizontal') 160 | plt.show() 161 | 162 | #For 4th floor 163 | def generate2Dmagnetic_4(): 164 | with open('newMap_4N.csv', 'r', newline='') as csvfile: 165 | reader = csv.reader(csvfile) 166 | frames = [row for row in reader] 167 | frames = np.array(frames) 168 | #frames = pd.DataFrame(frames) 169 | #frames = frames.reshape([len(frames), len(frames[1])]) 170 | 171 | Mag_x = frames[1:,3].astype('float') 172 | Mag_y = frames[1:,4].astype('float') 173 | Mag_z = frames[1:,5].astype('float') 174 | 175 | 176 | Mag_total = [] 177 | for i in range(len(Mag_x)): 178 | Mag_total.append(math.sqrt(Mag_x[i]*Mag_x[i]+Mag_y[i]*Mag_y[i]+Mag_z[i]*Mag_z[i])) 179 | #print(Mag_total) 180 | Mag_total = np.array(Mag_total).reshape(301,31) 181 | Mag_total = Mag_total.transpose() 182 | print(Mag_total.shape) 183 | print(Mag_total) 184 | x = np.arange(0,301,1) 185 | y = np.arange(0,31,1) 186 | X,Y = np.meshgrid(x,y) 187 | print(X) 188 | print(Y) 189 | #plt.contourf(X,Y,Mag_total) 190 | cset = plt.contourf(X,Y,Mag_total,7,alpha=0.99,cmap=plt.cm.hot) 191 | contour = plt.contour(X,Y,Mag_total,10,colors = 'k') 192 | #plt.clabel(contour,fontsize=10,colors = ('k')) 193 | plt.colorbar(cset,orientation='horizontal') 194 | plt.show() 195 | 196 | 197 | #Call one function at a time 198 | 199 | #interpolateMap() 200 | #interpolateValues() 201 | #generate2Dmagnetic_4() 202 | #generate2Dmagnetic_5() 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 2018-SURF-Trajectory-Estimation 2 | 3 | 2018 SURF of EEE department XJTLU: Trajectory Estimation of Mobile Users/Devices based on Wi-Fi Fingerprinting and Deep Neural Networks 4 | 5 | 6 | 7 | p.s. The algorithm code is preserved untill workshop paper accepted. 8 | 9 | 10 | 11 | ## Background 12 | 13 | This 2018 SURF(Summer Undergraduate Research Fellowships) project is based on the last year's SURF of [Indoor Localization Based on Wi-Fi Fingerprinting](http://kyeongsoo.github.io/research/projects/surf-201739/index.html) and will go deeper in two directions, one is **advanced DNN-based indoor localization** (including CNN-based approaches); the other is **RNN-based (LSTM) trajectory estimation**. 14 | 15 | 16 | 17 | ## People 18 | 19 | ### Supervisor 20 | 21 | - [Dr Kyeong Soo Kim](http://kyeongsoo.github.io/) ([Department of Electrical and Electronic Engineering](http://www.xjtlu.edu.cn/en/departments/academic-departments/electrical-and-electronic-engineering/), [XJTLU](http://www.xjtlu.edu.cn/en/) ) 22 | [Dr Sanghyuk Lee](http://www.xjtlu.edu.cn/en/departments/academic-departments/electrical-and-electronic-engineering/staff/sanghyuk-lee) ([Department of Electrical and Electronic Engineering](http://www.xjtlu.edu.cn/en/departments/academic-departments/electrical-and-electronic-engineering/), [XJTLU](http://www.xjtlu.edu.cn/en/) ) 23 | 24 | ### Research Assistant 25 | 26 | - Xintao Huan (E-mail: Xintao.Huan_at_xjtlu.edu.cn; PhD Candidate, ([Department of Electrical and Electronic Engineering](http://www.xjtlu.edu.cn/en/departments/academic-departments/electrical-and-electronic-engineering/), [XJTLU](http://www.xjtlu.edu.cn/en/) ) 27 | 28 | ## Meetings: 29 | 30 | - Please refer to the project homepage, [Trajectory Estimation of Mobile Users/Devices based on Wi-Fi Fingerprinting and Deep Neural Networks](http://kyeongsoo.github.io/research/projects/surf-201830/index.html), with presentation materials. 31 | 32 | 33 | 34 | ## Research part (15/6/2018 - 7/9/2018) 35 | 36 | ### Android mobile phone and coordination system 37 | 38 | ![**Android mobile phone and coordination system**](https://github.com/ZzhKlaus/2018-SURF-Trajectory-Estimation/raw/master/img/axisdevice.png) 39 | 40 | We used two android mobile phones for collecting Wi-Fi fingerprinting as well as IMU data, for IMU, these data were collected: Geomagnetic field intensity in (x,y,z) coordination, pose direction of phones (pitch, roll, yaw), accelaration data in (x,y,z) coordination. 41 | 42 | - **x - pitch** 43 | - **y - roll** 44 | - **z - yaw (*Azimuth*)** 45 | 46 | ### Transfer the geomagnetic filed intensity from device coordination system to global coordination system 47 | 48 | We have tried several ways : 49 | 50 | 1. **Rotation Matrix** 51 | 2. **quaternion** 52 | 53 | The performance was not as expected and varied in different devices, we made a tradeodd by keeping the devides at same pose when measuring. 54 | 55 | 56 | 57 | ### To keep data accurate and stable 58 | 59 | While WiFi and IMU data were collected together, for one measurement of each point, the collection times of IMU data would be same as the number of APs of that point detected. (Usually more than 50 times), and **Kalman Filter** was implemented in android APP. 60 | 61 | 62 | 63 | ### Data collection 64 | 65 | ![](https://github.com/ZzhKlaus/2018-SURF-Trajectory-Estimation/raw/master/img/Location_Of_Data.jpg) 66 | 67 | (Drawn by Zhe (Tim) Tang ) 68 | 69 | We collected two areas in 4th and 5th floors of IBSS, XJTLU. The total area is around 300 $m^2$ . 70 | 71 | ### Study on geomagnetic field by different devices on one path 72 | 73 | ![](https://github.com/ZzhKlaus/2018-SURF-Trajectory-Estimation/raw/master/img/4Y_3.png) 74 | 75 | We found that although the detecting data at one point varies a lot for different devices, the characteristic of changing patterns along one path are very similar. 76 | 77 | 78 | 79 | ### Study on geomagnetic field by different poses of one device 80 | 81 | ![](https://github.com/ZzhKlaus/2018-SURF-Trajectory-Estimation/raw/master/img/ori.PNG) 82 | 83 | Although the deteacting data varies when changing the pose of device at one point, the changing patterns along one path are similar, two. 84 | 85 | 86 | 87 | ### The geomagnetic field map for two floors 88 | 89 | ![](https://github.com/ZzhKlaus/2018-SURF-Trajectory-Estimation/raw/master/img/floor_4.png) 90 | 91 | **4th floor** 92 | 93 | ![](https://github.com/ZzhKlaus/2018-SURF-Trajectory-Estimation/raw/master/img/floor_5.png) 94 | 95 | **5th floor** 96 | 97 | ### Training data: Random waypoint model 98 | 99 | For training data, considering the special characteristic that despite very stable spatially, there are many points with same geomagnetic field intensity, which limits the usage as fingerprint like Wi-Fi signal (where the mac address is unique). We generated a long path of 10,000 steps based on random waypoint model, for both training and evaluation (0.75:0.25). 100 | 101 | ![](https://github.com/ZzhKlaus/2018-SURF-Trajectory-Estimation/raw/master/img/tra.png) 102 | 103 | **random waypoint model** 104 | 105 | ### Training the LSTM network 106 | 107 | ![](https://github.com/ZzhKlaus/2018-SURF-Trajectory-Estimation/raw/master/img/model_ts=30_hn=128_bs=5_ep=100.png) 108 | 109 | **model structure** 110 | 111 | ![](https://github.com/ZzhKlaus/2018-SURF-Trajectory-Estimation/raw/master/img/diff_hidden_nodes.png) 112 | 113 | Training accuracy with different hidden nodes 114 | 115 | ![](https://github.com/ZzhKlaus/2018-SURF-Trajectory-Estimation/raw/master/img/diff_batch_size.png) 116 | 117 | Training accuracy with different batch size 118 | 119 | 120 | 121 | ![](https://github.com/ZzhKlaus/2018-SURF-Trajectory-Estimation/raw/master/img/diff_time_steps.png) 122 | 123 | Training accuracy with different time steps 124 | 125 | ![](https://github.com/ZzhKlaus/2018-SURF-Trajectory-Estimation/raw/master/img/error_LSTM_all.png) 126 | 127 | 128 | 129 | **Evaluation error based on 25,000 points** 130 | 131 | 132 | 133 | ## Outcomes 134 | 135 | ### Github repository 136 | 137 | - [Meng (Lemon) Wei](https://github.com/weimengmeng1999/CNN_based_indoor_localization) 138 | - [Zhenghang (Klaus) Zhong](https://github.com/ZzhKlaus/2018-SURF-Trajectory-Estimation) 139 | 140 | ### Publications 141 | 142 | - Zhenghang Zhong, Zhe Tang, Xiangxing Li, Tiancheng Yuan, Yang Yang, Wei Meng, Yuanyuan Zhang, Renzhi Sheng, Naomi Grant, Chongfeng Ling, Xintao Huan, Kyeong Soo Kim and Sanghyuk Lee, "XJTLUIndoorLoc: A new fingerprinting database for indoor localization and trajectory estimation based on Wi-Fi RSS and geomagnetic field," *submitted to* [*GCA'18*](https://is-candar.org/GCA18/), Sep. 7, 2018. 143 | 144 | ## References 145 | 146 | ### Trajectory estimation and PDR 147 | 148 | 1. Ho Jun Jang, Jae Min Shin, and Lynn Choi, "Geomagnetic field based indoor localization using recurrent neural networks," *Proc. GLOBECOM 2017*, pp. 1-6, Dec. 2017. ([DOI](https://doi.org/10.1109/GLOCOM.2017.8254556)) 149 | 150 | 2. [DeepML: Deep LSTM for Indoor Localization with Smartphone Magnetic and Light Sensors](http://www.eng.auburn.edu/~szm0001/papers/ICC18_DeepML.pdf) 151 | 152 | 153 | 154 | ### Rucurrent neural networks (RNNs) and long short-term memory (LSTM) networks 155 | 156 | 1. [A Critical Review of Recurrent Neural Networks for Sequence Learning](https://arxiv.org/abs/1506.00019) 157 | 158 | 2. [An advanced method for pedestrian dead reckoning using BLSTM-RNNs](https://ieeexplore.ieee.org/document/7346954/) 159 | 160 | 3. [From Recurrent Neural Network to Long Short Term Memory Architecture](https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/43905.pdf) 161 | 162 | 4. [LSTM AND EXTENDED DEAD RECKONING AUTOMOBILE ROUTE PREDICTION USING SMARTPHONE SENSORS](https://www.ideals.illinois.edu/handle/2142/97357) 163 | 164 | 5. [Keras & machinelearningmastery](https://machinelearningmastery.com/) 165 | 166 | 167 | 168 | ### Fingerprint database combined with IMU data 169 | 170 | 1. [A multisource and multivariate dataset for indoor localization methods based on WLAN and geo-magnetic field fingerprinting](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7743678) 171 | 172 | 2. [MagPIE: A Dataset for Indoor Positioning with Magnetic Anomalies](https://ieeexplore.ieee.org/document/8115961/) 173 | 174 | 3. [UJIIndoorLoc-Mag: A New Database for Magnetic Field-Based Localization Problems](https://ieeexplore.ieee.org/document/7346763/) 175 | 176 | 177 | -------------------------------------------------------------------------------- /server/delete_repetition.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Usually we donot need this file. 3 | 4 | As at first, we forget to call the function to refresh file 'tempList.csv', 5 | rather than re-detecting the data, I found that we could delete the repeated 6 | info from tail to head, as the info is stored into database in groups, compare 7 | these groups one by one conversely, and delte info that is repeated in latter one. 8 | 9 | ''' 10 | import csv 11 | import pandas as pdb 12 | import numpy as np 13 | import tensorflow as tf 14 | #from sklearn.preprocessing import scale 15 | import matplotlib.pyplot as plt 16 | 17 | PYTHONIOENCODING="UTF-8" #set the utf-8 encode mode 18 | 19 | 20 | FILE_0_old = '0_xxx_0_1_5E_39.csv' 21 | FILE_1_old = '1_xxx_0_1_5SW.csv' 22 | FILE_2_old = '2_xxx_0_2_0_3_5f.csv' 23 | FILE_3_old = '3_xxx_0_4_5f.csv' 24 | FILE_4_old = '4_xxx_0_5_5f.csv' 25 | FILE_5_old = '5_xxx_0_6_5f.csv' 26 | FILE_6_old = '6_xxx_0_7_5f.csv' 27 | FILE_7_old = '7_xxx_0_8_5f.csv' 28 | FILE_8_old = '8_xxx_0_9_5f.csv' 29 | FILE_9_old = '9_xxx_0_10_5f.csv' 30 | FILE_10_old = '10_xxx_0_11_5f.csv' 31 | FILE_11_old = '11_xxx_0_12_5f.csv' 32 | FILE_12_old = '12_xxx_0_0_1_4f.csv' 33 | FILE_13_old = '13_xxx_0_2_4f.csv' 34 | FILE_14_old = '14_xxx_0_3_4_5f.csv' 35 | FILE_15_old = '15_xxx_0_5_4f.csv' 36 | FILE_dif_direc_old = 'diff-direction-0_5_4f.csv' 37 | 38 | FILE_0_new = '0_new_0_1_5E_39.csv' 39 | FILE_1_new = '1_new_0_1_5SW.csv' 40 | FILE_2_new = '2_new_0_2_0_3_5f.csv' 41 | FILE_3_new = '3_new_0_4_5f.csv' 42 | FILE_4_new = '4_new_0_5_5f.csv' 43 | FILE_5_new = '5_new_0_6_5f.csv' 44 | FILE_6_new = '6_new_0_7_5f.csv' 45 | FILE_7_new = '7_new_0_8_5f.csv' 46 | FILE_8_new = '8_new_0_9_5f.csv' 47 | FILE_9_new = '9_new_0_10_5f.csv' 48 | FILE_10_new = '10_new_0_11_5f.csv' 49 | FILE_11_new = '11_new_0_12_5f.csv' 50 | FILE_12_new = '12_new_0_0_1_4f.csv' 51 | FILE_13_new = '13_new_0_2_4f.csv' 52 | FILE_14_new = '14_new_0_3_4_5f.csv' 53 | FILE_15_new = '15_new_0_5_4f.csv' 54 | FILE_dif_direc_new = 'new_diff-direction-0_5_4f.csv' 55 | 56 | FILE_mix_0_old = 'MIX2_0_xxx_0_0_1_4f.csv' 57 | FILE_mix_1_old = 'MIX2_1_xxx_0_2_4f.csv' 58 | FILE_mix_2_old = 'MIX2_2_xxx_0_3-S27_4f.csv' 59 | FILE_mix_3_old = 'MIX2_3_xxx_0_4_4f.csv' 60 | FILE_mix_4_old = 'MIX2_4_xxx_0_5_4f.csv' 61 | 62 | FILE_mix_0_new = 'MIX2_0_new_0_0_1_4f.csv' 63 | FILE_mix_1_new = 'MIX2_1_new_0_2_4f.csv' 64 | FILE_mix_2_new = 'MIX2_2_new_0_3-S27_4f.csv' 65 | FILE_mix_3_new = 'MIX2_3_new_0_4_4f.csv' 66 | FILE_mix_4_new = 'MIX2_4_new_0_5_4f.csv' 67 | 68 | def delete_repetition(FileName_this, FileName_last, FileName_new): 69 | with open('mapping.csv', 'r', newline='') as csvfile: 70 | reader = csv.reader(csvfile) 71 | APs = [row for row in reader] 72 | APlength = len(APs) - 1 73 | 74 | with open(FileName_this, 'r', newline='') as csvfile: 75 | reader = csv.reader(csvfile) 76 | RSS = [row for row in reader] 77 | samples = int((len(RSS)-1) / APlength) 78 | """print('length:',len(RSS)) 79 | print(APlength) 80 | print(samples) 81 | print('samples:',samples) 82 | print('0,0:',RSS[0][0]) 83 | print(float(RSS[2][14]))""" 84 | 85 | for s in range(samples,1,-1): 86 | for AP in range(APlength-1,-1,-1): 87 | if RSS[s*APlength-AP][14] != 'none' and RSS[(s-1)*APlength-AP][14] != 'none': 88 | 89 | if float(RSS[s*APlength-AP][14]) == float(RSS[(s-1)*APlength-AP][14]) and float(RSS[s*APlength-AP][15]) == float(RSS[(s-1)*APlength-AP][15]) and float(RSS[s*APlength-AP][16]) == float(RSS[(s-1)*APlength-AP][16]) or RSS[s*APlength-AP][1]=='surf' or RSS[s*APlength-AP][1]=='SURF': 90 | RSS[s*APlength-AP][6] = 'none' 91 | RSS[s*APlength-AP][7] = 'none' 92 | RSS[s*APlength-AP][8] = 'none' 93 | RSS[s*APlength-AP][9] = 'none' 94 | RSS[s*APlength-AP][10] = 'none' 95 | RSS[s*APlength-AP][11] = 'none' 96 | RSS[s*APlength-AP][12] = 'none' 97 | RSS[s*APlength-AP][13] = '-110' 98 | RSS[s*APlength-AP][14] = 'none' 99 | RSS[s*APlength-AP][15] = 'none' 100 | RSS[s*APlength-AP][16] = 'none' 101 | RSS[s*APlength-AP][18] = 'none' 102 | 103 | with open(FileName_last, 'r', newline='') as csvfile: 104 | reader = csv.reader(csvfile) 105 | RSS_old = [row for row in reader] 106 | samples_old = int((len(RSS_old)-1) / APlength) 107 | 108 | #print(samples_old*APlength-(APlength-1)) 109 | x =0 110 | for AP in range(APlength-1,-1,-1): 111 | #print(RSS[APlength-AP][0]) 112 | if RSS[APlength-AP][16] != 'none' and RSS_old[(samples_old)*APlength-AP][14] != 'none': 113 | if float(RSS[APlength-AP][14]) == float(RSS_old[(samples_old)*APlength-AP][14]) and float(RSS[APlength-AP][15]) == float(RSS_old[(samples_old)*APlength-AP][15]) and float(RSS[APlength-AP][16]) == float(RSS_old[(samples_old)*APlength-AP][16]) or RSS[APlength-AP][1]=='surf' or RSS[APlength-AP][1]=='SURF': 114 | RSS[APlength-AP][6] = 'none' 115 | RSS[APlength-AP][7] = 'none' 116 | RSS[APlength-AP][8] = 'none' 117 | RSS[APlength-AP][9] = 'none' 118 | RSS[APlength-AP][10] = 'none' 119 | RSS[APlength-AP][11] = 'none' 120 | RSS[APlength-AP][12] = 'none' 121 | RSS[APlength-AP][13] = '-110' 122 | RSS[APlength-AP][14] = 'none' 123 | RSS[APlength-AP][15] = 'none' 124 | RSS[APlength-AP][16] = 'none' 125 | RSS[APlength-AP][18] = 'none' 126 | 127 | 128 | with open(FileName_new, 'w', newline='') as csvfile: 129 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 130 | 131 | for i in range(len(RSS)): 132 | data = ([ 133 | RSS[i][0], RSS[i][1], RSS[i][2], RSS[i][3], RSS[i][4], RSS[i][5], RSS[i][6], RSS[i][7], RSS[i][8], RSS[i][9], RSS[i][10], RSS[i][11], RSS[i][12], RSS[i][13], RSS[i][14], RSS[i][15], RSS[i][16], RSS[i][17], RSS[i][18] 134 | ]) 135 | spamwriter.writerow(data) 136 | 137 | def delete_repetition_fistFile(FileName_this, FileName_new): 138 | with open('mapping.csv', 'r', newline='') as csvfile: 139 | reader = csv.reader(csvfile) 140 | APs = [row for row in reader] 141 | APlength = len(APs) - 1 142 | 143 | with open(FileName_this, 'r', newline='') as csvfile: 144 | reader = csv.reader(csvfile) 145 | RSS = [row for row in reader] 146 | samples = int((len(RSS)-1) / APlength) 147 | print('samples:',samples) 148 | print(samples*APlength+1) 149 | 150 | 151 | for s in range(samples,0,-1): 152 | for AP in range(APlength-1,-1,-1): 153 | if RSS[s*APlength-AP][14] == RSS[(s-1)*APlength-AP][14] and RSS[s*APlength-AP][15] == RSS[(s-1)*APlength-AP][15] and RSS[s*APlength-AP][16] == RSS[(s-1)*APlength-AP][16] or RSS[s*APlength-AP][1]=='surf' or RSS[s*APlength-AP][1]=='SURF': 154 | RSS[s*APlength-AP][6] = 'none' 155 | RSS[s*APlength-AP][7] = 'none' 156 | RSS[s*APlength-AP][8] = 'none' 157 | RSS[s*APlength-AP][9] = 'none' 158 | RSS[s*APlength-AP][10] = 'none' 159 | RSS[s*APlength-AP][11] = 'none' 160 | RSS[s*APlength-AP][12] = 'none' 161 | RSS[s*APlength-AP][13] = '-110' 162 | RSS[s*APlength-AP][14] = 'none' 163 | RSS[s*APlength-AP][15] = 'none' 164 | RSS[s*APlength-AP][16] = 'none' 165 | RSS[s*APlength-AP][18] = 'none' 166 | 167 | 168 | 169 | with open(FileName_new, 'w', newline='') as csvfile: 170 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 171 | 172 | for i in range(len(RSS)): 173 | data = ([ 174 | RSS[i][0], RSS[i][1], RSS[i][2], RSS[i][3], RSS[i][4], RSS[i][5], RSS[i][6], RSS[i][7], RSS[i][8], RSS[i][9], RSS[i][10], RSS[i][11], RSS[i][12], RSS[i][13], RSS[i][14], RSS[i][15], RSS[i][16], RSS[i][17], RSS[i][18] 175 | ]) 176 | spamwriter.writerow(data) 177 | 178 | if __name__ == "__main__": 179 | 180 | 181 | 182 | delete_repetition(FILE_dif_direc_old,FILE_15_old,FILE_dif_direc_new) 183 | delete_repetition(FILE_15_old,FILE_14_old,FILE_15_new) 184 | delete_repetition(FILE_14_old,FILE_13_old,FILE_14_new) 185 | delete_repetition(FILE_13_old,FILE_12_old,FILE_13_new) 186 | delete_repetition(FILE_12_old,FILE_11_old,FILE_12_new) 187 | delete_repetition(FILE_11_old,FILE_10_old,FILE_11_new) 188 | delete_repetition(FILE_10_old,FILE_9_old,FILE_10_new) 189 | delete_repetition(FILE_9_old,FILE_8_old,FILE_9_new) 190 | delete_repetition(FILE_8_old,FILE_7_old,FILE_8_new) 191 | delete_repetition(FILE_7_old,FILE_6_old,FILE_7_new) 192 | delete_repetition(FILE_6_old,FILE_5_old,FILE_6_new) 193 | delete_repetition(FILE_5_old,FILE_4_old,FILE_5_new) 194 | delete_repetition(FILE_4_old,FILE_3_old,FILE_4_new) 195 | delete_repetition(FILE_3_old,FILE_2_old,FILE_3_new) 196 | delete_repetition(FILE_2_old,FILE_1_old,FILE_2_new) 197 | delete_repetition(FILE_1_old,FILE_0_old,FILE_1_new) 198 | delete_repetition_fistFile(FILE_0_old,FILE_0_new) 199 | 200 | delete_repetition(FILE_mix_4_old,FILE_mix_3_old,FILE_mix_4_new) 201 | delete_repetition(FILE_mix_3_old,FILE_mix_2_old,FILE_mix_3_new) 202 | delete_repetition(FILE_mix_2_old,FILE_mix_1_old,FILE_mix_2_new) 203 | delete_repetition(FILE_mix_1_old,FILE_mix_0_old,FILE_mix_1_new) 204 | delete_repetition_fistFile(FILE_mix_0_old,FILE_mix_0_new) 205 | 206 | 207 | ''' 208 | with open('mapping.csv', 'r', newline='') as csvfile: 209 | reader = csv.reader(csvfile) 210 | APs = [row for row in reader] 211 | APlength = len(APs) - 1 212 | 213 | with open('15_xxx_0_5_4f.csv', 'r', newline='') as csvfile: 214 | reader = csv.reader(csvfile) 215 | RSS = [row for row in reader] 216 | samples = int((len(RSS)-1) / APlength) 217 | print('samples:',samples) 218 | print(samples*APlength+1) 219 | 220 | 221 | for s in range(samples,0,-1): 222 | for AP in range(APlength-1,-1,-1): 223 | if RSS[s*APlength-AP][14] == RSS[(s-1)*APlength-AP][14] and RSS[s*APlength-AP][15] == RSS[(s-1)*APlength-AP][15] and RSS[s*APlength-AP][16] == RSS[(s-1)*APlength-AP][16]: 224 | RSS[s*APlength-AP][6] = 'none' 225 | RSS[s*APlength-AP][7] = 'none' 226 | RSS[s*APlength-AP][8] = 'none' 227 | RSS[s*APlength-AP][9] = 'none' 228 | RSS[s*APlength-AP][10] = 'none' 229 | RSS[s*APlength-AP][11] = 'none' 230 | RSS[s*APlength-AP][12] = 'none' 231 | RSS[s*APlength-AP][13] = '-110' 232 | RSS[s*APlength-AP][14] = 'none' 233 | RSS[s*APlength-AP][15] = 'none' 234 | RSS[s*APlength-AP][16] = 'none' 235 | RSS[s*APlength-AP][18] = 'none' 236 | 237 | with open(FILE_15_new, 'w', newline='') as csvfile: 238 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 239 | spamwriter.writerow(['BSSID', 'SSID','Building', 'Floor','Location_x', 'Location_y', 'Frequency','AccX','AccY','AccZ', 'ORIx','ORIy','ORIz','Level', 'GeoX','GeoY','GeoZ', 'Model','Time']) 240 | 241 | for i in range(len(RSS)): 242 | data = ([ 243 | RSS[i][0], RSS[i][1], RSS[i][2], RSS[i][3], RSS[i][4], RSS[i][5], RSS[i][6], RSS[i][7], RSS[i][8], RSS[i][9], RSS[i][10], RSS[i][11], RSS[i][12], RSS[i][13], RSS[i][14], RSS[i][15], RSS[i][16], RSS[i][17], RSS[i][18] 244 | ]) 245 | spamwriter.writerow(data) 246 | ''' 247 | -------------------------------------------------------------------------------- /server/construct_ipin.py: -------------------------------------------------------------------------------- 1 | import csv 2 | import pandas as pd 3 | import numpy as np 4 | PYTHONIOENCODING="UTF-8" #set the utf-8 encode mode 5 | 6 | 7 | FileName0 = '0_new_0_1_5E_39.csv' 8 | FileName0_after = 'dataset_0.csv' 9 | 10 | FileName1 = '1_new_0_1_5SW.csv' 11 | FileName1_after = 'dataset_1.csv' 12 | 13 | FileName2 = '2_new_0_2_0_3_5f.csv' 14 | FileName2_after = 'dataset_2.csv' 15 | 16 | FileName3 = '3_new_0_4_5f.csv' 17 | FileName3_after = 'dataset_3.csv' 18 | 19 | FileName4 = '4_new_0_5_5f.csv' 20 | FileName4_after = 'dataset_4.csv' 21 | 22 | FileName5 = '5_new_0_6_5f.csv' 23 | FileName5_after = 'dataset_5.csv' 24 | 25 | FileName6 = '6_new_0_7_5f.csv' 26 | FileName6_after = 'dataset_6.csv' 27 | 28 | FileName7 = '7_new_0_8_5f.csv' 29 | FileName7_after = 'dataset_7.csv' 30 | 31 | FileName8 = '8_new_0_9_5f.csv' 32 | FileName8_after = 'dataset_8.csv' 33 | 34 | FileName9 = '9_new_0_10_5f.csv' 35 | FileName9_after = 'dataset_9.csv' 36 | 37 | FileName10 = '10_new_0_11_5f.csv' 38 | FileName10_after = 'dataset_10.csv' 39 | 40 | FileName11 = '11_new_0_12_5f.csv' 41 | FileName11_after = 'dataset_11.csv' 42 | 43 | FileName12 = '12_new_0_0_1_4f.csv' 44 | FileName12_after = 'dataset_12.csv' 45 | 46 | FileName13 = '13_new_0_2_4f.csv' 47 | FileName13_after = 'dataset_13.csv' 48 | 49 | FileName14 = '14_new_0_3_4_5f.csv' 50 | FileName14_after = 'dataset_14.csv' 51 | 52 | FileName15 = '15_new_0_5_4f.csv' 53 | FileName15_after = 'dataset_15.csv' 54 | 55 | datasetOri = 'new_diff-direction-0_5_4f.csv' 56 | datasetOri_after = 'datasetOri.csv' 57 | 58 | 59 | datasetMix0 = 'MIX2_0_new_0_0_1_4f.csv' 60 | datasetMix0_after = 'datasetMix_0.csv' 61 | 62 | datasetMix1 = 'MIX2_1_new_0_2_4f.csv' 63 | datasetMix1_after = 'datasetMix_1.csv' 64 | 65 | datasetMix2 = 'MIX2_2_new_0_3-S27_4f.csv' 66 | datasetMix2_after = 'datasetMix_2.csv' 67 | 68 | datasetMix3 = 'MIX2_3_new_0_4_4f.csv' 69 | datasetMix3_after = 'datasetMix_3.csv' 70 | 71 | datasetMix4 = 'MIX2_4_new_0_5_4f.csv' 72 | datasetMix4_after = 'datasetMix_4.csv' 73 | 74 | dataset0 = pd.read_csv('0_new_0_1_5E_39.csv', header = 0) 75 | dataset1 = pd.read_csv('1_new_0_1_5SW.csv', header = 0) 76 | dataset2 = pd.read_csv('2_new_0_2_0_3_5f.csv', header = 0) 77 | dataset3 = pd.read_csv('3_new_0_4_5f.csv', header = 0) 78 | dataset4 = pd.read_csv('4_new_0_5_5f.csv', header = 0) 79 | dataset5 = pd.read_csv('5_new_0_6_5f.csv', header = 0) 80 | dataset6 = pd.read_csv('6_new_0_7_5f.csv', header = 0) 81 | dataset7 = pd.read_csv('7_new_0_8_5f.csv', header = 0) 82 | dataset8 = pd.read_csv('8_new_0_9_5f.csv', header = 0) 83 | dataset9 = pd.read_csv('9_new_0_10_5f.csv', header = 0) 84 | dataset10 = pd.read_csv('10_new_0_11_5f.csv', header = 0) 85 | dataset11 = pd.read_csv('11_new_0_12_5f.csv', header = 0) 86 | dataset12 = pd.read_csv('12_new_0_0_1_4f.csv', header = 0) 87 | dataset13 = pd.read_csv('13_new_0_2_4f.csv', header = 0) 88 | dataset14 = pd.read_csv('14_new_0_3_4_5f.csv', header = 0) 89 | dataset15 = pd.read_csv('15_new_0_5_4f.csv', header = 0) 90 | 91 | 92 | ''' 93 | with open('MIX2_0_new_0_0_1_4f.csv', 'r', newline='') as csvfile: 94 | reader = csv.reader(csvfile) 95 | RSS = [row for row in reader] 96 | print(len(RSS)) 97 | ''' 98 | ''' 99 | with open('2_new_0_2_0_3_5f.csv', 'r', newline='') as csvfile: 100 | reader = csv.reader(csvfile) 101 | RSS = [row for row in reader] 102 | print(len(RSS)) 103 | with open('2_new_0_2_0_3_5f_new.csv', 'w', newline='') as csvfile: 104 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 105 | #edition3 106 | for row in range(0,188857): 107 | data = ([ 108 | RSS[row][0], RSS[row][1], RSS[row][2], RSS[row][3], RSS[row][4], RSS[row][5], RSS[row][6], RSS[row][7], RSS[row][8], RSS[row][9], RSS[row][10], RSS[row][11], RSS[row][12], RSS[row][13], RSS[row][14], RSS[row][15], RSS[row][16], RSS[row][17], RSS[row][18] 109 | ]) 110 | spamwriter.writerow(data) 111 | ''' 112 | 113 | FileName_Total = 'Total.csv' 114 | 115 | def concataneate1Files(FileName_Original,FileName_new = FileName_Total): 116 | 117 | x = [] 118 | with open(FileName_Original, 'r', newline='') as csvfile: 119 | reader = csv.reader(csvfile) 120 | RSS = [row for row in reader] 121 | RSS = np.asarray(RSS) 122 | with open(FileName_new, 'a', newline='') as csvfile: 123 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 124 | 125 | for row in range(len(RSS)): 126 | for column in range(RSS.shape[1]): 127 | x.append(RSS[row][column]) 128 | #x = ([ 129 | # RSS[row][0], RSS[row][1], RSS[row][2], RSS[row][3], RSS[row][4], RSS[row][5], RSS[row][6], RSS[row][7], RSS[row][8], RSS[row][9], RSS[row][10], RSS[row][11], RSS[row][12], RSS[row][13], RSS[row][14], RSS[row][15], RSS[row][16], RSS[row][17], RSS[row][18] 130 | #]) 131 | 132 | spamwriter.writerow(x) 133 | x = [] 134 | 135 | def concataneate2Files(FileName_Original,FileName_addition,FileName_new = FileName_Total): 136 | 137 | x = [] 138 | with open(FileName_Original, 'r', newline='') as csvfile: 139 | reader = csv.reader(csvfile) 140 | RSS_Ori = [row for row in reader] 141 | 142 | with open(FileName_addition, 'r', newline='') as csvfile: 143 | reader = csv.reader(csvfile) 144 | RSS_Add = [row for row in reader] 145 | 146 | with open(FileName_new, 'a', newline='') as csvfile: 147 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 148 | RSS = np.vstack((RSS_Ori,RSS_Add)) 149 | print(RSS.shape[1]) 150 | print('type:',type(RSS)) 151 | 152 | for row in range(len(RSS)): 153 | for column in range(RSS.shape[1]): 154 | x.append(RSS[row][column]) 155 | #x = ([ 156 | # RSS[row][0], RSS[row][1], RSS[row][2], RSS[row][3], RSS[row][4], RSS[row][5], RSS[row][6], RSS[row][7], RSS[row][8], RSS[row][9], RSS[row][10], RSS[row][11], RSS[row][12], RSS[row][13], RSS[row][14], RSS[row][15], RSS[row][16], RSS[row][17], RSS[row][18] 157 | #]) 158 | 159 | spamwriter.writerow(x) 160 | x = [] 161 | 162 | 163 | 164 | ''' 165 | datasetOri = pd.read_csv(FileName_Original, header = 0) 166 | datasetAdd = pd.read_csv(FileName_addition, header = 0) 167 | frames = np.vstack((datasetOri,datasetAdd)) 168 | frames = pd.DataFrame(frames) 169 | #Ori = pd.DataFrame(datasetOri) 170 | #Add = pd.DataFrame(datasetAdd) 171 | new = pd.concat([frames],ignore_index=True,sort=False) 172 | 173 | print(new.shape) 174 | new.to_csv(FileName_new, header = 0) 175 | ''' 176 | ''' 177 | concataneate2Files(FileName0_after,FileName1_after) 178 | concataneate2Files(FileName2_after,FileName3_after) 179 | concataneate2Files(FileName4_after,FileName5_after) 180 | concataneate2Files(FileName6_after,FileName7_after) 181 | concataneate2Files(FileName8_after,FileName9_after) 182 | concataneate2Files(FileName10_after,FileName11_after) 183 | concataneate2Files(FileName12_after,FileName13_after) 184 | concataneate2Files(FileName14_after,FileName15_after) 185 | ''' 186 | 187 | ''' 188 | concataneate2Files(datasetMix0_after,datasetMix1_after) 189 | concataneate2Files(datasetMix2_after,datasetMix3_after) 190 | concataneate1Files(datasetMix4_after) 191 | ''' 192 | concataneate1Files(datasetMix4_after) 193 | 194 | 195 | def contructDataset(FileName,FileName_after, isHead): 196 | dataset = pd.read_csv(FileName, header = 0) 197 | print('length:',len(dataset)) 198 | RSS = np.asarray(dataset.ix[:, 13]) 199 | if(isHead ==1): 200 | head = [] 201 | for i in range(516): 202 | if(i<10): 203 | head.append('WAP00'+str(i)) 204 | elif(i<100): 205 | head.append('WAP0'+str(i)) 206 | else: 207 | head.append('WAP'+str(i)) 208 | head.append('Loc_x') 209 | head.append('Loc_y') 210 | head.append('Floor') 211 | head.append('Building') 212 | head.append('Model') 213 | head.append('TimeStamp') 214 | head.append('GeoX') 215 | head.append('GeoY') 216 | head.append('GeoZ') 217 | head.append('AccX') 218 | head.append('AccY') 219 | head.append('AccZ') 220 | head.append('OriX') 221 | head.append('GriY') 222 | head.append('GriZ') 223 | 224 | inertia = [] 225 | GeoX = 0 226 | GeoY = 0 227 | GeoZ = 0 228 | AccX = 0 229 | AccY = 0 230 | AccZ = 0 231 | OriX = 0 232 | OriY = 0 233 | OriZ = 0 234 | APnumber = 0 235 | for i in range(len(RSS)): 236 | if dataset.ix[i,14] != 'none': 237 | APnumber += 1 238 | GeoX += float(dataset.ix[i,14]) 239 | GeoY += float(dataset.ix[i,15]) 240 | GeoZ += float(dataset.ix[i,16]) 241 | AccX += float(dataset.ix[i,7]) 242 | AccY += float(dataset.ix[i,8]) 243 | AccZ += float(dataset.ix[i,9]) 244 | OriX += float(dataset.ix[i,10]) 245 | OriY += float(dataset.ix[i,11]) 246 | OriZ += float(dataset.ix[i,12]) 247 | if (i+1) % 516 == 0: 248 | if APnumber != 0: 249 | GeoX = GeoX/APnumber 250 | GeoY = GeoY/APnumber 251 | GeoZ = GeoZ/APnumber 252 | AccX = AccX/APnumber 253 | AccY = AccY/APnumber 254 | AccZ = AccZ/APnumber 255 | OriX = OriX/APnumber 256 | OriY = OriY/APnumber 257 | OriZ = OriZ/APnumber 258 | inertia.append(GeoX) 259 | inertia.append(GeoY) 260 | inertia.append(GeoZ) 261 | inertia.append(AccX) 262 | inertia.append(AccY) 263 | inertia.append(AccZ) 264 | inertia.append(OriX) 265 | inertia.append(OriY) 266 | inertia.append(OriZ) 267 | GeoX = 0 268 | GeoY = 0 269 | GeoZ = 0 270 | AccX = 0 271 | AccY = 0 272 | AccZ = 0 273 | OriX = 0 274 | OriY = 0 275 | OriZ = 0 276 | APnumber = 0 277 | 278 | labels = [] 279 | for i in range(len(RSS)): 280 | if (i+1) % 516 == 0: 281 | labels.append(dataset.ix[i,4]) 282 | labels.append(dataset.ix[i,5]) 283 | labels.append(dataset.ix[i,3]) 284 | labels.append(dataset.ix[i,2]) 285 | labels.append(dataset.ix[i,17]) 286 | labels.append(dataset.ix[i,18]) 287 | 288 | RSS = RSS.reshape([int(RSS.shape[0]/516), 516]) 289 | labels = np.asarray(labels).reshape([int(len(labels)/6), 6]) 290 | inertia = np.asarray(inertia).reshape([int(len(inertia)/9), 9]) 291 | 292 | dataset = np.hstack((np.hstack((RSS, labels)),inertia)) 293 | print(dataset.shape) 294 | 295 | new = pd.DataFrame(dataset) 296 | 297 | if(isHead == 1): 298 | new.to_csv(FileName_after, header = head[:]) 299 | elif(isHead == 0): 300 | new.to_csv(FileName_after, header = 0) 301 | 302 | ''' 303 | contructDataset(FileName0,FileName0_after,isHead = 1) 304 | contructDataset(FileName1,FileName1_after,isHead = 0) 305 | contructDataset(FileName2,FileName2_after,isHead = 0) 306 | contructDataset(FileName3,FileName3_after,isHead = 0) 307 | contructDataset(FileName4,FileName4_after,isHead = 0) 308 | contructDataset(FileName5,FileName5_after,isHead = 0) 309 | contructDataset(FileName6,FileName6_after,isHead = 0) 310 | contructDataset(FileName7,FileName7_after,isHead = 0) 311 | contructDataset(FileName8,FileName8_after,isHead = 0) 312 | contructDataset(FileName9,FileName9_after,isHead = 0) 313 | contructDataset(FileName10,FileName10_after,isHead = 0) 314 | contructDataset(FileName11,FileName11_after,isHead = 0) 315 | contructDataset(FileName12,FileName12_after,isHead = 0) 316 | contructDataset(FileName13,FileName13_after,isHead = 0) 317 | contructDataset(FileName14,FileName14_after,isHead = 0) 318 | contructDataset(FileName15,FileName15_after,isHead = 0) 319 | contructDataset(datasetOri,datasetOri_after,isHead = 1) 320 | contructDataset(datasetMix0,datasetMix0_after,isHead = 1) 321 | contructDataset(datasetMix1,datasetMix1_after,isHead = 0) 322 | contructDataset(datasetMix2,datasetMix2_after,isHead = 0) 323 | contructDataset(datasetMix3,datasetMix3_after,isHead = 0) 324 | contructDataset(datasetMix4,datasetMix4_after,isHead = 0) 325 | ''' 326 | #print(dataset[:, -1]) 327 | 328 | 329 | 330 | 331 | '''with open('APs.csv', 'w', newline='') as csvfile: 332 | if not os.path.getsize('./APs.csv'): 333 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 334 | spamwriter.writerow([ 'BSSID','SSID','Building', 'Floor','Location_x', 'Location_y','Frequency','AccX','AccY','AccZ','ORIx','ORIy','ORIz','Level','GeoX','GeoY','GeoZ']) 335 | 336 | ''' -------------------------------------------------------------------------------- /server/mapping.csv: -------------------------------------------------------------------------------- 1 | 44:6a:2e:09:c6:81,43 2 | 44:6a:2e:09:f4:90,261 3 | 44:6a:2e:09:d2:d0,262 4 | a4:c6:4f:d5:df:30,263 5 | 44:6a:2e:09:d6:20,264 6 | 44:6a:2e:09:c0:c0,0 7 | 00:06:f4:b8:12:30,1 8 | 44:6a:2e:09:c1:c1,2 9 | 44:6a:2e:07:41:91,265 10 | 44:6a:2e:09:f7:01,3 11 | 00:06:f4:b8:0f:a1,4 12 | 56:e4:bd:bd:02:45,5 13 | 44:6a:2e:09:c7:b0,6 14 | 44:6a:2e:09:c0:30,7 15 | 44:6a:2e:09:d6:e0,268 16 | 44:6a:2e:09:d2:c0,270 17 | 44:6a:2e:09:f4:a1,269 18 | a4:c6:4f:d5:fa:c1,9 19 | 00:06:f4:b8:1a:70,272 20 | 44:6a:2e:09:d7:c1,274 21 | 44:6a:2e:09:f2:71,10 22 | 44:6a:2e:07:33:f1,275 23 | 44:6a:2e:09:f4:81,11 24 | 00:06:f4:b8:0f:90,276 25 | 24:4c:07:00:d9:80,277 26 | 44:6a:2e:09:c3:a0,278 27 | 44:6a:2e:07:42:c0,385 28 | 00:06:f4:b8:1b:10,12 29 | 44:6a:2e:09:d2:81,279 30 | 44:6a:2e:07:40:01,280 31 | 44:6a:2e:07:41:90,281 32 | 44:6a:2e:09:f6:20,282 33 | 44:6a:2e:07:40:91,13 34 | 44:6a:2e:09:c5:c1,14 35 | 00:06:f4:b8:1b:c0,15 36 | 44:6a:2e:09:bf:11,16 37 | 00:06:f4:b8:11:41,284 38 | 44:6a:2e:09:c4:81,285 39 | 00:36:76:5e:d2:39,17 40 | 00:06:f4:b8:0f:91,18 41 | 44:6a:2e:09:c4:60,481 42 | 44:6a:2e:09:c1:41,287 43 | 44:6a:2e:09:c2:71,443 44 | 44:6a:2e:09:c0:01,388 45 | 44:6a:2e:09:c4:f1,20 46 | a4:c6:4f:d5:ef:b1,288 47 | 00:06:f4:b8:1a:91,174 48 | 44:6a:2e:09:f7:d1,21 49 | 44:6a:2e:07:43:91,22 50 | 44:6a:2e:07:40:50,379 51 | 44:6a:2e:09:c5:d1,23 52 | 44:6a:2e:09:c7:a0,24 53 | 44:6a:2e:09:f2:a0,291 54 | b0:d5:9d:ce:aa:37,292 55 | 44:6a:2e:07:14:80,293 56 | 44:6a:2e:09:d6:f0,25 57 | 44:6a:2e:09:c4:b1,26 58 | 44:6a:2e:07:14:a0,445 59 | 44:6a:2e:07:40:90,294 60 | 44:6a:2e:07:3b:b0,357 61 | 00:06:f4:b8:17:f0,27 62 | 44:6a:2e:09:c0:c1,28 63 | ac:4e:91:61:21:01,29 64 | 44:6a:2e:09:c3:a1,415 65 | a4:c6:4f:d5:fb:61,347 66 | 44:6a:2e:09:f1:c0,30 67 | 44:6a:2e:07:14:90,31 68 | 44:6a:2e:09:f6:31,33 69 | 44:6a:2e:07:36:50,296 70 | a4:c6:4f:d5:fb:01,298 71 | 44:6a:2e:07:43:00,299 72 | 44:6a:2e:07:33:e1,300 73 | 44:6a:2e:09:f2:00,34 74 | ac:4e:91:61:21:00,35 75 | 44:6a:2e:07:41:41,36 76 | 00:06:f4:b8:20:51,37 77 | 44:6a:2e:09:be:60,302 78 | 44:6a:2e:09:f1:60,303 79 | 00:06:f4:b8:17:30,266 80 | 00:06:f4:b8:12:e1,38 81 | 44:6a:2e:09:c6:51,41 82 | 44:6a:2e:09:f4:a0,40 83 | 44:6a:2e:09:d7:61,42 84 | 44:6a:2e:09:f5:11,484 85 | 44:6a:2e:09:c5:c0,306 86 | 28:f3:66:a7:b0:70,307 87 | 44:6a:2e:09:f4:91,44 88 | ac:4e:91:61:1f:c1,45 89 | 44:6a:2e:09:d2:d1,46 90 | 44:6a:2e:09:f5:60,47 91 | 44:6a:2e:09:c6:50,48 92 | 44:6a:2e:09:c2:a1,49 93 | 00:06:f4:b8:16:d0,512 94 | 44:6a:2e:09:f5:e1,51 95 | 44:6a:2e:09:f1:40,309 96 | 44:6a:2e:09:c2:b0,498 97 | 44:6a:2e:09:f5:d0,52 98 | 00:06:f4:b8:1a:90,310 99 | 44:6a:2e:09:f2:c1,234 100 | 84:a9:c4:ef:fb:2b,312 101 | 44:6a:2e:07:3b:a1,53 102 | 00:06:f4:b8:1c:10,314 103 | 44:6a:2e:09:f6:b0,54 104 | a4:c6:4f:d5:b1:d0,55 105 | 44:6a:2e:00:fa:a0,56 106 | 00:06:f4:b8:11:20,315 107 | 44:6a:2e:09:f5:f0,267 108 | 00:06:f4:b8:49:30,57 109 | 44:6a:2e:09:bf:60,316 110 | 00:06:f4:b8:1b:b1,58 111 | 84:a9:c4:ef:fb:4b,59 112 | 44:6a:2e:09:f6:41,317 113 | a4:c6:4f:d5:fb:71,505 114 | 44:6a:2e:09:ef:21,319 115 | 44:6a:2e:09:c4:91,320 116 | a4:c6:4f:d5:a6:61,321 117 | 00:ec:0a:7b:b9:10,322 118 | 44:6a:2e:09:d6:b0,323 119 | 00:06:f4:b8:11:11,8 120 | 44:6a:2e:09:f6:51,60 121 | 44:6a:2e:09:f7:41,486 122 | 44:6a:2e:07:3f:b0,324 123 | 44:6a:2e:07:3b:a0,451 124 | bc:d1:77:5c:11:c0,273 125 | 44:6a:2e:09:f1:81,325 126 | 44:6a:2e:09:f4:b1,61 127 | 44:6a:2e:09:f6:b1,326 128 | 44:6a:2e:09:f5:61,62 129 | 44:6a:2e:09:c6:21,63 130 | b4:0f:3b:9d:3f:28,64 131 | a4:c6:4f:d5:fa:f0,65 132 | 44:6a:2e:09:d8:71,66 133 | 44:6a:2e:09:f8:30,328 134 | 00:06:f4:b8:0f:a0,329 135 | 44:6a:2e:09:e9:40,331 136 | 44:6a:2e:09:c5:90,332 137 | 00:06:f4:b8:1a:81,67 138 | 44:6a:2e:09:c0:21,68 139 | 44:6a:2e:09:f0:e1,70 140 | 56:e4:bd:be:90:79,71 141 | 44:6a:2e:09:c5:91,72 142 | 44:6a:2e:07:3f:a0,73 143 | 00:06:f4:b8:11:10,334 144 | 44:6a:2e:09:f8:21,74 145 | a4:c6:4f:d5:b1:d1,510 146 | 00:06:f4:b8:1c:11,75 147 | 44:6a:2e:09:c1:b0,76 148 | 8c:25:05:d6:fa:6d,77 149 | 44:6a:2e:09:f6:81,78 150 | 44:6a:2e:09:f6:80,79 151 | a4:c6:4f:d5:df:20,80 152 | 44:6a:2e:07:41:b1,81 153 | 44:6a:2e:07:41:a0,82 154 | 44:6a:2e:09:f2:11,455 155 | 44:6a:2e:07:0f:d1,489 156 | 44:6a:2e:09:c2:a0,83 157 | a4:c6:4f:d5:fa:90,84 158 | 44:6a:2e:09:bd:d0,85 159 | 44:6a:2e:09:c3:b1,338 160 | 44:6a:2e:09:c4:f0,318 161 | 44:6a:2e:09:c6:40,339 162 | 44:6a:2e:09:f5:00,340 163 | 84:a9:c4:f0:01:6b,341 164 | 44:6a:2e:09:c7:a1,86 165 | 44:6a:2e:09:f2:10,87 166 | 44:6a:2e:09:d2:80,352 167 | a4:c6:4f:d5:fa:b1,88 168 | 44:6a:2e:09:f6:90,417 169 | 44:6a:2e:09:f2:c0,343 170 | 44:6a:2e:07:40:40,243 171 | 44:6a:2e:07:0f:c0,344 172 | 28:f3:66:a7:c3:4e,39 173 | 44:6a:2e:09:c4:d1,345 174 | 44:6a:2e:09:c0:e0,89 175 | 44:6a:2e:09:d5:c1,346 176 | 00:06:f4:b8:2a:50,90 177 | 44:6a:2e:09:c4:e1,468 178 | 44:6a:2e:07:40:51,399 179 | 44:6a:2e:09:c0:31,92 180 | 00:06:f4:b8:1b:21,93 181 | 44:6a:2e:09:f3:a1,94 182 | 44:6a:2e:09:c0:f1,111 183 | a4:c6:4f:d5:fa:a1,456 184 | 44:6a:2e:09:f7:11,95 185 | 44:6a:2e:09:f2:a1,348 186 | 44:6a:2e:09:f7:50,349 187 | 44:6a:2e:09:d6:e1,350 188 | 44:6a:2e:07:3f:b1,96 189 | 44:6a:2e:09:f7:a0,97 190 | 44:6a:2e:09:d8:60,98 191 | a4:c6:4f:d5:fa:91,99 192 | a4:c6:4f:d5:fa:e1,101 193 | 44:6a:2e:07:41:40,351 194 | 44:6a:2e:09:f2:d0,405 195 | 44:6a:2e:09:c2:61,102 196 | 44:6a:2e:09:c4:b0,103 197 | 44:6a:2e:09:f7:10,354 198 | 44:6a:2e:09:d8:a0,104 199 | 44:6a:2e:09:f5:10,192 200 | 44:6a:2e:09:c4:51,137 201 | 44:6a:2e:09:c2:41,355 202 | 44:6a:2e:09:f1:b1,356 203 | 56:e4:bd:bc:d2:dd,406 204 | 44:6a:2e:09:c4:e0,106 205 | 00:06:f4:b8:49:f1,105 206 | 44:6a:2e:09:f1:91,108 207 | 00:06:f4:b8:1a:f0,109 208 | 44:6a:2e:09:f4:00,195 209 | 44:6a:2e:09:c4:20,358 210 | 44:6a:2e:09:f1:a0,112 211 | 44:6a:2e:09:f6:91,458 212 | 44:6a:2e:09:d5:c0,114 213 | 00:06:f4:b8:4f:b0,382 214 | 44:6a:2e:09:d8:a1,360 215 | a4:c6:4f:d5:fb:70,361 216 | 44:6a:2e:09:c3:b0,362 217 | 44:6a:2e:09:d9:40,107 218 | 44:6a:2e:07:14:b1,115 219 | 9e:2e:a1:54:19:8f,116 220 | 44:6a:2e:09:be:61,117 221 | 00:06:f4:b8:49:f0,283 222 | 44:6a:2e:09:c5:41,118 223 | 00:06:f4:b8:4a:01,119 224 | 44:6a:2e:09:f7:c0,365 225 | 44:6a:2e:09:bf:01,110 226 | 44:6a:2e:09:f4:41,121 227 | 44:6a:2e:09:e9:51,367 228 | 88:25:93:3a:c1:76,122 229 | 44:6a:2e:09:f8:20,176 230 | 44:6a:2e:09:c4:a1,369 231 | 44:6a:2e:09:f2:d1,123 232 | 44:6a:2e:09:bf:71,124 233 | 44:6a:2e:07:0f:c1,125 234 | 44:6a:2e:09:c4:70,126 235 | 44:6a:2e:09:c4:71,127 236 | 44:6a:2e:09:d6:a0,286 237 | 44:6a:2e:09:f5:c0,128 238 | 44:6a:2e:09:c4:d0,371 239 | 44:6a:2e:09:c4:40,129 240 | 44:6a:2e:09:c0:e1,130 241 | 44:6a:2e:09:f5:c1,413 242 | 44:6a:2e:09:c0:00,372 243 | 44:6a:2e:09:bf:10,131 244 | 44:6a:2e:09:f0:e0,374 245 | 44:6a:2e:09:d6:81,480 246 | 44:6a:2e:09:c1:b1,132 247 | 44:6a:2e:09:f8:01,133 248 | 02:28:f8:0e:47:c3,375 249 | 44:6a:2e:09:c6:20,19 250 | 44:6a:2e:09:f8:b0,376 251 | 44:6a:2e:09:bf:61,377 252 | 00:06:f4:b8:11:31,178 253 | 44:6a:2e:09:d7:10,460 254 | 00:06:f4:b8:12:d0,134 255 | 44:6a:2e:09:c5:a1,135 256 | 44:6a:2e:07:14:91,136 257 | 44:6a:2e:09:f4:40,113 258 | 44:6a:2e:09:c0:20,138 259 | 44:6a:2e:09:c4:41,139 260 | 44:6a:2e:09:f5:d1,380 261 | 44:6a:2e:09:f1:20,359 262 | 44:6a:2e:09:f1:00,140 263 | 00:06:f4:b8:1a:71,327 264 | 00:06:f4:b8:12:10,384 265 | 44:6a:2e:09:c1:90,387 266 | 44:6a:2e:07:42:c1,141 267 | 00:06:f4:b8:12:21,389 268 | 44:6a:2e:09:f5:41,390 269 | a4:c6:4f:d5:b1:c0,363 270 | a4:c6:4f:d5:ef:a1,391 271 | 44:6a:2e:09:d2:c1,142 272 | 44:6a:2e:09:c7:c1,143 273 | 44:6a:2e:09:d7:d1,392 274 | 44:6a:2e:09:d2:91,393 275 | 44:6a:2e:09:f6:01,395 276 | 44:6a:2e:09:c6:90,144 277 | 00:06:f4:b8:1c:21,145 278 | 00:06:f4:b8:12:20,249 279 | a4:c6:4f:d5:ef:b0,397 280 | 44:6a:2e:09:c2:60,398 281 | 44:6a:2e:09:d7:11,146 282 | 44:6a:2e:00:fd:50,400 283 | 44:6a:2e:09:f8:b1,290 284 | 44:6a:2e:09:f2:b0,463 285 | 44:6a:2e:09:d7:60,401 286 | a4:c6:4f:d5:fa:d0,147 287 | 44:6a:2e:09:f2:01,330 288 | 44:6a:2e:09:bf:70,403 289 | 4c:e6:76:64:df:00,148 290 | ac:4e:91:61:21:80,404 291 | b0:d5:9d:d1:7e:bd,149 292 | 44:6a:2e:09:f1:61,394 293 | 00:06:f4:b8:1b:11,150 294 | 44:6a:2e:09:f6:40,407 295 | 44:6a:2e:09:c3:60,408 296 | a4:c6:4f:d5:a6:71,409 297 | 00:06:f4:b8:46:11,410 298 | 44:6a:2e:07:38:51,411 299 | 44:6a:2e:09:f0:f0,412 300 | 44:6a:2e:07:3b:90,418 301 | 44:6a:2e:09:c0:d0,414 302 | 44:6a:2e:09:f4:80,497 303 | 44:6a:2e:09:f7:51,151 304 | 44:6a:2e:09:bf:30,152 305 | 00:06:f4:b8:16:b0,153 306 | 44:6a:2e:07:36:41,416 307 | 50:64:2b:dd:cc:85,69 308 | 44:6a:2e:09:d9:41,120 309 | 44:6a:2e:07:43:80,419 310 | 44:6a:2e:09:c7:d1,154 311 | 44:6a:2e:00:fd:41,155 312 | 00:06:f4:b8:11:21,421 313 | 44:6a:2e:09:ef:31,422 314 | dc:fe:18:ac:ee:99,156 315 | 44:6a:2e:09:f5:f1,423 316 | 44:6a:2e:09:c6:91,420 317 | 44:6a:2e:09:f1:b0,424 318 | 44:6a:2e:09:bd:c0,425 319 | 44:6a:2e:07:14:b0,157 320 | 44:6a:2e:07:43:11,158 321 | 44:6a:2e:09:c3:61,308 322 | 44:6a:2e:09:d8:61,428 323 | 44:6a:2e:07:40:00,429 324 | 44:6a:2e:00:fa:a1,386 325 | 44:6a:2e:09:f8:61,431 326 | 44:6a:2e:09:c5:51,159 327 | 44:6a:2e:09:f2:e1,160 328 | 44:6a:2e:09:c3:f1,162 329 | 44:6a:2e:09:f1:41,163 330 | 44:6a:2e:09:c4:a0,164 331 | c4:f0:81:75:03:c9,433 332 | a4:c6:4f:d5:b1:c1,381 333 | a4:c6:4f:d5:ef:a0,165 334 | 44:6a:2e:09:f1:80,166 335 | 44:6a:2e:09:f4:b0,434 336 | 44:6a:2e:07:3b:80,435 337 | 44:6a:2e:09:d7:00,436 338 | 44:6a:2e:09:c4:90,368 339 | 44:6a:2e:09:f1:90,167 340 | 44:6a:2e:07:3b:b1,168 341 | 44:6a:2e:09:d9:01,169 342 | 00:06:f4:b8:11:30,439 343 | 44:6a:2e:09:d7:01,170 344 | 44:6a:2e:09:c1:80,172 345 | 44:6a:2e:01:11:50,441 346 | 44:6a:2e:09:c3:e1,452 347 | 42:49:0f:a3:09:a2,173 348 | 44:6a:2e:09:c5:d0,333 349 | 44:6a:2e:09:c5:a0,442 350 | 44:6a:2e:07:36:40,175 351 | 44:6a:2e:09:c5:b0,177 352 | 00:06:f4:b8:49:91,444 353 | 56:e4:bd:bc:f9:64,446 354 | 44:6a:2e:09:d7:c0,179 355 | 44:6a:2e:09:f4:01,447 356 | 44:6a:2e:09:bd:d1,370 357 | 00:06:f4:b8:20:d0,448 358 | 44:6a:2e:09:bf:31,449 359 | 44:6a:2e:09:f1:a1,180 360 | 44:6a:2e:09:d6:b1,450 361 | 28:f3:66:a7:c4:5e,426 362 | 00:06:f4:b8:2c:10,181 363 | 78:11:dc:39:d3:58,467 364 | 44:6a:2e:09:f6:00,50 365 | 44:6a:2e:09:c2:80,182 366 | 00:06:f4:b8:2a:51,183 367 | a4:c6:4f:d5:a6:70,184 368 | a6:ca:a0:22:e4:e9,185 369 | 44:6a:2e:09:f7:e0,454 370 | 44:6a:2e:07:3b:91,186 371 | d4:ee:07:4f:73:02,187 372 | 44:6a:2e:09:c0:d1,189 373 | 44:6a:2e:09:c2:81,457 374 | 44:6a:2e:07:40:80,289 375 | a4:c6:4f:d5:fa:c0,190 376 | 44:6a:2e:07:36:51,191 377 | 44:6a:2e:07:38:40,193 378 | 44:6a:2e:09:c5:40,194 379 | 00:06:f4:b8:18:00,427 380 | 44:6a:2e:09:f2:70,196 381 | 44:6a:2e:09:c4:c0,459 382 | 44:6a:2e:09:c5:b1,335 383 | 44:6a:2e:09:f8:71,461 384 | 44:6a:2e:07:40:81,197 385 | 44:6a:2e:09:f5:01,462 386 | 44:6a:2e:09:f8:11,198 387 | 44:6a:2e:09:c4:61,212 388 | 44:6a:2e:09:c6:80,464 389 | d4:50:3f:9c:1f:97,509 390 | 56:e4:bd:bc:fa:07,199 391 | 44:6a:2e:09:f6:a0,200 392 | 44:6a:2e:09:f8:10,466 393 | ac:4e:91:61:21:81,201 394 | 00:06:f4:b8:1c:20,202 395 | 44:6a:2e:07:14:81,203 396 | 28:f3:66:a7:c3:c0,205 397 | 44:6a:2e:09:c2:51,430 398 | a4:c6:4f:d5:fa:a0,313 399 | 44:6a:2e:09:f7:00,206 400 | 44:6a:2e:07:41:b0,207 401 | 44:6a:2e:09:f3:e1,208 402 | 44:6a:2e:09:c1:a0,209 403 | 44:6a:2e:09:c2:40,210 404 | 44:6a:2e:09:c4:80,211 405 | 44:6a:2e:09:d6:f1,217 406 | 0c:d8:6c:b9:51:90,213 407 | 80:89:17:1f:09:02,373 408 | 44:6a:2e:09:e9:50,214 409 | 44:6a:2e:09:bd:c1,215 410 | 44:6a:2e:09:d2:90,216 411 | 44:6a:2e:09:f8:70,218 412 | 44:6a:2e:09:c1:81,470 413 | 44:6a:2e:09:d6:21,219 414 | 00:06:f4:b8:12:d1,471 415 | 44:6a:2e:09:c7:d0,220 416 | 44:6a:2e:07:41:81,222 417 | 00:06:f4:b8:4a:00,223 418 | 44:6a:2e:07:43:90,473 419 | 44:6a:2e:00:fd:51,474 420 | 44:6a:2e:09:d8:c0,432 421 | ac:4e:91:61:1f:c0,224 422 | 44:6a:2e:09:d7:d0,476 423 | 44:6a:2e:09:f6:50,161 424 | 44:6a:2e:09:f8:60,477 425 | 44:6a:2e:09:c3:e0,478 426 | 7a:11:dc:38:d3:58,311 427 | 44:6a:2e:09:c6:41,226 428 | 44:6a:2e:09:f2:61,32 429 | 56:e4:bd:bc:da:71,336 430 | 44:6a:2e:09:d6:a1,353 431 | 44:6a:2e:09:c3:80,227 432 | 44:6a:2e:09:f5:40,297 433 | 44:6a:2e:09:d5:d1,228 434 | 44:6a:2e:09:f8:00,229 435 | 44:6a:2e:09:d9:00,230 436 | 44:6a:2e:09:f2:f1,231 437 | 44:6a:2e:07:3f:a1,232 438 | 44:6a:2e:09:c4:c1,100 439 | 44:6a:2e:09:f6:30,402 440 | 44:6a:2e:09:c1:a1,482 441 | 44:6a:2e:09:f6:21,516 442 | a4:c6:4f:d5:fa:e0,221 443 | 44:6a:2e:09:f2:e0,233 444 | 44:6a:2e:09:f1:01,235 445 | ba:69:6c:39:0c:7c,485 446 | 44:6a:2e:09:c1:c0,236 447 | 44:6a:2e:09:bf:00,465 448 | 44:6a:2e:09:c4:50,237 449 | a4:c6:4f:d5:fa:b0,238 450 | 44:6a:2e:09:f7:c1,239 451 | a4:c6:4f:d5:fb:10,472 452 | 44:6a:2e:07:43:81,240 453 | 44:6a:2e:09:c3:f0,499 454 | 44:6a:2e:09:f2:60,487 455 | 44:6a:2e:07:43:10,241 456 | 28:f3:66:a7:96:f6,488 457 | a4:c6:4f:d5:fb:60,242 458 | 00:06:f4:b8:1a:f1,490 459 | a4:c6:4f:d5:fa:d1,475 460 | 44:6a:2e:09:c2:50,491 461 | 44:6a:2e:09:c5:80,244 462 | 44:6a:2e:09:f8:31,366 463 | 44:6a:2e:07:38:41,492 464 | 44:6a:2e:09:f8:91,245 465 | 44:6a:2e:09:c4:21,511 466 | 44:6a:2e:09:d8:70,493 467 | 44:6a:2e:09:c2:70,483 468 | a4:c6:4f:d5:a6:60,246 469 | 44:6a:2e:07:43:01,247 470 | a4:c6:4f:d5:df:21,494 471 | 44:6a:2e:07:41:a1,248 472 | 44:6a:2e:09:f6:a1,301 473 | 44:6a:2e:09:f1:21,171 474 | 44:6a:2e:09:c3:20,337 475 | 00:06:f4:b8:12:11,378 476 | 44:6a:2e:09:f7:a1,453 477 | 44:6a:2e:07:38:50,250 478 | 44:6a:2e:07:40:41,495 479 | 44:6a:2e:00:fa:b0,251 480 | 00:06:f4:b8:2c:11,496 481 | 44:6a:2e:09:f5:e0,437 482 | 44:6a:2e:09:e9:41,188 483 | 44:6a:2e:07:41:80,440 484 | 44:6a:2e:09:c2:b1,252 485 | a4:c6:4f:d5:fa:81,500 486 | 44:6a:2e:01:10:20,253 487 | 44:6a:2e:07:0f:d0,396 488 | 44:6a:2e:09:c1:91,254 489 | 44:6a:2e:09:f4:21,501 490 | 44:6a:2e:09:f2:f0,502 491 | 44:6a:2e:09:c3:91,503 492 | 44:6a:2e:07:33:e0,504 493 | 44:6a:2e:09:ef:20,255 494 | 44:6a:2e:09:f2:b1,295 495 | 44:6a:2e:09:ef:30,469 496 | 44:6a:2e:07:3b:81,204 497 | 00:06:f4:b8:11:40,304 498 | 44:6a:2e:07:33:f0,256 499 | 44:6a:2e:09:c3:90,513 500 | a4:c6:4f:d5:fa:80,479 501 | 44:6a:2e:09:f7:d0,257 502 | 44:6a:2e:09:d8:c1,506 503 | 00:06:f4:b8:17:f1,507 504 | a4:c6:4f:d5:fa:f1,258 505 | 28:f3:66:a4:0a:ca,508 506 | 44:6a:2e:09:c5:81,383 507 | 44:6a:2e:09:f0:f1,305 508 | 44:6a:2e:09:f1:c1,342 509 | a4:c6:4f:d5:fb:00,225 510 | 78:11:dc:39:d3:59,259 511 | 44:6a:2e:07:14:a1,438 512 | 44:6a:2e:09:c7:b1,364 513 | 44:6a:2e:09:c7:c0,91 514 | 44:6a:2e:09:f4:e1,271 515 | 44:6a:2e:09:d5:d0,514 516 | 28:f3:66:a7:a1:c6,515 517 | 44:6a:2e:09:c0:f0,260 518 | -------------------------------------------------------------------------------- /algorithm/LSTM_trajectory_estimation.py: -------------------------------------------------------------------------------- 1 | #Use scikit-learn to grid search the batch size and epochs 2 | import csv 3 | import os 4 | import numpy as np 5 | import pandas as pd 6 | from standard_plots import * 7 | from sklearn.grid_search import GridSearchCV 8 | from keras.wrappers.scikit_learn import KerasClassifier 9 | from math import sqrt 10 | from sklearn.metrics import mean_squared_error 11 | from sklearn.preprocessing import MinMaxScaler 12 | from keras.layers import Input 13 | from keras.models import model_from_json, load_model 14 | from keras.layers.normalization import BatchNormalization 15 | from keras.models import Sequential, Model 16 | from keras.layers import Dense, LSTM, Dropout, Embedding, Input, Activation, Bidirectional, TimeDistributed, RepeatVector, Flatten 17 | from keras.optimizers import Adam 18 | from keras.utils import plot_model 19 | import matplotlib.pyplot as plt 20 | import tensorflow 21 | 22 | os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 23 | resultpath = "result" 24 | 25 | #Parameters 26 | 27 | #time steps 28 | look_back = 20 29 | 30 | #Optimizer Adam 31 | adam = Adam(lr=learning_rate) 32 | 33 | ''' 34 | filename = 'waypoint_trace_new.csv' 35 | Loc_x = pd.read_csv(filepath_or_buffer = filename, sep = ',')["Loc_x"].values.astype('int') 36 | Loc_y = pd.read_csv(filepath_or_buffer = filename, sep = ',')["Loc_y"].values.astype('int') 37 | Mag_x = pd.read_csv(filepath_or_buffer = filename, sep = ',')["Mag_x"].values.astype('float') 38 | Mag_y = pd.read_csv(filepath_or_buffer = filename, sep = ',')["Mag_y"].values.astype('float') 39 | Mag_z = pd.read_csv(filepath_or_buffer = filename, sep = ',')["Mag_z"].values.astype('float') 40 | ''' 41 | # convert an array of values into a dataset matrix for both input and output 42 | def create_dataset_input(dataset, look_back=look_back): 43 | dataX = [] 44 | for i in range(len(dataset)-look_back): 45 | dataX.append(dataset[i:(i+look_back)]) 46 | return np.array(dataX) 47 | 48 | #Process training data 49 | def load_data(file_name, batch_size, split=0.75, look_back = look_back): 50 | raw_Loc_x = pd.read_csv(file_name, sep=',', usecols=[0]) 51 | raw_Loc_x = np.array(raw_Loc_x).astype(float) 52 | scaler_loc_x = MinMaxScaler() 53 | Loc_x = scaler_loc_x.fit_transform(raw_Loc_x) 54 | 55 | raw_Loc_y = pd.read_csv(file_name, sep=',', usecols=[1]) 56 | raw_Loc_y = np.array(raw_Loc_y).astype(float) 57 | scaler_loc_y = MinMaxScaler() 58 | Loc_y = scaler_loc_y.fit_transform(raw_Loc_y) 59 | 60 | Mag_x = pd.read_csv(file_name, sep=',', usecols=[3]) 61 | Mag_x = np.array(Mag_x).astype(float) 62 | scaler_mag_x = MinMaxScaler() 63 | Mag_x = scaler_mag_x.fit_transform(Mag_x) 64 | 65 | Mag_y = pd.read_csv(file_name, sep=',', usecols=[4]) 66 | Mag_y = np.array(Mag_y).astype(float) 67 | scaler_mag_y = MinMaxScaler() 68 | Mag_y = scaler_mag_y.fit_transform(Mag_y) 69 | 70 | Mag_z = pd.read_csv(file_name, sep=',', usecols=[5]) 71 | Mag_z = np.array(Mag_z).astype(float) 72 | scaler_mag_z = MinMaxScaler() 73 | Mag_z = scaler_mag_z.fit_transform(Mag_z) 74 | 75 | train_size = int(len(Mag_x) * split) 76 | test_size = len(Mag_x) - train_size 77 | 78 | #To get ground truth of evaluation data 79 | #begin 80 | raw_final = test_size -1 81 | test_raw_loc_x = pd.DataFrame(raw_Loc_x[train_size:(train_size+raw_final)]) 82 | test_raw_loc_y = pd.DataFrame(raw_Loc_y[train_size:(train_size+raw_final)]) 83 | test_raw_loc = pd.concat([test_raw_loc_x,test_raw_loc_y],axis = 1) 84 | test_raw_loc.to_csv('test_raw_loc.csv', mode='w', header= ['Loc_x','Loc_y']) 85 | #end 86 | 87 | train_loc_x, test_loc_x = Loc_x[0:train_size], Loc_x[train_size:len(Loc_x)] 88 | train_loc_y, test_loc_y = Loc_y[0:train_size], Loc_y[train_size:len(Loc_x)] 89 | train_mag_x, test_mag_x = Mag_x[0:train_size], Mag_x[train_size:len(Mag_x)] 90 | train_mag_y, test_mag_y = Mag_y[0:train_size], Mag_y[train_size:len(Mag_y)] 91 | train_mag_z, test_mag_z = Mag_z[0:train_size], Mag_z[train_size:len(Mag_z)] 92 | 93 | print('shapeX:',train_mag_x.shape) 94 | train_mag_x = create_dataset_input(train_mag_x, look_back = look_back) 95 | print('shapeX:',train_mag_x.shape) 96 | train_mag_y = create_dataset_input(train_mag_y, look_back = look_back) 97 | train_mag_z = create_dataset_input(train_mag_z, look_back = look_back) 98 | 99 | 100 | test_mag_x = create_dataset_input(test_mag_x, look_back = look_back) 101 | test_mag_y = create_dataset_input(test_mag_y, look_back = look_back) 102 | test_mag_z = create_dataset_input(test_mag_z, look_back = look_back) 103 | 104 | #print('trian_mag_x:',train_mag_x) 105 | 106 | train_loc_x = create_dataset_input(train_loc_x, look_back = look_back) 107 | train_loc_y = create_dataset_input(train_loc_y, look_back = look_back) 108 | test_loc_x = create_dataset_input(test_loc_x, look_back = look_back) 109 | test_loc_y = create_dataset_input(test_loc_y, look_back = look_back) 110 | 111 | #train_loc_x, test_loc_x = train_loc_x[:,:,np.newaxis], test_loc_x[:,:,np.newaxis] 112 | #train_loc_y, test_loc_y = train_loc_y[:,:,np.newaxis], test_loc_y[:,:,np.newaxis] 113 | #train_mag_x, test_mag_x = train_mag_x[:,:,np.newaxis], test_mag_x[:,:,np.newaxis] 114 | #train_mag_y, test_mag_y = train_mag_y[:,:,np.newaxis], test_mag_y[:,:,np.newaxis] 115 | #train_mag_z, test_mag_z = train_mag_z[:,:,np.newaxis], test_mag_z[:,:,np.newaxis] 116 | 117 | trainX = np.concatenate((train_mag_x,train_mag_y,train_mag_z),axis = 2) 118 | testX = np.concatenate((test_mag_x,test_mag_y,test_mag_z),axis = 2) 119 | print('train_loc_x.shape:',train_loc_x.shape) 120 | trainY = np.concatenate((train_loc_x,train_loc_y),axis = 2) 121 | testY = np.concatenate((test_loc_x,test_loc_y),axis = 2) 122 | trainY = np.reshape(trainY, (len(trainY),look_back,2)) 123 | print('trianY:',trainY.shape) 124 | #print('trianX:',trainX) 125 | print(trainX[0][0][0]) 126 | lengthTrain = len(trainX) 127 | lengthTest = len(testX) 128 | while(lengthTrain % batch_size != 0): 129 | lengthTrain -= 1 130 | while(lengthTest % batch_size != 0): 131 | lengthTest -= 1 132 | 133 | return scaler_loc_x,scaler_loc_y,trainX[0:lengthTrain],trainY[0:lengthTrain],testX[0:lengthTest],testY[0:lengthTest] 134 | #,scaler_mag_x,scaler_mag_y,scaler_mag_z 135 | 136 | 137 | def build_model(hidden_nodes,batch_size , time_steps = look_back, feature_size = 3): 138 | # train_x has shape of (n_samples, time_steps, input_dim) 139 | 140 | #define model, a stacked two-layer LSTM 141 | inputs1 = Input(batch_shape = (batch_size,look_back,feature_size)) 142 | lstm1 = LSTM(hidden_nodes, stateful = True, return_sequences=True, return_state=True)(inputs1) 143 | lstm1 = Dropout(0.2)(lstm1) 144 | lstm1 = LSTM(hidden_nodes,return_sequences=True)(lstm1) 145 | lstm1 = Dropout(0.2)(lstm1) 146 | lstm1 = TimeDistributed(Dense((2)))(lstm1) 147 | model = Model(input = inputs1, outputs = lstm1) 148 | print(model.layers) 149 | model.compile(loss='mean_squared_error', optimizer=adam,metrics=['acc']) 150 | model.summary() 151 | return model 152 | 153 | # make a one-step forecast 154 | def forecast_lstm(model, batch_size, X): 155 | X = X.reshape(batch_size, look_back, 3) 156 | yhat = model.predict(X, batch_size=batch_size) 157 | return yhat 158 | 159 | # inverse scaling for a forecasted value 160 | def invert_scale(scaler, yhat): 161 | inverted = scaler.inverse_transform(yhat) 162 | return inverted[:] 163 | 164 | def train_model(hidden_nodes,batch_size,epochs,file_structure,file_acc2loss): 165 | scaler_loc_x,scaler_loc_y,train_x, train_y, test_x, test_y = load_data(file_name = 'waypoint_trace_new.csv', batch_size = batch_size) 166 | #,scaler_mag_x,scaler_mag_y,scaler_mag_z 167 | #For funtional API 168 | #model,hidden_state = build_model(batch_size=batch_size) 169 | 170 | model = build_model(hidden_nodes,batch_size=batch_size) 171 | 172 | #draw the model structure 173 | plot_model(model, show_shapes=True,to_file=os.path.join(resultpath, file_structure)) 174 | 175 | # input data to model and train 176 | print('train_x.shape:',train_x.shape) 177 | print('train_y.shape:',train_y.shape) 178 | print('test_x.shape:',test_x.shape) 179 | print('test_y.shape:',test_y.shape) 180 | for i in range(epochs): 181 | history = model.fit(train_x, train_y, batch_size=batch_size, epochs = 1, verbose=1,shuffle = False) #validation_split=0.1, validation_data=(test_x, test_y) 182 | # need to reset state for every epoch 183 | model.reset_states() 184 | #print('hidden_state:',hidden_state) 185 | # list all data in history 186 | ''' 187 | print('history.keys()',hist.history.keys()) 188 | # summarize history for accuracy 189 | plt.plot(hist.history['acc']) 190 | plt.plot(hist.history['val_acc']) 191 | plt.title('model accuracy') 192 | plt.ylabel('accuracy') 193 | plt.xlabel('epoch') 194 | plt.legend(['train', 'test'], loc='upper left') 195 | plt.show() 196 | ''' 197 | print('Real Epoches:',i+1) 198 | with open(file_acc2loss,'a', newline='') as csvfile: 199 | if not os.path.getsize(file_acc2loss): #file is empty 200 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 201 | spamwriter.writerow(['epochs','loss','acc'])#, 'val_loss','val_acc' 202 | 203 | data = ([ 204 | i,history.history['loss'][0],history.history['acc'][0]#, history.history['val_loss'][0], history.history['val_acc'][0] 205 | ]) 206 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 207 | spamwriter.writerow(data) 208 | return model 209 | 210 | def my_save_model(hidden_nodes,batch_size,epochs,file_structure,file_acc2loss,file_model): 211 | model = train_model(hidden_nodes,batch_size,epochs,file_structure,file_acc2loss) 212 | model.save(os.path.join(resultpath, file_model)) 213 | print('Model have been saved to my_model.h5') 214 | 215 | def my_load_model(): 216 | # test data 217 | batch_size = 20 218 | 219 | scaler_loc_x,scaler_loc_y,train_x, train_y, test_x, test_y = load_data(file_name = 'waypoint_trace_new.csv', batch_size = batch_size) 220 | 221 | print(len(test_x)) 222 | print(len(test_y)) 223 | print(len(test_x)/batch_size) 224 | model2 = load_model(os.path.join(resultpath, 'my_model_256_10_30.h5')) 225 | print("Load model successfully!") 226 | model2.compile(loss='mean_squared_error', optimizer=adam,metrics=['acc']) 227 | print("Compile model successfully!") 228 | 229 | predictions = list() 230 | for i in range(int(len(test_x)/batch_size)): 231 | #predict 232 | print('%d / %d:' % (i,int(len(test_x)/batch_size))) 233 | yhat = forecast_lstm(model2, batch_size=batch_size,X = test_x[i*batch_size:(i+1)*batch_size]) 234 | 235 | #invert scaling 236 | yhat_loc_x = invert_scale(scaler_loc_x,yhat[:,:,0]) 237 | yhat_loc_x = np.reshape(yhat_loc_x,(batch_size,len(yhat_loc_x[0]))) 238 | yhat_loc_y = invert_scale(scaler_loc_y,yhat[:,:,1]) 239 | yhat_loc_y = np.reshape(yhat_loc_y,(batch_size,len(yhat_loc_y[0]))) 240 | 241 | test_raw_loc_x = invert_scale(scaler_loc_x,test_x[:,:,0]) 242 | test_raw_loc_x = np.reshape(test_raw_loc_x[i*batch_size:(i+1)*batch_size],(batch_size,len(test_raw_loc_x[1]))) 243 | test_raw_loc_y = invert_scale(scaler_loc_y,test_x[:,:,1]) 244 | test_raw_loc_y = np.reshape(test_raw_loc_y[i*batch_size:(i+1)*batch_size],(batch_size,len(test_raw_loc_y[1]))) 245 | 246 | yhat_loc_x = pd.DataFrame(yhat_loc_x) 247 | yhat_loc_y = pd.DataFrame(yhat_loc_y) 248 | test_raw_loc_x = pd.DataFrame(test_raw_loc_x) 249 | test_raw_loc_y = pd.DataFrame(test_raw_loc_y) 250 | 251 | if not os.path.isfile('test_raw_loc_x.csv'): 252 | test_raw_loc_x.to_csv('test_raw_loc_x.csv', header=0) 253 | else: # else it exists so append without writing the header 254 | test_raw_loc_x.to_csv('test_raw_loc_x.csv', mode='a', header=False) 255 | 256 | if not os.path.isfile('test_raw_loc_y.csv'): 257 | test_raw_loc_y.to_csv('test_raw_loc_y.csv', header=0) 258 | else: # else it exists so append without writing the header 259 | test_raw_loc_y.to_csv('test_raw_loc_y.csv', mode='a', header=False) 260 | 261 | 262 | if not os.path.isfile('yhat_loc_x.csv'): 263 | yhat_loc_x.to_csv('yhat_loc_x.csv', header=0) 264 | else: # else it exists so append without writing the header 265 | yhat_loc_x.to_csv('yhat_loc_x.csv', mode='a', header=False) 266 | 267 | if not os.path.isfile('yhat_loc_y.csv'): 268 | yhat_loc_y.to_csv('yhat_loc_y.csv', header=0) 269 | else: # else it exists so append without writing the header 270 | yhat_loc_y.to_csv('yhat_loc_y.csv', mode='a', header=False) 271 | 272 | ''' 273 | print('test_raw_loc:',test_raw_loc) 274 | print('yhat_loc:',yhat_loc) 275 | 276 | rmse = sqrt(mean_squared_error(test_raw_loc,yhat_loc)) 277 | print(rmse) 278 | print('%d)Test RMSE: %.3f'% (i+1,rmse)) 279 | ''' 280 | ''' 281 | print('yhat_loc_x:',yhat_loc_x) 282 | print('yhat_loc_y:',yhat_loc_y) 283 | print('test_raw_loc_x:',test_raw_loc_x) 284 | print('test_raw_loc_y:',test_raw_loc_y) 285 | ''' 286 | def main(): 287 | #Train parameters in Grid 288 | ''' 289 | scaler_loc_x,scaler_loc_y,trainX, trainY, test_x, test_y = load_data('waypoint_trace_new.csv') 290 | model = KerasClassifier(build_fn=build_model, verbose=0) 291 | batch_size = [1, 20, 50, 100, 200] 292 | epochs = [10,30, 50, 100,200, 300] 293 | param_grid = dict(batch_size=batch_size, nb_epoch=epochs) 294 | grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1) 295 | print('Xshape:',trainX.shape) 296 | print('Yshape:',trainY.shape) 297 | grid_result = grid.fit(trainX, trainY) 298 | # summarize results 299 | print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_)) 300 | for params, mean_score, scores in grid_result.grid_scores_: 301 | print("%f (%f) with: %r" % (scores.mean(), scores.std(), params)) 302 | 303 | best_batchsize = int(grid_result.best_params_['batch_size']) 304 | best_epoch = int(grid_result.best_params_['nb_epoch']) 305 | print('best_batchsize:',best_batchsize) 306 | print('best_epoch:',best_epoch) 307 | ''' 308 | 309 | # Train for one pair of parameters 310 | hidden_nodes = 256 311 | best_batchsize = 5 312 | best_epoch = 100 313 | file_structure = 'model_ts=30_256_5_100.png' 314 | file_acc2loss = 'log_ts=30_256_5_100.csv' 315 | file_model = 'my_model_ts=30_256_5_100.h5' 316 | my_save_model(hidden_nodes,best_batchsize,best_epoch,file_structure,file_acc2loss,file_model) 317 | 318 | #load model 319 | my_load_model() 320 | 321 | 322 | if __name__ == "__main__": 323 | main() 324 | 325 | 326 | -------------------------------------------------------------------------------- /server/main_build_DB.py: -------------------------------------------------------------------------------- 1 | ''' 2 | By Zhenghang(Klaus) Zhong 3 | 4 | ############################################################################################ 5 | It's a light server based on FLASK micro framework, 6 | 7 | 1.Requirements: Python 3, Flask and relevant packages 8 | 9 | 2. How does this work? 10 | (1) Firstly, modify the host IP address of your own environment. 11 | (2) Then run this python file, 12 | A temporary file called 'tempList.csv' will be initialized with default data 13 | (e.g. for signal level RSS it would be -110, magnetic field value would be none) 14 | with order according to the unchanged file 'APs.csv' (to store the AP info in a defined order) 15 | 16 | Each time one complete info of AP arrival, (assume there are 60 APs that is detected once, then 17 | the transmission would be repeated 60 times and one symbol called "Done" would be set to '1' for 18 | last time, which means info of one scan has all been sent), the 'tempList.csv' would be refreshed 19 | with one line of AP's info. After 60 times (AP number), the function 'refreshCSV()' would be called. 20 | 21 | Then scan info of once would be be copied from 'tempList.csv' and be added in 'xxx.csv'(which stores 22 | all info that is similar to database) and be refreshed in 'oneTime.csv' (for check last time's scan info). 23 | 24 | Finally, refresh 'tempList.csv' with default value for next time's transmission. 25 | ############################################################################################ 26 | ''' 27 | 28 | # coding: utf-8 29 | from flask import Flask, request 30 | from app import db, models 31 | import csv 32 | import os #to get current path 33 | import importlib 34 | 35 | from model import * 36 | 37 | #algorithm part 38 | import pandas as pdb 39 | import numpy as np 40 | import tensorflow as tf 41 | from sklearn.preprocessing import scale 42 | import matplotlib.pyplot as plt 43 | 44 | PYTHONIOENCODING="UTF-8" #set the utf-8 encode mode 45 | 46 | 47 | # create the application object 48 | app = Flask(__name__) 49 | 50 | #edition 51 | # Write all info in DB into a csv file, without SSID stored, encode mode is UTF-8 (as some SSID contains chinese characters) 52 | #edition 53 | def addAllCSV(): #whole database 54 | with open('APs.csv', 'w', newline='') as csvfile: 55 | if not os.path.getsize('./APs.csv'): 56 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 57 | spamwriter.writerow([ 'BSSID','SSID','Building', 'Floor','Location_x', 'Location_y','Frequency','AccX','AccY','AccZ','ORIx','ORIy','ORIz','Level','GeoX','GeoY','GeoZ']) 58 | 59 | users = models.User.query.all() 60 | 61 | for u in users: 62 | data = ([u.BSSID, u.SSID, u.Buidling, u.Floor, u.Location_x, u.Location_y, u.Frequency, u.AccX, u.AccY, u.AccZ, u.ORIx, u.ORIy, u.ORIz, u.Level, u.GeoX, u.GeoY, u.GeoZ]) 63 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 64 | spamwriter.writerow(data) 65 | 66 | #add one time's scanner result 67 | def addCSV(BSSID, SSID, Building, Floor, Location_x, Location_y, Frequency, AccX, AccY, AccZ, ORIx, ORIy, ORIz, Level, GeoX, GeoY, GeoZ, Model, Time): 68 | with open('userinput.csv', 'a', newline='') as csvfile: 69 | if not os.path.getsize('./userinput.csv'): 70 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 71 | spamwriter.writerow(['BSSID', 'SSID','Building', 'Floor','Location_x', 'Location_y', 'Frequency','AccX','AccY', 'AccZ','ORIx','ORIy','ORIz','Level', 'GeoX','GeoY','GeoZ', 'Model','Time']) 72 | 73 | data = ([ 74 | BSSID, SSID, Building, Floor, Location_x, Location_y, Frequency, AccX, AccY, AccZ, ORIx, ORIy, ORIz, Level, GeoX, GeoY, GeoZ, Model, Time 75 | ]) 76 | 77 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 78 | spamwriter.writerow(data) 79 | 80 | 81 | def initializeTempList(): 82 | with open('mapping.csv', 'r', newline='') as csvfile: 83 | reader = csv.reader(csvfile) 84 | APs = [row[0] for row in reader] 85 | APlength = len(APs) 86 | lists = [[0 for col in range(19)] for row in range(APlength)] 87 | row = 0 88 | for AP in APs: 89 | lists[row][0] = AP 90 | lists[row][1] = 'none' 91 | lists[row][2] = 'none' 92 | lists[row][3] = 'none' 93 | lists[row][4] = 'none' 94 | lists[row][5] = 'none' 95 | lists[row][6] = 'none' 96 | lists[row][7] = 'none' 97 | lists[row][8] = 'none' 98 | lists[row][9] = 'none' 99 | lists[row][10] = 'none' 100 | lists[row][11] = 'none' 101 | lists[row][13] = 'none' 102 | lists[row][14] = '-110' 103 | lists[row][15] = 'none' 104 | lists[row][16] = 'none' 105 | lists[row][17] = 'none' 106 | lists[row][18] = 'none' 107 | row += 1 108 | 109 | with open('tempList.csv', 'w', newline='') as csvfile: 110 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 111 | spamwriter.writerow(['BSSID', 'SSID','Building', 'Floor','Location_x', 'Location_y', 'Frequency','AccX','AccY','AccZ', 'ORIx','ORIy','ORIz','Level', 'GeoX','GeoY','GeoZ', 'Model','Time']) 112 | for i in range(0,517): 113 | data = ([ 114 | lists[i][0], lists[i][1], lists[i][2], lists[i][3], lists[i][4], lists[i][5], lists[i][6], lists[i][7], lists[i][8], lists[i][9], lists[i][10], lists[i][11], lists[i][12], lists[i][13], lists[i][14], lists[i][15], lists[i][16], lists[i][17], lists[i][18] 115 | ]) 116 | spamwriter.writerow(data) 117 | 118 | #Check if the input AP's BSSID is in the mapping.csv, which contains 200 APs 119 | def checkAP(list, AP): 120 | row = 0 121 | 122 | for row in range(0,517): 123 | if AP == list[row][0]: 124 | return row 125 | return 'none' 126 | 127 | def tempList(BSSID,SSID, Building, Floor, Location_x, Location_y, Frequency, AccX, AccY, AccZ, ORIx, ORIy, ORIz, Level, GeoX, GeoY, GeoZ, Model, Time): 128 | with open('tempList.csv', 'r', newline='') as csvfile: 129 | reader = csv.reader(csvfile) 130 | RSS = [row for row in reader] 131 | #print(RSS,RSS[0][0]) 132 | for row in range(1,517): 133 | if RSS[row][0] == BSSID: 134 | RSS[row][1] = SSID 135 | RSS[row][2] = Building 136 | RSS[row][3] = Floor 137 | RSS[row][4] = Location_x 138 | RSS[row][5] = Location_y 139 | RSS[row][6] = Frequency 140 | RSS[row][7] = AccX 141 | RSS[row][8] = AccY 142 | RSS[row][9] = AccZ 143 | RSS[row][10] = ORIx 144 | RSS[row][11] = ORIy 145 | RSS[row][12] = ORIz 146 | RSS[row][13] = Level 147 | RSS[row][14] = GeoX 148 | RSS[row][15] = GeoY 149 | RSS[row][16] = GeoZ 150 | RSS[row][17] = Model 151 | RSS[row][18] = Time 152 | 153 | with open('tempList.csv', 'w', newline='') as csvfile: 154 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 155 | spamwriter.writerow(['BSSID', 'SSID', 'Building','Floor','Location_x','Location_y', 'Frequency','AccX','AccY','AccZ', 'ORIx','ORIy','ORIz', 'Level', 'GeoX','GeoY','GeoZ', 'Model', 'Time']) 156 | for i in range(1,517): 157 | data = ([ 158 | RSS[i][0], RSS[i][1], RSS[i][2], RSS[i][3], RSS[i][4], RSS[i][5], RSS[i][6], RSS[i][7], RSS[i][8], RSS[i][9], RSS[i][10], RSS[i][11], RSS[i][12], RSS[i][13], RSS[i][14], RSS[i][15], RSS[i][16], RSS[i][17], RSS[i][18] 159 | ]) 160 | spamwriter.writerow(data) 161 | break 162 | 163 | def isEmpty(): 164 | with open('xxx.csv', 'a+', newline='') as csvfile: #Check is tempList is empty 165 | if not os.path.getsize('./xxx.csv'): #file not established 166 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 167 | spamwriter.writerow(['BSSID','SSID','Building', 'Floor','Location_x','Location_y','Frequency','AccX','AccY','AccZ','ORIx','ORIy','ORIz', 'Level', 'GeoX','GeoY','GeoZ', 'Model', 'Time']) 168 | 169 | with open('mapping.csv', 'r', newline='') as csvfile: 170 | reader = csv.reader(csvfile) 171 | APs = [row[0] for row in reader] 172 | APlength = len(APs) 173 | lists = [[0 for col in range(19)] for row in range(APlength)] 174 | row = 0 175 | for AP in APs: 176 | lists[row][0] = AP 177 | lists[row][1] = 'none' 178 | lists[row][2] = 'none' 179 | lists[row][3] = 'none' 180 | lists[row][4] = 'none' 181 | lists[row][5] = 'none' 182 | lists[row][6] = 'none' 183 | lists[row][7] = 'none' 184 | lists[row][8] = 'none' 185 | lists[row][9] = 'none' 186 | lists[row][10] = 'none' 187 | lists[row][11] = 'none' 188 | lists[row][12] = 'none' 189 | lists[row][13] = '-110' 190 | lists[row][14] = 'none' 191 | lists[row][15] = 'none' 192 | lists[row][16] = 'none' 193 | lists[row][17] = 'none' 194 | lists[row][18] = 'none' 195 | row += 1 196 | #edition2 197 | with open('tempList.csv', 'a+', newline='') as csvfile: #Check is tempList is empty 198 | if not os.path.getsize('./tempList.csv'): #file is empty 199 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 200 | spamwriter.writerow(['BSSID','SSID','Building','Floor','Location_x','Location_y', 'Frequency','AccX','AccY','AccZ','ORIx','ORIy','ORIz','Level', 'GeoX','GeoY','GeoZ', 'Model', 'Time']) 201 | for i in range(1,517): 202 | data = ([ 203 | lists[i][0], lists[i][1], lists[i][2], lists[i][3], lists[i][4], lists[i][5], lists[i][6], lists[i][7], lists[i][8], lists[i][9], lists[i][10], lists[i][11], lists[i][12], lists[i][13], lists[i][14], lists[i][15], lists[i][16], lists[i][17], lists[i][18] 204 | ]) 205 | print(i) 206 | spamwriter.writerow(data) 207 | 208 | def refreshCSV(Building, Floor, Location_x, Location_y, Model): 209 | with open('tempList.csv', 'r', newline='') as csvfile: 210 | reader = csv.reader(csvfile) 211 | RSS = [row for row in reader] 212 | 213 | with open('tempList.csv', 'w', newline='') as csvfile: 214 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 215 | spamwriter.writerow(['BSSID','SSID','Building', 'Floor','Location_x', 'Location_y', 'Frequency','AccX','AccY','AccZ','ORIx','ORIy','ORIz','Level', 'GeoX', 'GeoY', 'GeoZ', 'Model', 'Time']) 216 | for row in range(1,517): 217 | RSS[row][2] = Building 218 | RSS[row][3] = Floor 219 | RSS[row][4] = Location_x 220 | RSS[row][5] = Location_y 221 | RSS[row][17] = Model 222 | x = ([ 223 | RSS[row][0], RSS[row][1], RSS[row][2], RSS[row][3], RSS[row][4], RSS[row][5], RSS[row][6], RSS[row][7], RSS[row][8], RSS[row][9], RSS[row][10], RSS[row][11], RSS[row][12], RSS[row][13], RSS[row][14], RSS[row][15], RSS[row][16], RSS[row][17], RSS[row][18] 224 | ]) 225 | 226 | spamwriter.writerow(x) 227 | 228 | with open('xxx.csv', 'a', newline='') as csvfile: 229 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 230 | #edition3 231 | for row in range(1,517): 232 | data = ([ 233 | RSS[row][0], RSS[row][1], RSS[row][2], RSS[row][3], RSS[row][4], RSS[row][5], RSS[row][6], RSS[row][7], RSS[row][8], RSS[row][9], RSS[row][10], RSS[row][11], RSS[row][12], RSS[row][13], RSS[row][14], RSS[row][15], RSS[row][16], RSS[row][17], RSS[row][18] 234 | ]) 235 | spamwriter.writerow(data) 236 | 237 | with open('oneTime.csv', 'a', newline='') as csvfile: 238 | if not os.path.getsize('./oneTime.csv'): #file is empty 239 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 240 | spamwriter.writerow(['BSSID','SSID','Building','Floor','Location_x', 'Location_y','Frequency','AccX','AccY','AccZ','ORIx','ORIy','ORIz','Level', 'GeoX','GeoY', 'GeoZ', 'Model', 'Time']) 241 | #edition4 242 | for i in range(1,517): 243 | data = ([ 244 | RSS[i][0], RSS[i][1], RSS[i][2], RSS[i][3], RSS[i][4], RSS[i][5], RSS[i][6], RSS[i][7], RSS[i][8], RSS[row][9], RSS[row][10], RSS[row][11], RSS[i][12], RSS[row][13], RSS[row][14], RSS[row][15], RSS[row][16], RSS[row][17], RSS[row][18] 245 | ]) 246 | spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) 247 | spamwriter.writerow(data) 248 | 249 | 250 | @app.route('/', methods=['POST']) 251 | def post(): 252 | #isEmpty() 253 | #edition5 254 | isEmpty() 255 | 256 | BSSID = request.form['BSSID'] 257 | Building = request.form['Building'] 258 | Floor = request.form['Floor'] 259 | Location_x = request.form['Location_x'] 260 | Location_y = request.form['Location_y'] 261 | Frequency = request.form['Frequency'] 262 | Level = request.form['Level'] 263 | AccX = request.form['AccX'] 264 | AccY = request.form['AccY'] 265 | GeoX = request.form['GeoX'] 266 | GeoY = request.form['GeoY'] 267 | GeoZ = request.form['GeoZ'] 268 | Model = request.form['Model'] 269 | Time = request.form['Time'] 270 | SSID = request.form['SSID'] 271 | AccX = request.form['AccX'] 272 | AccY = request.form['AccY'] 273 | AccZ = request.form['AccZ'] 274 | ORIx = request.form['ORIx'] 275 | ORIy = request.form['ORIy'] 276 | ORIz = request.form['ORIz'] 277 | Done = request.form['Done'] 278 | 279 | #addCSV(BSSID, SSID, Building, Floor, Location_x, Location_y, Frequency, AccX, AccY, AccZ, ORIx, ORIy, ORIz, Level, GeoX, GeoY, GeoZ, Model, Time) 280 | tempList(BSSID, SSID,Building, Floor, Location_x, Location_y, Frequency, AccX, AccY, AccZ, ORIx, ORIy, ORIz, Level, GeoX, GeoY, GeoZ, Model, Time) 281 | #refreshCSV(SSID,Building, Floor, Location_x, Location_y, Frequency, AccX, AccY, AccZ, ORIx, ORIy, ORIz, Level, GeoX, GeoY, GeoZ, Model, Time) 282 | 283 | #addAPs(BSSID, Building, Location_x, Location_y, Frequency, AccX, AccY, AccZ, ORIx, ORIy, ORIz, Level, GeoX, GeoY, GeoZ, Model, Time) 284 | #addCSV(BSSID, Building, Location_x, Location_y, Frequency, AccX, AccY, AccZ, ORIx, ORIy, ORIz, Level, GeoX, GeoY, GeoZ, Model, Time) 285 | 286 | 287 | #addAPs(list) 288 | #addAllCSV() 289 | 290 | #addAPs(Building, Room, Location_x, Location_y, SSID,BSSID, Frequency, Level) 291 | 292 | #addCSV(Building, Room, Location_x, Location_y, BSSID, Frequency, Level) 293 | 294 | if Done == '1': 295 | refreshCSV(Building, Floor, Location_x, Location_y, Model) 296 | initializeTempList() 297 | print('1') 298 | else: 299 | print('0') 300 | 301 | 302 | return 'OK.' 303 | 304 | if __name__ == "__main__": 305 | #Use local host IP for local server 306 | #Or IPV4 address 307 | 308 | #app.run(host='192.168.xxx.xxx', debug=True) 309 | app.run(host='192.168.xxx.xxx', debug=True) 310 | 311 | ''' 312 | #Add RSS info into database whose name is app.db 313 | def addAPs(list): 314 | for row in range(0,517): 315 | u = models.User(BSSID = list[row][0], SSID = list[row][1], Building = list[row][2], Floor = list[row][3], Location_x = list[row][4], Location_y = list[row][5], Frequency = list[row][6], AccX = list[row][7], AccY = list[row][8], AccZ = list[row][9], ORIx = list[row][10], ORIy = list[row][11], ORIz = list[row][12], Level = list[row][13], GeoX=list[row][14], GeoY=list[row][15], GeoZ=list[row][16]) 316 | db.session.add(u) 317 | db.session.commit() 318 | 319 | #Show all RSS info from database 320 | def showAPs(num): 321 | ap = models.User.query.get(num) 322 | print(ap.BSSID, ap.SSID, ap.Building, ap.Floor,ap.Location_x, ap.Location_y, ap.Frequency, ap.AccX, ap.AccY, ap.AccZ, ap.ORIx, ap.ORIy, ap.ORIz, ap.Level, ap.GeoX, ap.GeoY, ap.GeoZ) 323 | 324 | 325 | def deleteDB(): 326 | users = models.User.query.all() 327 | 328 | for u in users: 329 | db.session.delete(u) 330 | 331 | db.session.commit() 332 | ''' -------------------------------------------------------------------------------- /floor4_new_data.csv: -------------------------------------------------------------------------------- 1 | ID,BUILDING,FLOOR,LOC_X,LOC_Y,MAG_X,MAG_Y,MAG_Z,G 2 | 1,IBSS,4,0,0,0,20.387165,-53.771187,9.806624 3 | 2,IBSS,4,1,0,0,23.939987,-48.772015,9.806639 4 | 3,IBSS,4,2,0,0,24.266232,-43.574265,9.806561 5 | 4,IBSS,4,3,0,0,23.236959,-44.168583,9.806633 6 | 5,IBSS,4,4,0,0,23.998175,-40.786045,9.806617 7 | 6,IBSS,4,5,0,0,23.702391,-39.210735,9.806621 8 | 7,IBSS,4,6,0,0,23.129759,-37.59943,9.806552 9 | 8,IBSS,4,7,0,0,24.369493,-35.752552,9.806579 10 | 9,IBSS,4,8,0,0,26.361261,-34.539463,9.806578 11 | 10,IBSS,4,9,0,0,25.734238,-33.23312,9.806552 12 | 11,IBSS,4,10,0,0,27.162186,-35.384453,9.806599 13 | 12,IBSS,4,11,0,0,27.367218,-37.885212,9.80663 14 | 13,IBSS,4,12,0,0,27.668011,-40.246078,9.806552 15 | 14,IBSS,4,13,0,-0.000001,31.97266,-44.709332,9.806633 16 | 15,IBSS,4,14,0,0,35.532776,-38.292152,9.806592 17 | 16,IBSS,4,15,0,0.000001,41.824036,-37.693932,9.806562 18 | 17,IBSS,4,16,0,0.000001,34.053146,-36.434025,9.8066 19 | 18,IBSS,4,17,0,0.000001,34.086967,-37.049488,9.806621 20 | 19,IBSS,4,18,0,0,34.182194,-38.791355,9.80661 21 | 20,IBSS,4,19,0,0,36.507782,-37.545002,9.806611 22 | 21,IBSS,4,20,0,0,39.331242,-38.182938,9.806554 23 | 22,IBSS,4,21,0,0,37.125729,-37.972652,9.806626 24 | 23,IBSS,4,22,0,0.000001,37.198517,-43.417271,9.80661 25 | 24,IBSS,4,23,0,0,33.521286,-43.473934,9.806566 26 | 25,IBSS,4,24,0,0,36.012196,-34.42498,9.806548 27 | 26,IBSS,4,25,0,0,39.68438,-35.851173,9.806627 28 | 27,IBSS,4,26,0,0,30.63385,-33.732933,9.806589 29 | 28,IBSS,4,27,0,0,27.447407,-41.085312,9.806626 30 | 29,IBSS,4,28,0,0,23.718861,-34.393147,9.806617 31 | 30,IBSS,4,29,0,0,34.766514,-27.045902,9.806575 32 | 31,IBSS,4,30,0,0,35.273655,-28.517199,9.806573 33 | 32,IBSS,4,31,0,0.000001,52.074188,-31.423843,9.806602 34 | 33,IBSS,4,32,0,0,53.971771,-27.970924,9.806564 35 | 34,IBSS,4,33,0,0,53.679749,-37.053852,9.806587 36 | 35,IBSS,4,34,0,0,34.983162,-36.718296,9.806584 37 | 36,IBSS,4,35,0,0,39.452694,-33.562107,9.806592 38 | 37,IBSS,4,36,0,0,33.19791,-45.892544,9.806542 39 | 38,IBSS,4,37,0,-0.000001,27.879715,-46.545288,9.806617 40 | 39,IBSS,4,38,0,0.000001,30.7402,-47.81802,9.806553 41 | 40,IBSS,4,39,0,0,37.245773,-39.548702,9.806561 42 | 41,IBSS,4,40,0,0,40.820984,-33.062313,9.806623 43 | 42,IBSS,4,41,0,0,41.519108,-29.583437,9.806599 44 | 43,IBSS,4,42,0,0.000001,38.943302,-27.287262,9.806555 45 | 44,IBSS,4,43,0,0.000001,36.043953,-33.905384,9.806583 46 | 45,IBSS,4,44,0,0.000001,35.964096,-34.982948,9.806597 47 | 46,IBSS,4,45,0,0,34.929268,-34.218979,9.806563 48 | 47,IBSS,4,46,0,0,34.644161,-34.294289,9.806593 49 | 48,IBSS,4,47,0,0.000001,31.901268,-36.10067,9.80661 50 | 49,IBSS,4,48,0,0,31.736021,-37.85902,9.806578 51 | 50,IBSS,4,49,0,0,31.58305,-40.660992,9.806594 52 | 51,IBSS,4,50,0,0,31.929199,-42.358944,9.806558 53 | 52,IBSS,4,0,1,0,27.034004,-41.734352,9.806601 54 | 53,IBSS,4,1,1,0,23.619974,-42.368073,9.806552 55 | 54,IBSS,4,2,1,0,24.463125,-40.234043,9.806602 56 | 55,IBSS,4,3,1,0,24.557636,-41.487534,9.806623 57 | 56,IBSS,4,4,1,0,24.934658,-38.437664,9.80654 58 | 57,IBSS,4,5,1,0,24.976034,-36.680187,9.806568 59 | 58,IBSS,4,6,1,0,24.31138,-33.822659,9.806623 60 | 59,IBSS,4,7,1,0,24.580887,-32.345829,9.806644 61 | 60,IBSS,4,8,1,0,27.231091,-30.253273,9.806555 62 | 61,IBSS,4,9,1,0,26.237169,-29.391119,9.806591 63 | 62,IBSS,4,10,1,0,26.841024,-30.536619,9.80657 64 | 63,IBSS,4,11,1,0,26.798544,-32.745739,9.806576 65 | 64,IBSS,4,12,1,0,24.421896,-32.382004,9.806566 66 | 65,IBSS,4,13,1,0,26.880308,-32.939331,9.806586 67 | 66,IBSS,4,14,1,0,31.594263,-32.33144,9.806641 68 | 67,IBSS,4,15,1,0,33.666737,-33.775394,9.806608 69 | 68,IBSS,4,16,1,0,35.404129,-33.772171,9.806633 70 | 69,IBSS,4,17,1,0,37.193439,-35.652557,9.806584 71 | 70,IBSS,4,18,1,0,37.885864,-37.377579,9.80656 72 | 71,IBSS,4,19,1,0,38.244003,-37.426353,9.806572 73 | 72,IBSS,4,20,1,0,41.390945,-38.890083,9.806594 74 | 73,IBSS,4,21,1,0,38.087231,-44.695057,9.806602 75 | 74,IBSS,4,22,1,0,36.187355,-45.320198,9.806628 76 | 75,IBSS,4,23,1,0.000001,33.708355,-44.655815,9.806593 77 | 76,IBSS,4,24,1,0,32.997131,-38.117496,9.806546 78 | 77,IBSS,4,25,1,0,34.040958,-38.745193,9.806626 79 | 78,IBSS,4,26,1,0,31.320496,-36.159035,9.806568 80 | 79,IBSS,4,27,1,-0.000001,26.432005,-39.303875,9.806562 81 | 80,IBSS,4,28,1,-0.000001,25.956951,-33.389606,9.806545 82 | 81,IBSS,4,29,1,0,32.342331,-29.165298,9.806626 83 | 82,IBSS,4,30,1,0,37.782494,-37.000034,9.806603 84 | 83,IBSS,4,31,1,0,52.555222,-33.625465,9.806634 85 | 84,IBSS,4,32,1,-0.000001,32.123421,-29.102392,9.806607 86 | 85,IBSS,4,33,1,0,51.765171,-29.707026,9.806626 87 | 86,IBSS,4,34,1,0,36.455811,-36.085152,9.806566 88 | 87,IBSS,4,35,1,0,38.022987,-37.736633,9.806594 89 | 88,IBSS,4,36,1,0,34.049839,-41.340652,9.806597 90 | 89,IBSS,4,37,1,0,40.980614,-39.694233,9.806615 91 | 90,IBSS,4,38,1,0,29.749073,-43.053795,9.806619 92 | 91,IBSS,4,39,1,0,29.908247,-36.289001,9.806602 93 | 92,IBSS,4,40,1,0,31.644188,-36.012104,9.80655 94 | 93,IBSS,4,41,1,0,32.760094,-28.070341,9.806612 95 | 94,IBSS,4,42,1,0.000001,34.998886,-25.575409,9.806593 96 | 95,IBSS,4,43,1,0,35.497681,-31.653776,9.806551 97 | 96,IBSS,4,44,1,-0.000001,35.071846,-32.426121,9.806601 98 | 97,IBSS,4,45,1,0.000001,34.77375,-32.424026,9.80656 99 | 98,IBSS,4,46,1,0,35.052685,-32.076344,9.806563 100 | 99,IBSS,4,47,1,0,33.106762,-33.548603,9.806641 101 | 100,IBSS,4,48,1,0,32.297249,-36.455032,9.806623 102 | 101,IBSS,4,49,1,0,31.214596,-38.947887,9.80655 103 | 102,IBSS,4,50,1,0,31.023561,-42.165543,9.806576 104 | 103,IBSS,4,0,2,0,26.502275,-36.758457,9.806632 105 | 104,IBSS,4,1,2,0,24.62324,-37.396538,9.80664 106 | 105,IBSS,4,2,2,0,25.166376,-37.464638,9.80658 107 | 106,IBSS,4,3,2,0,25.254646,-38.269905,9.80656 108 | 107,IBSS,4,4,2,0,25.815754,-36.295712,9.806606 109 | 108,IBSS,4,5,2,0,25.907557,-33.522926,9.806618 110 | 109,IBSS,4,6,2,0,24.84425,-30.70318,9.806611 111 | 110,IBSS,4,7,2,0,25.659014,-29.911818,9.806594 112 | 111,IBSS,4,8,2,0,27.655165,-27.121119,9.806565 113 | 112,IBSS,4,9,2,0,26.256716,-26.6915,9.806598 114 | 113,IBSS,4,10,2,0,26.199472,-27.828257,9.806642 115 | 114,IBSS,4,11,2,0,24.764263,-28.994492,9.80662 116 | 115,IBSS,4,12,2,0,22.90276,-26.692158,9.806599 117 | 116,IBSS,4,13,2,0,24.63846,-27.465906,9.80659 118 | 117,IBSS,4,14,2,0,30.394936,-28.552851,9.806625 119 | 118,IBSS,4,15,2,0,33.694862,-30.431337,9.806579 120 | 119,IBSS,4,16,2,0,36.688576,-31.705717,9.806627 121 | 120,IBSS,4,17,2,0,38.701199,-34.099895,9.806598 122 | 121,IBSS,4,18,2,0,40.167938,-36.2672,9.806587 123 | 122,IBSS,4,19,2,0,39.769276,-37.252598,9.806638 124 | 123,IBSS,4,20,2,0,41.541759,-38.234539,9.806644 125 | 124,IBSS,4,21,2,0,37.842815,-40.445553,9.806579 126 | 125,IBSS,4,22,2,0,38.250702,-45.051716,9.806627 127 | 126,IBSS,4,23,2,0,32.935608,-44.627094,9.806631 128 | 127,IBSS,4,24,2,0,32.763866,-39.381123,9.80657 129 | 128,IBSS,4,25,2,0,31.821377,-39.229416,9.806633 130 | 129,IBSS,4,26,2,0,29.075367,-36.163822,9.806563 131 | 130,IBSS,4,27,2,0,29.071535,-34.657051,9.806597 132 | 131,IBSS,4,28,2,0,25.846817,-33.862144,9.806555 133 | 132,IBSS,4,29,2,0,32.032303,-30.137157,9.806588 134 | 133,IBSS,4,30,2,0,27.026232,-37.490791,9.806594 135 | 134,IBSS,4,31,2,0,36.659172,-34.551422,9.806632 136 | 135,IBSS,4,32,2,0,38.592812,-30.159302,9.806585 137 | 136,IBSS,4,33,2,-0.000001,60.91481,-47.718864,9.806567 138 | 137,IBSS,4,34,2,0,39.829121,-41.502163,9.80656 139 | 138,IBSS,4,35,2,-0.000001,38.649273,-44.403553,9.806591 140 | 139,IBSS,4,36,2,0,37.407501,-47.214764,9.806596 141 | 140,IBSS,4,37,2,-0.000001,43.533691,-57.440811,9.806623 142 | 141,IBSS,4,38,2,0.000001,29.611437,-52.793072,9.806617 143 | 142,IBSS,4,39,2,0.000001,25.980776,-41.18948,9.806596 144 | 143,IBSS,4,40,2,0,23.530823,-39.014015,9.806641 145 | 144,IBSS,4,41,2,0,28.788004,-30.251883,9.806624 146 | 145,IBSS,4,42,2,0.000001,32.791523,-23.996527,9.806553 147 | 146,IBSS,4,43,2,0,34.906578,-31.577593,9.806622 148 | 147,IBSS,4,44,2,0,34.307274,-32.443569,9.806635 149 | 148,IBSS,4,45,2,-0.000001,34.178097,-32.647713,9.806601 150 | 149,IBSS,4,46,2,-0.000001,35.817795,-32.490437,9.806619 151 | 150,IBSS,4,47,2,-0.000001,34.153389,-33.090889,9.806575 152 | 151,IBSS,4,48,2,0,32.913822,-35.632298,9.806604 153 | 152,IBSS,4,49,2,0,30.955896,-39.439651,9.80655 154 | 153,IBSS,4,50,2,0,30.187973,-42.626732,9.806573 155 | 154,IBSS,4,0,3,0,26.05443,-33.255795,9.806624 156 | 155,IBSS,4,1,3,0,25.014931,-34.467709,9.806558 157 | 156,IBSS,4,2,3,0.000001,25.633053,-34.870316,9.806638 158 | 157,IBSS,4,3,3,0,25.41114,-35.925869,9.806565 159 | 158,IBSS,4,4,3,0,26.169914,-34.256824,9.806614 160 | 159,IBSS,4,5,3,0,26.907497,-31.854134,9.806591 161 | 160,IBSS,4,6,3,0,26.935801,-30.694145,9.80657 162 | 161,IBSS,4,7,3,0,27.925533,-28.416687,9.806616 163 | 162,IBSS,4,8,3,0,27.643902,-26.843992,9.806562 164 | 163,IBSS,4,9,3,0,25.884581,-27.027046,9.806577 165 | 164,IBSS,4,10,3,-0.000001,24.003311,-27.214014,9.80665 166 | 165,IBSS,4,11,3,0,23.081059,-27.056198,9.806607 167 | 166,IBSS,4,12,3,0,146.626892,-112.237053,9.806589 168 | 167,IBSS,4,13,3,0,23.489864,-23.139853,9.806587 169 | 168,IBSS,4,14,3,0,28.820974,-25.397461,9.806607 170 | 169,IBSS,4,15,3,0,34.193714,-29.227577,9.806574 171 | 170,IBSS,4,16,3,0,36.974297,-29.181128,9.806565 172 | 171,IBSS,4,17,3,0,39.936886,-32.780727,9.806571 173 | 172,IBSS,4,18,3,0,41.186523,-34.977867,9.806611 174 | 173,IBSS,4,19,3,0,39.961308,-36.344109,9.806617 175 | 174,IBSS,4,20,3,0,40.490463,-37.594814,9.806611 176 | 175,IBSS,4,21,3,0,39.094543,-36.008404,9.80655 177 | 176,IBSS,4,22,3,0,36.493294,-41.202595,9.806551 178 | 177,IBSS,4,22,3,0,38.998352,-42.041222,9.806597 179 | 178,IBSS,4,23,3,0,34.574619,-40.787636,9.806586 180 | 179,IBSS,4,24,3,0,34.017178,-41.207268,9.806577 181 | 180,IBSS,4,25,3,0,29.535091,-40.741116,9.806643 182 | 181,IBSS,4,26,3,0,29.228855,-35.114189,9.80659 183 | 182,IBSS,4,27,3,0,25.194687,-34.635788,9.806592 184 | 183,IBSS,4,28,3,0,26.152706,-28.850449,9.806628 185 | 184,IBSS,4,29,3,0,32.210739,-24.345322,9.806644 186 | 185,IBSS,4,31,3,-0.000001,33.680431,-44.514961,9.80662 187 | 186,IBSS,4,32,3,0,29.950226,-51.82056,9.806576 188 | 187,IBSS,4,33,3,0,64.103249,-15.670307,9.806596 189 | 188,IBSS,4,34,3,0,46.348419,-48.561817,9.80663 190 | 189,IBSS,4,35,3,0,39.387329,-49.481548,9.806636 191 | 190,IBSS,4,36,3,0.000001,41.698105,-63.324528,9.806585 192 | 191,IBSS,4,37,3,0,28.576683,-80.267952,9.806643 193 | 192,IBSS,4,38,3,0,28.01479,-56.117935,9.806593 194 | 193,IBSS,4,39,3,0,21.7922,-62.038033,9.806575 195 | 194,IBSS,4,40,3,0,18.082117,-40.476585,9.806609 196 | 195,IBSS,4,41,3,0.000001,28.261784,-27.738914,9.806622 197 | 196,IBSS,4,42,3,0,32.585602,-28.565903,9.80663 198 | 197,IBSS,4,43,3,0,34.476639,-32.473515,9.806569 199 | 198,IBSS,4,44,3,0,34.306454,-33.261871,9.806586 200 | 199,IBSS,4,45,3,0,34.535538,-33.368031,9.806561 201 | 200,IBSS,4,46,3,0,35.939114,-33.751644,9.806623 202 | 201,IBSS,4,47,3,0,34.473476,-34.258118,9.80658 203 | 202,IBSS,4,48,3,0,33.459946,-36.396393,9.806589 204 | 203,IBSS,4,49,3,0,31.51923,-40.663197,9.806629 205 | 204,IBSS,4,50,3,0,30.614826,-43.236477,9.806565 206 | 205,IBSS,4,0,4,0,27.988543,-31.582623,9.806616 207 | 206,IBSS,4,1,4,0,25.5135,-30.712612,9.806596 208 | 207,IBSS,4,2,4,0,25.163797,-31.766083,9.806617 209 | 208,IBSS,4,3,4,0,25.838911,-33.203194,9.806635 210 | 209,IBSS,4,4,4,0,26.127453,-32.846481,9.806591 211 | 210,IBSS,4,5,4,0,27.057697,-32.212639,9.806613 212 | 211,IBSS,4,6,4,0,26.089958,-31.731382,9.80658 213 | 212,IBSS,4,7,4,0,27.387358,-29.069208,9.806647 214 | 213,IBSS,4,8,4,0,27.722786,-27.260281,9.806624 215 | 214,IBSS,4,9,4,0,26.044001,-27.1537,9.806606 216 | 215,IBSS,4,10,4,0,23.267578,-27.687403,9.806638 217 | 216,IBSS,4,11,4,0,20.986443,-25.637859,9.806606 218 | 217,IBSS,4,12,4,0,22.707537,-24.390955,9.806562 219 | 218,IBSS,4,13,4,0,22.05196,-20.812695,9.8066 220 | 219,IBSS,4,14,4,0,26.845152,-23.189394,9.80661 221 | 220,IBSS,4,15,4,0,33.495842,-24.586693,9.806602 222 | 221,IBSS,4,16,4,0,36.706257,-26.311279,9.806614 223 | 222,IBSS,4,17,4,-0.000001,41.007858,-30.836706,9.806558 224 | 223,IBSS,4,18,4,0,41.980408,-34.153328,9.806618 225 | 224,IBSS,4,19,4,0,41.114117,-35.773758,9.806558 226 | 225,IBSS,4,20,4,0,41.070152,-36.037746,9.806555 227 | 226,IBSS,4,21,4,0,38.693592,-35.345642,9.806562 228 | 227,IBSS,4,22,4,0,37.626251,-44.328888,9.806602 229 | 228,IBSS,4,23,4,0,35.468571,-39.340557,9.806616 230 | 229,IBSS,4,24,4,0,32.423553,-39.921047,9.80658 231 | 230,IBSS,4,25,4,0,29.018196,-39.530182,9.806644 232 | 231,IBSS,4,26,4,0.000001,27.797562,-33.941906,9.806597 233 | 232,IBSS,4,27,4,0,26.408958,-31.664696,9.806592 234 | 233,IBSS,4,28,4,0,26.633501,-30.687635,9.806561 235 | 234,IBSS,4,29,4,0,33.666512,-28.367216,9.806579 236 | 235,IBSS,4,30,4,0,30.359858,-32.575237,9.806599 237 | 236,IBSS,4,31,4,0,56.16515,-34.838795,9.806565 238 | 237,IBSS,4,32,4,0,28.38129,-32.615753,9.806561 239 | 238,IBSS,4,33,4,0.000001,38.196838,-28.252377,9.806614 240 | 239,IBSS,4,34,4,0,49.565334,-29.773224,9.806563 241 | 240,IBSS,4,35,4,0,42.006874,-47.379047,9.806608 242 | 241,IBSS,4,36,4,-0.000001,45.743511,-52.925102,9.806556 243 | 242,IBSS,4,37,4,0,32.305973,-69.774635,9.806611 244 | 243,IBSS,4,38,4,0,27.637144,-52.776207,9.806637 245 | 244,IBSS,4,39,4,0,36.417728,-47.659431,9.806603 246 | 245,IBSS,4,40,4,-0.000001,21.114517,-38.400299,9.806603 247 | 246,IBSS,4,41,4,0,31.583107,-25.405216,9.806597 248 | 247,IBSS,4,42,4,0,30.679485,-29.88578,9.806593 249 | 248,IBSS,4,43,4,0,32.817688,-33.653381,9.806619 250 | 249,IBSS,4,44,4,0,34.374176,-34.377068,9.806583 251 | 250,IBSS,4,45,4,0,34.763302,-33.997314,9.806604 252 | 251,IBSS,4,46,4,0,35.359726,-34.034191,9.806555 253 | 252,IBSS,4,47,4,0,34.581333,-34.809059,9.806593 254 | 253,IBSS,4,48,4,0,33.627014,-37.011997,9.806631 255 | 254,IBSS,4,49,4,-0.000001,33.090927,-39.36401,9.80659 256 | 255,IBSS,4,50,4,-0.000001,31.354143,-42.066303,9.806603 257 | 256,IBSS,4,0,5,-0.000001,27.032604,-22.831581,9.806604 258 | 257,IBSS,4,1,5,-0.000001,26.887867,-26.679005,9.806621 259 | 258,IBSS,4,2,5,-0.000001,25.073347,-30.183083,9.806616 260 | 259,IBSS,4,3,5,0,24.503954,-31.473476,9.806625 261 | 260,IBSS,4,4,5,-0.000001,25.514503,-32.36285,9.806596 262 | 261,IBSS,4,5,5,-0.000001,23.976873,-32.478722,9.806549 263 | 262,IBSS,4,6,5,0.000001,25.11982,-30.382111,9.806646 264 | 263,IBSS,4,7,5,0,26.714514,-29.418829,9.806576 265 | 264,IBSS,4,8,5,0,26.969893,-28.623972,9.806558 266 | 265,IBSS,4,9,5,-0.000001,24.984264,-28.764282,9.806563 267 | 266,IBSS,4,10,5,0,21.40086,-28.037628,9.806599 268 | 267,IBSS,4,11,5,-0.000001,19.432589,-25.223366,9.806575 269 | 268,IBSS,4,12,5,0,19.308573,-21.533024,9.806605 270 | 269,IBSS,4,13,5,0,20.238968,-18.814404,9.806572 271 | 270,IBSS,4,14,5,0,25.143154,-17.367962,9.806567 272 | 271,IBSS,4,15,5,0,31.800682,-19.463959,9.806615 273 | 272,IBSS,4,16,5,0,36.747616,-23.957882,9.806606 274 | 273,IBSS,4,17,5,0,39.572227,-27.112606,9.806553 275 | 274,IBSS,4,18,5,0,40.034489,-31.007074,9.806639 276 | 275,IBSS,4,19,5,0,40.689564,-33.45647,9.806608 277 | 276,IBSS,4,20,5,0,39.655212,-35.185658,9.80661 278 | 277,IBSS,4,21,5,0.000001,39.061676,-35.43317,9.806621 279 | 278,IBSS,4,22,5,0,36.638523,-37.419575,9.806623 280 | 279,IBSS,4,23,5,-0.000001,34.087349,-38.160507,9.806595 281 | 280,IBSS,4,24,5,0,33.487808,-40.991138,9.806615 282 | 281,IBSS,4,25,5,0,29.77689,-39.704731,9.806548 283 | 282,IBSS,4,26,5,0,29.088211,-37.054081,9.806578 284 | 283,IBSS,4,27,5,0,30.890028,-34.110828,9.806631 285 | 284,IBSS,4,28,5,0,30.706657,-30.683807,9.806608 286 | 285,IBSS,4,29,5,0,33.983917,-28.784885,9.80663 287 | 286,IBSS,4,30,5,0,35.602615,-28.488428,9.806596 288 | 287,IBSS,4,31,5,0,37.860176,-29.211803,9.80663 289 | 288,IBSS,4,32,5,0,36.958427,-29.666704,9.806629 290 | 289,IBSS,4,33,5,0,38.017761,-31.341391,9.806638 291 | 290,IBSS,4,34,5,0,37.025524,-33.788017,9.806619 292 | 291,IBSS,4,35,5,0,36.543919,-35.850143,9.806587 293 | 292,IBSS,4,36,5,0,34.989407,-39.245667,9.806631 294 | 293,IBSS,4,37,5,0,32.251877,-40.109806,9.806553 295 | 294,IBSS,4,38,5,0,27.622852,-37.706688,9.806634 296 | 295,IBSS,4,39,5,0,26.572285,-37.631168,9.806621 297 | 296,IBSS,4,40,5,0,26.258923,-36.157482,9.806602 298 | 297,IBSS,4,41,5,0,26.56242,-34.676014,9.806624 299 | 298,IBSS,4,42,5,0,27.014769,-33.423058,9.806574 300 | 299,IBSS,4,43,5,0,31.27483,-32.487648,9.806629 301 | 300,IBSS,4,44,5,0,31.890291,-34.327492,9.806557 302 | 301,IBSS,4,45,5,0,31.848499,-34.582409,9.80664 303 | 302,IBSS,4,46,5,0,31.486675,-34.979675,9.806613 304 | 303,IBSS,4,47,5,0,32.236786,-34.838757,9.806558 305 | 304,IBSS,4,48,5,0,32.463905,-37.422543,9.806606 306 | 305,IBSS,4,49,5,0,32.09668,-40.294018,9.80663 307 | 306,IBSS,4,50,5,0,38.212772,-44.585972,9.806591 308 | -------------------------------------------------------------------------------- /algorithm/waypoint_trace.csv: -------------------------------------------------------------------------------- 1 | Loc_x,Loc_y,Floor,Mag_x,Mag_y,Mag_z, 2 | 5.298645306,22.79605933,4,-2.198817039,23.68165812,-34.73901629,42.10053421 3 | 4.51591923,18.41387011,4,-3.316509212,22.59672251,-34.31016424,41.21648301 4 | 3.733193155,14.0316809,4,-3.404664869,22.29684423,-33.8813122,40.70238717 5 | 2.950467079,9.649491688,4,-3.492820526,22.98471143,-33.45246015,40.73774472 6 | 1.786964443,3.135477576,4,-4.76221154,11.85486733,-28.59608739,31.32016526 7 | 4.032623013,5.57012598,4,-3.370941148,22.03370239,-34.04536845,40.69317385 8 | 6.278281583,8.004774383,4,-0.712506282,25.03953072,-33.19740369,41.58789939 9 | 8.523940153,10.43942279,4,-0.448567588,21.42111369,-30.37226027,37.16906669 10 | 11.01506801,13.14019865,4,-1.344175862,16.72322842,-27.64252428,32.33546545 11 | 11.34396985,17.66706719,4,-1.269289675,16.18743443,-26.64079193,31.19897313 12 | 11.67287168,22.19393572,4,-0.141187286,15.65164044,-25.63905959,30.039227 13 | 12.24928652,30.12747075,4,1.835861474,17.91959048,-24.22646611,30.18946456 14 | 10.54747435,33.89920697,4,-1.176066966,17.48495685,-29.06666866,33.94080254 15 | 8.84566218,37.67094319,4,-0.56423283,20.63007303,-30.19390795,36.5730823 16 | 7.14385001,41.44267941,4,0.047601305,24.81443879,-31.13990249,39.81773682 17 | 3.937622191,48.54866079,4,-3.381640753,22.11719002,-33.99331793,40.69583827 18 | 3.651621746,45.25169399,4,-3.413851967,22.36852997,-33.83661959,40.705311 19 | 3.365621301,41.95472719,4,-3.446063181,22.61986991,-33.67992125,40.7169616 20 | 3.079620856,38.65776039,4,-3.478274395,22.87120985,-33.52322291,40.7307882 21 | 2.793620411,35.36079359,4,-3.510485609,23.12254979,-33.36652458,40.74678859 22 | 2.507619966,32.06382679,4,-3.542696823,23.37388973,-32.9130838,40.52357964 23 | 2.221619521,28.76685999,4,-3.574908037,23.62522968,-32.42551421,40.27834923 24 | 1.935619076,25.46989319,4,-3.607119251,23.87656962,-31.93794463,40.03915825 25 | 1.649618631,22.17292639,4,-3.639330465,24.12790956,-31.45037505,39.80611557 26 | 1.317857614,18.34843913,4,-3.676695529,24.41946433,-30.88479349,39.54363156 27 | 2.11622873,20.5684915,4,-3.586777827,23.71784812,-32.24584546,40.18949917 28 | 2.914599846,22.78854387,4,-3.496860125,23.0162319,-33.43280866,40.73975523 29 | 3.712970962,25.00859623,4,-3.406942423,22.31461568,-33.87023255,40.70309549 30 | 4.511342078,27.2286486,4,-3.317024721,22.59037812,-34.30765644,41.21095882 31 | 5.309713194,29.44870097,4,-2.182024765,23.69699931,-34.74508034,42.113295 32 | 6.10808431,31.66875333,4,-0.970730731,24.80362049,-33.60197147,41.77624198 33 | 6.906455426,33.8888057,4,0.132949214,25.39813761,-31.70420177,40.62313971 34 | 8.296691902,37.75467424,4,-0.36686748,21.97986501,-30.49823936,37.59510157 35 | 6.915959201,32.80739172,4,0.129532425,25.37477001,-31.68161081,40.59088808 36 | 6.749266055,35.56178104,4,0.00207453,25.69236169,-32.07784909,41.0984897 37 | 6.58257291,38.31617035,4,-0.250833433,25.46130854,-32.47408737,41.26629981 38 | 6.415879764,41.07055966,4,-0.503741395,25.23025538,-32.87032565,41.44005128 39 | 6.249186619,43.82494898,4,-0.756649358,24.99920222,-33.26656393,41.6196697 40 | 6.082493474,46.57933829,4,-1.009557321,24.76814907,-33.66280222,41.80507944 41 | 5.906073744,49.49444687,4,-1.277222523,24.5236139,-34.0821611,42.00753077 42 | 10.17580114,47.3506029,4,-1.042443315,18.09042709,-29.45652182,34.58376669 43 | 2.805720014,45.03229961,4,-3.509122874,23.11191654,-33.37315389,40.74606767 44 | 5.83933942,47.11449869,4,-1.378472289,24.43111354,-34.24079206,42.08576167 45 | 9.065426474,49.32880266,4,-0.643242312,20.08972304,-30.07207772,36.17099101 46 | 9.540029293,45.78809878,4,-0.813871134,19.12612439,-29.80897323,35.42662706 47 | 10.01463211,42.2473949,4,-0.984499956,18.35297777,-29.54586873,34.79596805 48 | 10.48923493,38.70669102,4,-1.155128777,17.57983115,-29.24404776,34.14087162 49 | 10.96383775,35.16598715,4,-1.325757599,16.80668453,-27.79855567,32.51125921 50 | 11.43844057,31.62528327,4,-0.945263962,16.03353791,-26.35306359,30.86181819 51 | 11.91304339,28.08457939,4,0.682579125,16.40826908,-24.9075715,29.83428106 52 | 12.48410155,23.82428477,4,2.641254967,18.97502017,-24.11982786,30.80249526 53 | 9.755899603,26.05773333,4,-0.891480653,18.77446318,-29.68930169,35.1387228 54 | 7.027697658,28.29118189,4,0.089360305,25.10003078,-31.41600268,40.21174896 55 | 3.482120528,31.19377645,4,-3.432942287,22.51748927,-33.74375065,40.71195308 56 | 4.412559609,28.00176371,4,-3.328150239,22.45345586,-34.25353398,41.0918344 57 | 5.342998689,24.80975097,4,-2.131523787,23.74313629,-34.76331731,42.15172766 58 | 6.27343777,21.61773823,4,-0.719855348,25.03281671,-33.20891769,41.59317634 59 | 7.203876851,18.42572549,4,0.026020504,24.66684655,-31.10406077,39.69781597 60 | 8.134315932,15.23371275,4,-0.308490202,22.37911028,-30.58825536,37.90199347 61 | 9.064755012,12.04170001,4,-0.643000908,20.09137401,-30.07244995,36.17221317 62 | 9.995194093,8.849687273,4,-0.977511615,18.38464306,-29.55664454,34.82162929 63 | 11.56462846,3.46550403,4,-0.42302692,4.871461765,-0.585779565,4.924756766 64 | 9.895237292,7.781735533,4,-0.941575226,18.54747662,-29.61205737,34.95381802 65 | 8.225846121,12.09796704,4,-0.341397062,22.15405854,-30.53751398,37.7287506 66 | 6.556454949,16.41419854,4,-0.290459779,25.42510646,-32.53617112,41.29313305 67 | 4.887063777,20.73043004,4,-2.823271307,23.11116549,-34.51351265,41.6326721 68 | 1.925257286,28.38821732,4,-3.608286262,23.88567566,-31.92028,40.03060712 69 | 2.384873985,25.46508054,4,-3.556521267,23.48176008,-32.70382815,40.41759859 70 | 2.844490683,22.54194375,4,-3.504756271,23.07784451,-33.39439617,40.74378381 71 | 3.304107382,19.61880696,4,-3.452991275,22.67392893,-33.64621806,40.71975186 72 | 3.76372408,16.69567017,4,-3.40122628,22.27001336,-33.89803995,40.7013384 73 | 4.223340779,13.77253339,4,-3.349461284,22.19117989,-34.14986184,40.86417036 74 | 4.682957477,10.8493966,4,-3.132942759,22.82825401,-34.40168374,41.40555947 75 | 5.142574175,7.926259811,4,-2.435609209,23.46532813,-34.65350563,41.92158476 76 | 5.602190874,5.003123023,4,-1.738275659,24.10240225,-34.80450649,42.37099324 77 | 6.315248203,0.468117839,4,-0.865439738,7.285411479,-10.17787866,12.54653021 78 | 6.373733675,3.535730977,4,-1.778181368,4.02843475,-4.53374153,6.32020789 79 | 6.432219148,6.603344115,4,-0.478951173,25.25290338,-32.83148609,41.42275947 80 | 6.49070462,9.670957253,4,-0.39021662,25.33397002,-32.69246308,41.36132793 81 | 6.549190093,12.73857039,4,-0.301482068,25.41503666,-32.55344006,41.30062275 82 | 6.607675565,15.80618353,4,-0.212747515,25.49610329,-32.41441705,41.24064715 83 | 6.666161037,18.87379667,4,-0.124012962,25.57716993,-32.27539404,41.18140432 84 | 6.72464651,21.94140981,4,-0.03527841,25.65823657,-32.13637103,41.12289741 85 | 6.783131982,25.00902294,4,0.053456143,25.70136167,-31.99734802,41.04135877 86 | 6.841617455,28.07663608,4,0.142190695,25.55755931,-31.85832501,40.84313808 87 | 6.900102927,31.14424922,4,0.135233059,25.41375695,-31.719302,40.64469768 88 | 6.958588399,34.21186236,4,0.11420641,25.26995459,-31.58027898,40.44623182 89 | 7.047032198,38.85081537,4,0.082409167,25.05249158,-31.37004347,40.1461549 90 | 6.386426135,34.16330327,4,-0.54842864,25.18942974,-32.94033846,41.47136413 91 | 5.725820072,29.47579118,4,-1.550704607,24.27376452,-34.51063345,42.22089708 92 | 5.065214009,24.78827908,4,-2.552980575,23.3580993,-34.61112035,41.833577 93 | 4.404607946,20.10076699,4,-3.329045807,22.44243408,-34.2491773,41.08225333 94 | 3.744001883,15.41325489,4,-3.403447521,22.28734541,-33.88723425,40.70201304 95 | 3.08339582,10.72574279,4,-3.477849234,22.86789238,-33.5252912,40.73059154 96 | 2.203842403,4.484629499,4,-2.451123046,5.718401985,-0.493592887,6.241134464 97 | 2.843621984,8.958458261,4,-3.504854109,23.07860793,-33.39392021,40.74383454 98 | 3.483401565,13.43228702,4,-3.432798008,22.51636348,-33.74445252,40.71190001 99 | 4.548741761,20.8819615,4,-3.312812527,22.64221777,-34.32814756,41.25610824 100 | 5.530770132,23.64709289,4,-1.84663569,24.00340605,-34.86619642,42.37009816 101 | 6.512798503,26.41222429,4,-0.356695633,25.36459432,-32.63994477,41.33830997 102 | 7.494826873,29.17735569,4,-0.078581613,23.95146719,-30.94276747,39.12970501 103 | 8.476855244,31.94248708,4,-0.431639659,21.53688468,-30.39836262,37.25700155 104 | 9.458883615,34.70761848,4,-0.784697705,19.25831388,-29.85395777,35.53529511 105 | 10.44091199,37.47274988,4,-1.137755751,17.65855112,-29.30955292,34.23695092 106 | 11.42785729,40.25172606,4,-0.981563617,16.05077849,-26.38529695,30.89943126 107 | 5.839802491,34.33243408,4,-1.377769713,24.43175541,-34.23969131,42.08521573 108 | 6.087640622,30.14738557,4,-1.001748033,24.77528352,-33.65056718,41.79926846 109 | 6.335478752,25.96233705,4,-0.625726353,25.11881164,-33.06144304,41.52595872 110 | 6.583316882,21.77728853,4,-0.249704673,25.46233976,-32.47231891,41.2655376 111 | 7.054866318,13.8146023,4,0.07959265,25.03322927,-31.35142136,40.11957782 112 | 4.012078865,17.43772778,4,-3.373254963,22.05175678,-34.0341124,40.69372966 113 | 1.198947615,22.79954453,4,-3.761087284,24.52396358,-30.68207737,39.45833802 114 | 6.380795982,25.40974471,4,-0.556970747,25.18162579,-32.95372163,41.4773705 115 | 7.962324256,28.68287482,4,-0.246655894,22.80199836,-30.683602,38.22924797 116 | 10.69290373,34.33408071,4,-1.228351621,17.24804668,-28.62373614,33.44132522 117 | 8.776450083,29.93285632,4,-0.539349753,20.8002497,-30.23227691,36.70057019 118 | 6.859996432,25.53163193,4,0.149652114,25.51236962,-31.81463722,40.78081094 119 | 4.226856125,19.4845035,4,-3.349065363,22.1960525,-34.15178789,40.86839367 120 | 1.669273471,27.63832706,4,-3.63711681,24.1106367,-31.48388235,39.821932 121 | 4.154156777,24.23007643,4,-3.357253232,22.09528403,-34.11195625,40.78110205 122 | 8.088138237,18.83425172,4,-0.291888435,22.49265064,-30.61385479,37.98963854 123 | 5.176882717,17.58695572,4,-2.383556059,23.51288315,-34.67230312,41.96076283 124 | 1.80306664,16.14148064,4,-3.622048161,23.99305797,-31.71197108,39.93037909 125 | 5.268160352,18.13539398,4,-2.245069017,23.63940296,-34.72231372,42.06543448 126 | 8.733254064,20.12930733,4,-0.523819956,20.9064588,-30.25622339,36.78034068 127 | 12.64129668,22.37810605,4,3.180419499,19.68156953,-24.0484397,31.23790485 128 | 11.17730151,19.12119789,4,-1.402501916,16.45894369,-27.14841168,31.77892535 129 | 9.713306333,15.86428972,4,-0.876167555,18.84384929,-29.71291402,35.19539154 130 | 8.24931116,12.60738156,4,-0.349833194,22.09636339,-30.52450572,37.68444119 131 | 5.708388638,6.954663936,4,-1.577151697,24.24960283,-34.55206888,42.24187625 132 | 7.670021153,10.37441838,4,-0.141567319,23.52070464,-30.84564541,38.7904296 133 | 9.631653668,13.79417282,4,-0.846811855,18.97686468,-29.75817963,35.304217 134 | 12.88108129,19.45896704,4,3.684761191,20.75933614,-23.93954458,31.90030245 135 | 11.745783,17.75292952,4,0.108891714,15.65647914,-25.41699444,29.85231654 136 | 10.61048472,16.04689201,4,-1.198720402,17.38231049,-28.87475875,33.72437311 137 | 9.475186428,14.34085449,4,-0.790558879,19.23175596,-29.84492002,35.51344353 138 | 8.33988814,12.63481697,4,-0.382397357,21.87365537,-30.47429276,37.51380475 139 | 7.204589853,10.92877945,4,0.025764166,24.66509345,-31.10366551,39.6964168 140 | 6.069291565,9.222741933,4,-1.029587345,24.74984992,-33.69418384,41.82000892 141 | 4.918616114,7.493596817,4,-2.775399888,23.15490014,-34.53080003,41.66807406 142 | 6.290870167,5.658116063,4,-0.693406798,25.05697974,-33.16747997,41.57420804 143 | 6.133329874,8.588988021,4,-0.932427991,24.83861334,-33.54196145,41.74792584 144 | 5.975789581,11.51985998,4,-1.171449185,24.62024694,-33.91644292,41.92676893 145 | 5.818249288,14.45073194,4,-1.410470379,24.40188054,-34.2909244,42.110672 146 | 5.660708995,17.3816039,4,-1.649491572,24.18351414,-34.66540587,42.29956906 147 | 5.503168701,20.31247585,4,-1.888512766,23.96514774,-34.85107373,42.33783328 148 | 5.345628408,23.24334781,4,-2.12753396,23.74678134,-34.76475812,42.1547676 149 | 5.188088115,26.17421977,4,-2.366555154,23.52841494,-34.67844251,41.97357821 150 | 5.030547822,29.10509173,4,-2.605576347,23.31004854,-34.5921269,41.7942895 151 | 4.757082932,34.19261925,4,-3.02047912,22.9309992,-34.44229674,41.48765868 152 | 4.990576056,31.53329719,4,-2.66622178,23.25464373,-34.57022655,41.74910487 153 | 5.22406918,28.87397513,4,-2.31196444,23.57828825,-34.69815637,42.01479396 154 | 5.457562304,26.21465307,4,-1.9577071,23.90193277,-34.82608619,42.28464599 155 | 5.691055428,23.55533101,4,-1.60344976,24.22557729,-34.59327082,42.26279726 156 | 5.924548552,20.89600895,4,-1.24919242,24.54922181,-34.03824552,41.98603257 157 | 6.158041676,18.23668689,4,-0.89493508,24.87286633,-33.48322021,41.72033586 158 | 6.549394838,13.7794503,4,-0.301171427,25.41532045,-32.55295337,41.30041152 159 | 7.013141708,11.76550101,4,0.094593448,25.13582052,-31.45060293,40.26113319 160 | 7.476888577,9.751551722,4,-0.072132451,23.99557334,-30.95271188,39.16456454 161 | 7.940635447,7.737602436,4,-0.238858351,22.85532617,-30.69562558,38.27067307 162 | 8.529956917,5.178310649,4,-0.45073073,21.40631985,-30.36892477,37.15784277 163 | 8.445159919,7.332536063,4,-0.420244581,21.61481622,-30.41593349,37.31629531 164 | 8.36036292,9.486761477,4,-0.389758433,21.82331259,-30.46294221,37.47532164 165 | 8.275565922,11.64098689,4,-0.359272285,22.03180895,-30.50995093,37.63491448 166 | 8.190768923,13.7952123,4,-0.328786136,22.24030532,-30.55695965,37.79506666 167 | 8.105971925,15.94943772,4,-0.298299988,22.44880169,-30.60396837,37.9557711 168 | 8.021174926,18.10366313,4,-0.26781384,22.65729806,-30.65097709,38.11702082 169 | 7.936377928,20.25788855,4,-0.237327691,22.86579443,-30.69798581,38.27880891 170 | 7.851580929,22.41211396,4,-0.206841543,23.0742908,-30.74499453,38.4411286 171 | 7.766783931,24.56633937,4,-0.176355395,23.28278716,-30.79200325,38.60397316 172 | 7.681986932,26.72056479,4,-0.145869246,23.49128353,-30.83901197,38.76733598 173 | 7.597189934,28.8747902,4,-0.115383098,23.6997799,-30.88602069,38.93121055 174 | 7.512392935,31.02901561,4,-0.08489695,23.90827627,-30.93302941,39.09559042 175 | 7.427595937,33.18324103,4,-0.054410801,24.11677264,-30.98003813,39.26046925 176 | 7.342798938,35.33746644,4,-0.023924653,24.32526901,-31.02704685,39.42584078 177 | 7.25800194,37.49169186,4,0.006561496,24.53376538,-31.07405557,39.59169883 178 | 7.173204941,39.64591727,4,0.037047644,24.74226174,-31.12106429,39.75803732 179 | 7.088407943,41.80014268,4,0.067533792,24.95075811,-31.27169117,40.00579408 180 | 6.931302104,45.79133809,4,0.124016356,25.33704533,-31.64513993,40.53882247 181 | 7.560034993,42.72441209,4,-0.102025184,23.79113538,-30.90661819,39.00317397 182 | 8.188767882,39.65748609,4,-0.328066723,22.24522542,-30.55806896,37.79885264 183 | 9.430832719,33.59875907,4,-0.77461287,19.30400989,-29.86950828,35.57291593 184 | 5.708312857,36.52783243,4,-1.577266673,24.24949779,-34.55224902,42.24196758 185 | 0.620723827,40.53101362,4,-6.501529371,22.16554382,-29.90136219,37.78455608 186 | 0.754713209,37.42503462,4,-5.866498179,22.75221036,-29.94921286,38.06618221 187 | 0.768896675,35.13505707,4,-5.799276854,22.81431203,-29.9542781,38.0970238 188 | 0.783080142,32.84507953,4,-5.732055529,22.87641371,-29.97311229,38.13888075 189 | 0.797263609,30.55510199,4,-5.664834204,22.93851539,-29.99729207,38.18511969 190 | 0.811447075,28.26512445,4,-5.59761288,23.00061706,-30.02147184,38.23153707 191 | 0.825630542,25.97514691,4,-5.530391555,23.06271874,-30.04565162,38.27813224 192 | 0.839814009,23.68516936,4,-5.46317023,23.12482042,-30.0698314,38.32490455 193 | 0.853997476,21.39519182,4,-5.395948905,23.18692209,-30.09401117,38.37185335 194 | 0.868180942,19.10521428,4,-5.32872758,23.24902377,-30.11819095,38.41897799 195 | 0.882364409,16.81523674,4,-5.261506255,23.31112544,-30.14237073,38.46627784 196 | 0.896547876,14.5252592,4,-5.19428493,23.37322712,-30.1665505,38.51375224 197 | 0.910731342,12.23528165,4,-5.127063606,23.4353288,-30.19073028,38.56140055 198 | 0.924914809,9.945304113,4,-5.059842281,23.49743047,-30.21491006,38.60922212 199 | 0.939098276,7.655326571,4,-4.992620956,23.55953215,-30.23908984,38.65721632 200 | 0.953281743,5.365349029,4,-4.925399631,23.62163383,-30.26326961,38.70538249 201 | 0.97278298,2.216796077,4,-1.458789154,13.89973732,-26.37134126,29.84591099 202 | 2.832320212,6.72490136,4,-3.506126988,23.08854003,-33.38772802,40.74449643 203 | 4.691857445,11.23300664,4,-3.119439669,22.84059024,-34.40655999,41.41539372 204 | 6.551394677,15.74111193,4,-0.298137258,25.41809243,-32.54819965,41.29834875 205 | 9.67563528,23.31525743,4,-0.862624089,18.90521691,-29.73379764,35.24556808 206 | 10.25454426,25.30224916,4,-1.070752977,17.96215146,-29.41286918,34.48046216 207 | 10.83345324,27.28924089,4,-1.278881865,17.01908601,-28.1956662,32.95876849 208 | 11.41236222,29.27623262,4,-1.034710254,16.07602057,-26.4324901,30.9545731 209 | 11.9912712,31.26322435,4,0.950893166,16.7598818,-24.669314,29.83911676 210 | 12.6727754,33.60235407,4,3.28838854,19.8230578,-24.03414404,31.32741929 211 | 11.07102014,31.2831951,4,-1.364291725,16.63208021,-27.47211156,32.14349542 212 | 9.469264882,28.96403614,4,-0.78842997,19.24140239,-29.84820273,35.52137939 213 | 7.867509626,26.64487717,4,-0.212568215,23.03512579,-30.73616417,38.41059741 214 | 6.265754369,24.3257182,4,-0.731512656,25.02216676,-33.22718153,41.60155685 215 | 4.663999113,22.00655923,4,-3.161706517,22.80197584,-34.39129654,41.38463202 216 | 2.427876592,18.76890881,4,-3.551678036,23.44396898,-32.7771384,40.45460295 217 | 2.260409621,22.2429648,4,-3.570539246,23.59114056,-32.49164304,40.31125812 218 | 2.09294265,25.71702079,4,-3.589400455,23.73831215,-32.20614767,40.16997893 219 | 1.881558506,30.10212638,4,-3.613207901,23.92407857,-31.84578293,39.99463335 220 | 1.437963069,33.26285792,4,-3.663168478,24.3139145,-31.0895476,39.63767414 221 | 0.994367631,36.42358947,4,-4.730676583,23.80152656,-30.33331226,38.84587237 222 | 0.258576925,41.66628744,4,-8.217893574,20.57989976,-29.77203124,37.11387737 223 | 2.744768982,38.41284925,4,-3.515987572,23.1654809,-33.31737214,40.73142472 224 | 5.230961039,35.15941105,4,-2.301508065,23.58784104,-34.70193239,42.02269977 225 | 8.457055707,30.93773414,4,-0.424521345,21.5855672,-30.40933884,37.29403195 226 | 8.508389149,26.15868513,4,-0.442976703,21.45935004,-30.38088124,37.1980897 227 | 8.594205703,18.16932197,4,-0.473829401,21.24834682,-30.33330731,37.03817341 228 | 8.513058753,25.69628167,4,-0.444655515,21.44786856,-30.37829256,37.18937272 229 | 7.912800704,28.7449345,4,-0.228851227,22.92376541,-30.71105626,38.32388772 230 | 7.312542656,31.79358733,4,-0.013046939,24.39966227,-31.04381996,39.48496481 231 | 6.712284608,34.84224016,4,-0.054033971,25.64110176,-32.16575592,41.13520235 232 | 6.112026559,37.89089299,4,-0.964749524,24.80908484,-33.59260053,41.77181158 233 | 5.511768511,40.93954582,4,-1.875465077,23.97706792,-34.85578552,42.34787999 234 | 4.911510463,43.98819865,4,-2.78618063,23.14505101,-34.52690688,41.66009466 235 | 3.791960699,49.6742841,4,-3.39804609,22.24519874,-33.91351067,40.70039054 236 | 4.259724415,47.46227808,4,-3.345363524,22.2416112,-34.16979627,40.90789292 237 | 4.727488131,45.25027206,4,-3.06538055,22.88997789,-34.42608188,41.45482794 238 | 5.195251848,43.03826604,4,-2.35568629,23.53834458,-34.68236749,41.98177626 239 | 5.663015564,40.82626002,4,-1.64599203,24.18671127,-34.65992304,42.29676769 240 | 6.13077928,38.61425401,4,-0.93629777,24.83507796,-33.54802434,41.75078069 241 | 6.598542997,36.40224799,4,-0.226603509,25.48344465,-32.43612564,41.24996421 242 | 7.267236136,33.2400676,4,0.003241625,24.5110606,-31.06893643,39.57361385 243 | 6.78508136,30.41908808,4,0.056413752,25.6965686,-31.99271425,41.03474851 244 | 6.302926584,27.59810857,4,-0.675114721,25.07369112,-33.13882124,41.56112654 245 | 5.820771808,24.77712905,4,-1.406643194,24.405377,-34.28492824,42.10768785 246 | 5.338617032,21.95614953,4,-2.138171667,23.73706288,-34.76091662,42.14666364 247 | 4.856462256,19.13517002,4,-2.86970014,23.06874876,-34.49674621,41.5984116 248 | 4.37430748,16.3141905,4,-3.332458441,22.40043464,-34.23257581,41.04575493 249 | 3.830819043,13.13436148,4,-3.393669612,22.21104966,-33.93480098,40.69912085 250 | 4.995248961,16.87888222,4,-2.659132016,23.26112083,-34.57278682,41.75438077 251 | 6.15967888,20.62340296,4,-0.892451103,24.87513566,-33.47932849,41.71851243 252 | 7.324108798,24.3679237,4,-0.017205189,24.37122378,-31.03740806,39.46235603 253 | 8.488538716,28.11244444,4,-0.435840092,21.5081577,-30.39188568,37.23516509 254 | 9.652968634,31.85696519,4,-0.854474994,18.94214177,-29.7463633,35.27578478 255 | 11.05392312,36.36209088,4,-1.35814502,16.65993192,-27.52418373,32.20215179 256 | 9.47315071,40.20405437,4,-0.789827,19.23507222,-29.84604855,35.51617159 257 | 7.892378296,44.04601785,4,-0.221508979,22.97397943,-30.72237778,38.36296774 258 | 5.51987213,49.8122382,4,-1.863170211,23.98830034,-34.86022546,42.35735208 259 | 5.39488428,45.53825043,4,-2.05280262,23.81505484,-34.79174519,42.21180367 260 | 5.269896429,41.26426266,4,-2.242435028,23.64180934,-34.72326491,42.06743146 261 | 5.144908579,36.99027489,4,-2.432067437,23.46856384,-34.65478464,41.92424763 262 | 5.019920728,32.71628712,4,-2.621699845,23.29531834,-34.58630437,41.78226437 263 | 4.894932878,28.44229935,4,-2.811332254,23.12207284,-34.51782409,41.64149399 264 | 4.769945027,24.16831158,4,-3.000964663,22.94882734,-34.44934382,41.50194881 265 | 4.644957177,19.8943238,4,-3.190597071,22.77558184,-34.38086355,41.36364123 266 | 4.519969326,15.62033603,4,-3.316053065,22.60233634,-34.31238327,41.22137142 267 | 4.394981475,11.34634826,4,-3.330130002,22.42909084,-34.243903,41.07065588 268 | 4.269993625,7.072360491,4,-3.34420694,22.25584534,-34.17542273,40.92023815 269 | 4.100626868,1.280825985,4,1.011313342,0.604341341,-20.89212836,20.92531984 270 | 4.559570052,5.698960069,4,-3.311592976,22.65722685,-34.33408033,41.26918522 271 | 5.018513236,10.11709415,4,-2.623835303,23.29336742,-34.58553321,41.78067238 272 | 5.47745642,14.53522824,4,-1.927523613,23.92950798,-34.83698608,42.30782787 273 | 5.936399604,18.95336232,4,-1.231211924,24.56564854,-34.01007495,41.97227858 274 | 6.395342788,23.3714964,4,-0.534900235,25.2017891,-32.91914312,41.46186532 275 | 6.854285971,27.78963049,4,0.151705134,25.52641034,-31.82821128,40.80019207 276 | 7.313229155,32.20776457,4,-0.013293748,24.39797432,-31.04343938,39.48362264 277 | 7.941445146,38.25544668,4,-0.239149453,22.8533353,-30.69517671,38.26912593 278 | 7.006154519,34.57196974,4,0.097105477,25.15300041,-31.46721184,40.28483934 279 | 6.070863891,30.8884928,4,-1.027201801,24.75202932,-33.69044634,41.81822896 280 | 5.135573264,27.20501587,4,-2.446231039,23.45562417,-34.64966986,41.91360129 281 | 4.200282637,23.52153893,4,-3.352058241,22.15921902,-34.13722839,40.83647444 282 | 3.264992009,19.838062,4,-3.457396701,22.7083039,-33.62478692,40.72157848 283 | 2.329701382,16.15458506,4,-3.562735161,23.5302463,-32.60977067,40.37031974 284 | 0.99083628,10.88170135,4,-4.747413119,23.7860647,-30.32729207,38.83374112 285 | 3.293472585,10.12128923,4,-3.454189035,22.68327489,-33.6403913,40.72024446 286 | 5.59610889,9.360877107,4,-1.747503287,24.09397202,-34.81896368,42.37845546 287 | 9.768275876,7.983079695,4,-0.895930161,18.75430175,-29.68244068,35.12226943 288 | 5.252251374,7.550365019,4,-2.269206224,23.61735155,-34.71359727,42.04714528 289 | 4.878749314,10.44391513,4,-2.835886066,23.09964082,-34.50895719,41.62335621 290 | 4.505247253,13.33746523,4,-3.317711159,22.58193009,-34.30431712,41.20360356 291 | 4.131745192,16.23101534,4,-3.359777369,22.06421936,-34.09967704,40.75421272 292 | 3.758243132,19.12456545,4,-3.401843579,22.27483007,-33.89503696,40.70152485 293 | 3.384741071,22.01811556,4,-3.443909789,22.60306727,-33.69039689,40.71611483 294 | 3.01123901,24.91166567,4,-3.485975999,22.93130447,-33.48575681,40.7344162 295 | 2.637736949,27.80521577,4,-3.528042209,23.25954168,-33.13490542,40.63711749 296 | 2.264234889,30.69876588,4,-3.570108419,23.58777888,-32.4981643,40.31450942 297 | 1.890732828,33.59231599,4,-3.612174629,23.91601608,-31.86142318,40.00217392 298 | 1.517230767,36.4858661,4,-3.654240839,24.24425329,-31.22468207,39.70035344 299 | 1.143728707,39.3794162,4,-4.022792568,24.45549737,-30.58794095,39.36846889 300 | 0.647240648,43.2257486,4,-6.37585517,22.28164654,-29.91083195,37.83888436 301 | 6.738412804,39.81183977,4,-0.014392096,25.67731802,-32.10364783,41.10923341 302 | 4.305631872,36.76934437,4,-3.34019313,22.30524347,-34.19494876,40.96309677 303 | 3.725412555,33.63036514,4,-3.40554117,22.30368189,-33.87704924,40.70265841 304 | 3.145193238,30.49138592,4,-3.470889211,22.81358421,-33.55914972,40.72742598 305 | 2.564973921,27.35240669,4,-3.536237251,23.32348653,-33.01086002,40.57347504 306 | 1.984754604,24.21342746,4,-3.601585291,23.83338884,-32.0217102,40.07981742 307 | 1.404535287,21.07444824,4,-3.666933331,24.34329116,-31.03256038,39.61138761 308 | 0.54891758,16.44556718,4,-6.841848922,21.85114337,-29.87571853,37.64096069 309 | 1.750381463,14.40708949,4,-3.627981905,24.03935821,-31.62215413,39.88751218 310 | 2.951845346,12.3686118,4,-3.492665297,22.9835002,-33.4532153,40.73766814 311 | 4.153309229,10.33013411,4,-3.357348689,22.09410924,-34.11149188,40.78008499 312 | 5.354773112,8.291656415,4,-2.113659554,23.7594568,-34.76976846,42.16534291 313 | 6.556236995,6.253178725,4,-0.29079046,25.42480436,-32.53668921,41.29335758 314 | 7.757700878,4.214701035,4,-3.634710024,9.047233725,-14.82851559,17.74678646 315 | 9.793253105,0.76105764,4,-2.938567846,17.32323001,-22.89481579,28.86004277 316 | 5.601173181,0.520545454,4,-0.533901285,9.244198956,-12.73749357,15.74750797 317 | 5.694482872,4.341649862,4,-2.923494858,0.764768007,-9.018045102,9.510879547 318 | 5.787792564,8.16275427,4,-1.456679526,24.35966451,-34.36332162,42.14680347 319 | 5.881102255,11.98385868,4,-1.315109433,24.48900096,-34.14151962,42.03669876 320 | 5.974411947,15.80496309,4,-1.173539341,24.6183374,-33.91971763,41.92835526 321 | 6.067721638,19.62606749,4,-1.031969249,24.74767384,-33.69791564,41.82178666 322 | 6.16103133,23.4471719,4,-0.890399157,24.87701029,-33.47611365,41.71700656 323 | 6.254341021,27.26827631,4,-0.748829064,25.00634673,-33.25431165,41.61402847 324 | 6.347650713,31.08938072,4,-0.607258972,25.13568318,-33.03250966,41.5128658 325 | 6.440960404,34.91048512,4,-0.46568888,25.26501962,-32.81070767,41.41353185 326 | 6.534270095,38.73158953,4,-0.324118788,25.39435607,-32.58890567,41.31603982 327 | 6.627579787,42.55269394,4,-0.182548695,25.52369251,-32.36710368,41.22040277 328 | 6.720889478,46.37379835,4,-0.040978603,25.65302896,-32.14530169,41.12663364 329 | 6.818432802,50.36827329,4,0.107014785,25.61456506,-31.91343613,40.92169108 330 | 6.68185811,45.92790336,4,-0.100197259,25.59892763,-32.23808128,41.16562911 331 | 6.545283417,41.48753343,4,-0.307409302,25.40962162,-32.56272644,41.30465499 332 | 6.408708725,37.0471635,4,-0.514621345,25.22031561,-32.88737159,41.44765813 333 | 6.272134032,32.60679356,4,-0.721833388,25.0310096,-33.21201674,41.5945975 334 | 6.13555934,28.16642363,4,-0.929045431,24.8417036,-33.53666189,41.74543153 335 | 5.998984647,23.7260537,4,-1.136257474,24.65239759,-33.86130704,41.90011817 336 | 5.862409955,19.28568377,4,-1.343469517,24.46309158,-34.18595219,42.0586149 337 | 5.725835262,14.84531384,4,-1.550681561,24.27378558,-34.51059735,42.22087882 338 | 5.474399092,6.67052252,4,-1.932162211,23.92527022,-34.83531099,42.30426335 339 | 3.236308802,4.423385873,4,-2.617997823,3.450871064,-3.768940492,5.741718917 340 | 3.240462104,8.372747797,4,-3.460159417,22.72986101,-33.6113471,40.72274474 341 | 3.244615406,12.32210972,4,-3.459691645,22.72621105,-33.61362268,40.72254614 342 | 3.248768707,16.27147165,4,-3.459223873,22.72256109,-33.61589825,40.72234801 343 | 3.252922009,20.22083357,4,-3.458756102,22.71891113,-33.61817383,40.72215034 344 | 3.257075311,24.1701955,4,-3.45828833,22.71526117,-33.6204494,40.72195312 345 | 3.261228612,28.11955742,4,-3.457820559,22.71161121,-33.62272498,40.72175636 346 | 3.265381914,32.06891934,4,-3.457352787,22.70796125,-33.62500055,40.72156007 347 | 3.269535215,36.01828127,4,-3.456885015,22.70431128,-33.62727613,40.72136423 348 | 3.277294127,43.39620673,4,-3.456011157,22.69749268,-33.6315272,40.7209996 349 | 4.651657896,38.9865527,4,-3.180430694,22.7848697,-34.38453484,41.37102443 350 | 6.550068353,32.89549186,4,-0.300149565,25.41625401,-32.55135239,41.29971671 351 | 6.82416709,30.37355567,4,0.115714885,25.60046576,-31.89980543,40.90225939 352 | 7.098265828,27.85161949,4,0.063989693,24.92651983,-31.24825847,39.97235473 353 | 7.372364565,25.3296833,4,-0.034554063,24.25257391,-31.01065662,39.36812619 354 | 7.646463302,22.80774712,4,-0.133097819,23.57862799,-30.85870512,38.83592531 355 | 7.920562039,20.28581094,4,-0.231641576,22.90468207,-30.70675363,38.3090438 356 | 8.194660776,17.76387475,4,-0.330185332,22.23073615,-30.55480213,37.78770415 357 | 8.468759514,15.24193857,4,-0.428729089,21.55679023,-30.40285063,37.27213893 358 | 8.742858251,12.72000238,4,-0.527272845,20.88284431,-30.25089913,36.76259106 359 | 9.016956988,10.1980662,4,-0.625816601,20.20889838,-30.09894764,36.25931424 360 | 9.291055725,7.676130012,4,-0.724360358,19.53495246,-29.94699614,35.76257322 361 | 9.793425399,3.053911501,4,-3.261337191,15.14673789,-26.3263148,30.54725585 362 | 1.9922712,1.067645904,4,2.636669465,21.17097853,-35.29121331,41.23872082 363 | 2.508520771,3.675673393,4,-0.544947851,0.627627737,-13.69198506,13.71719139 364 | 3.024770343,6.283700882,4,-3.484452013,22.91941301,-33.49317057,40.73368843 365 | 3.541019915,8.891728371,4,-3.426308658,22.46572792,-33.77602135,40.70955834 366 | 4.057269486,11.49975586,4,-3.368165304,22.01204283,-34.05887214,40.6925219 367 | 4.573519058,14.10778335,4,-3.298983466,22.67656155,-34.34172293,41.28515071 368 | 5.089768629,16.71581084,4,-2.515726139,23.39213443,-34.62457371,41.86146122 369 | 5.606018201,19.32383833,4,-1.732468813,24.1077073,-34.79540874,42.3663011 370 | 6.122267773,21.93186582,4,-0.949211486,24.82328017,-33.56825664,41.76031722 371 | 6.638517344,24.5398933,4,-0.16595416,25.53885305,-32.34110454,41.20931446 372 | 7.154766916,27.14792079,4,0.043676468,24.78759662,-31.13128574,39.7942685 373 | 7.671016488,29.75594828,4,-0.141925161,23.51825734,-30.84509363,38.78850825 374 | 8.187266059,32.36397577,4,-0.327526789,22.24891806,-30.55890152,37.80169429 375 | 8.703515631,34.97200326,4,-0.513128418,20.97957878,-30.27270941,36.83534935 376 | 9.219765203,37.58003075,4,-0.698730047,19.7102395,-29.98651731,35.89112683 377 | 9.910755015,41.07082381,4,-0.947154145,18.52219764,-29.60345485,34.93327132 378 | 8.540385253,38.12633114,4,-0.454479917,21.38067896,-30.36314363,37.13839625 379 | 7.170015492,35.18183847,4,0.038194312,24.75010387,-31.12283242,39.76430306 380 | 5.799645731,32.2373458,4,-1.438695821,24.37609417,-34.33514602,42.13271965 381 | 4.429275969,29.29285313,4,-3.326267535,22.47662639,-34.2626928,41.11198009 382 | 3.058906208,26.34836046,4,-3.480607412,22.88941408,-33.51187345,40.7318741 383 | 0.379974206,20.59218001,4,-7.642541562,21.11143235,-29.81538499,37.32369488 384 | 0.977265511,23.46223646,4,-4.811730617,23.72664569,-30.30415681,38.78721937 385 | 1.574556815,26.33229291,4,-3.64778441,24.19387461,-31.32241071,39.74598486 386 | 2.171848119,29.20234937,4,-3.580513613,23.66896926,-32.34066462,40.23628676 387 | 2.769139424,32.07240582,4,-3.513242816,23.14406392,-33.35311155,40.7482591 388 | 3.366430728,34.94246228,4,-3.445972018,22.61915858,-33.68036474,40.71692555 389 | 3.963722032,37.81251873,4,-3.378701221,22.09425323,-34.00761792,40.69508231 390 | 4.678145323,41.24540845,4,-3.140243792,22.82158388,-34.39904718,41.40024479 391 | 3.136369212,42.10693628,4,-3.471883029,22.82133885,-33.55431508,40.72787177 392 | 2.935188839,39.30690298,4,-3.49454126,22.9981381,-33.44408927,40.73859695 393 | 2.734008467,36.50686969,4,-3.51719949,23.17493734,-33.29902776,40.72190643 394 | 2.532828095,33.7068364,4,-3.539857721,23.35173659,-32.95605826,40.54548027 395 | 2.331647723,30.90680311,4,-3.562515951,23.52853583,-32.61308876,40.37198381 396 | 2.130467351,28.10676981,4,-3.585174182,23.70533508,-32.27011926,40.20145498 397 | 1.929286979,25.30673652,4,-3.607832412,23.88213433,-31.92714976,40.03393169 398 | 1.728106606,22.50670323,4,-3.630490643,24.05893357,-31.58418026,39.86945184 399 | 1.526926234,19.70666994,4,-3.653148873,24.23573282,-31.24121076,39.70805324 400 | 1.325745862,16.90663664,4,-3.675807104,24.41253206,-30.89824126,39.54977361 401 | 1.12456549,14.10660335,4,-4.113614991,24.37159208,-30.55527176,39.3003939 402 | -------------------------------------------------------------------------------- /floor5_new_data.csv: -------------------------------------------------------------------------------- 1 | ID,BUILDING,FLOOR,LOC_X,LOC_Y,MAG_X,MAG_Y,MAG_Z,G 2 | 1,IBSS,5,0,0,0,25.828617,-28.685183,9.806577 3 | 2,IBSS,5,1,0,0,30.582264,-26.536137,9.80663 4 | 3,IBSS,5,2,0,-0.000001,27.197075,-23.733107,9.806599 5 | 4,IBSS,5,3,0,-0.000001,29.218052,-22.29553,9.806585 6 | 5,IBSS,5,4,0,0,24.842531,-22.799934,9.806636 7 | 6,IBSS,5,5,0,0,28.575375,-20.265488,9.806549 8 | 7,IBSS,5,6,0,-0.000001,31.676973,-25.566601,9.806592 9 | 8,IBSS,5,7,0,0,33.136116,-28.817413,9.80656 10 | 9,IBSS,5,8,0,-0.000001,31.638348,-29.528578,9.806632 11 | 10,IBSS,5,9,0,0,31.452923,-30.999039,9.806559 12 | 11,IBSS,5,10,0,0,29.899551,-31.762743,9.806552 13 | 12,IBSS,5,11,0,0,28.95252,-31.688454,9.806611 14 | 13,IBSS,5,12,0,0,26.558552,-27.970877,9.806623 15 | 14,IBSS,5,13,0,0,27.55983,-29.392389,9.806615 16 | 15,IBSS,5,14,0,0,25.084644,-29.663261,9.806615 17 | 16,IBSS,5,15,0,0,25.486389,-28.333096,9.806556 18 | 17,IBSS,5,16,0,-0.000001,31.683157,-31.746216,9.80659 19 | 18,IBSS,5,17,0,0,31.728256,-30.79236,9.806594 20 | 19,IBSS,5,18,0,0,35.823601,-27.998213,9.806606 21 | 20,IBSS,5,19,0,0,35.67548,-29.499517,9.806569 22 | 21,IBSS,5,20,0,-0.000001,36.218399,-22.355122,9.806568 23 | 22,IBSS,5,21,0,0,39.094856,-25.108644,9.80658 24 | 23,IBSS,5,22,0,0,38.263607,-26.381336,9.8066 25 | 24,IBSS,5,23,0,-0.000001,37.187706,-27.055353,9.806592 26 | 25,IBSS,5,24,0,0,36.71767,-25.518764,9.80657 27 | 26,IBSS,5,25,0,-0.000001,34.839104,-27.27017,9.806557 28 | 27,IBSS,5,26,0,0,34.571606,-26.850851,9.806615 29 | 28,IBSS,5,27,0,-0.000001,32.630138,-26.246071,9.806582 30 | 29,IBSS,5,28,0,-0.000002,33.839809,-25.784641,9.80664 31 | 30,IBSS,5,29,0,0,31.771179,-26.737705,9.806648 32 | 31,IBSS,5,30,0,0,32.206108,-25.159044,9.806604 33 | 32,IBSS,5,31,0,0.000001,32.310421,-24.285849,9.806559 34 | 33,IBSS,5,32,0,0,36.969707,-24.038925,9.806554 35 | 34,IBSS,5,33,0,0,33.420116,-25.87368,9.806596 36 | 35,IBSS,5,34,0,0,32.244804,-28.220028,9.806571 37 | 36,IBSS,5,35,0,0,30.698557,-26.096748,9.806606 38 | 37,IBSS,5,36,0,0,32.875427,-23.19001,9.806642 39 | 38,IBSS,5,37,0,0,34.692665,-22.369003,9.806588 40 | 39,IBSS,5,38,0,0,35.927513,-22.549582,9.806617 41 | 40,IBSS,5,39,0,0,38.410297,-22.916216,9.806623 42 | 41,IBSS,5,40,0,0,37.038502,-24.665281,9.806629 43 | 42,IBSS,5,41,0,-0.000001,33.872208,-26.751341,9.806584 44 | 43,IBSS,5,42,0,0,30.050575,-28.265034,9.806602 45 | 44,IBSS,5,43,0,0,33.001839,-26.402973,9.806586 46 | 45,IBSS,5,44,0,0,36.323528,-28.839464,9.806624 47 | 46,IBSS,5,45,0,0,34.536999,-33.057247,9.806595 48 | 47,IBSS,5,46,0,-0.000001,34.160286,-35.75613,9.806611 49 | 48,IBSS,5,47,0,0,33.802811,-38.788776,9.806645 50 | 49,IBSS,5,48,0,0,27.571014,-40.213486,9.806563 51 | 50,IBSS,5,49,0,0,24.459059,-38.277321,9.806571 52 | 51,IBSS,5,50,0,0,23.622116,-36.042934,9.806639 53 | 52,IBSS,5,0,1,0,24.219872,-33.254749,9.806585 54 | 53,IBSS,5,1,1,0,25.49568,-31.596292,9.806618 55 | 54,IBSS,5,2,1,0,23.190363,-31.898642,9.806566 56 | 55,IBSS,5,3,1,0,23.465971,-28.313753,9.806579 57 | 56,IBSS,5,4,1,0,22.755148,-25.359833,9.80658 58 | 57,IBSS,5,5,1,0,26.025284,-24.927414,9.806605 59 | 58,IBSS,5,6,1,0,28.18396,-27.579651,9.806574 60 | 59,IBSS,5,7,1,0,29.251375,-31.603951,9.806637 61 | 60,IBSS,5,8,1,0,27.973112,-33.972206,9.806577 62 | 61,IBSS,5,9,1,0,25.346596,-36.435242,9.806593 63 | 62,IBSS,5,10,1,0,24.629995,-32.368607,9.806579 64 | 63,IBSS,5,11,1,0,25.928249,-32.062183,9.806613 65 | 64,IBSS,5,12,1,0,25.91433,-32.408798,9.80662 66 | 65,IBSS,5,13,1,-0.000001,26.669516,-33.754032,9.80657 67 | 66,IBSS,5,14,1,0,21.96121,-33.084553,9.806577 68 | 67,IBSS,5,15,1,0,22.055813,-28.644407,9.80656 69 | 68,IBSS,5,16,1,0,26.458237,-25.100903,9.806621 70 | 69,IBSS,5,17,1,0,29.711199,-23.405029,9.806573 71 | 70,IBSS,5,18,1,0,35.669697,-25.46521,9.80654 72 | 71,IBSS,5,19,1,0,33.909924,-27.932323,9.806578 73 | 72,IBSS,5,20,1,0,38.95153,-26.593607,9.806551 74 | 73,IBSS,5,21,1,0,41.135727,-29.989914,9.806572 75 | 74,IBSS,5,22,1,0,38.38208,-31.606148,9.806586 76 | 75,IBSS,5,23,1,0,37.789852,-28.761507,9.806564 77 | 76,IBSS,5,24,1,0,37.577217,-26.96945,9.806584 78 | 77,IBSS,5,25,1,0,36.674866,-28.11204,9.806545 79 | 78,IBSS,5,26,1,0,33.038189,-28.03014,9.806615 80 | 79,IBSS,5,27,1,0,30.82107,-26.958649,9.806626 81 | 80,IBSS,5,28,1,0,30.758976,-28.318819,9.806619 82 | 81,IBSS,5,29,1,0,27.606689,-27.935888,9.806596 83 | 82,IBSS,5,30,1,0,27.054947,-26.425133,9.806619 84 | 83,IBSS,5,31,1,0,30.461872,-25.643442,9.806624 85 | 84,IBSS,5,32,1,0,33.113953,-22.913507,9.806545 86 | 85,IBSS,5,33,1,0,36.215679,-26.813791,9.806561 87 | 86,IBSS,5,34,1,0,32.735397,-28.47044,9.806547 88 | 87,IBSS,5,35,1,0,30.658306,-25.278954,9.806565 89 | 88,IBSS,5,36,1,0,30.361195,-23.327049,9.806558 90 | 89,IBSS,5,37,1,0,32.216824,-19.584114,9.806559 91 | 90,IBSS,5,38,1,0,37.648544,-20.705929,9.806637 92 | 91,IBSS,5,39,1,0,35.59166,-27.469713,9.806552 93 | 92,IBSS,5,40,1,0,32.789165,-27.479315,9.806552 94 | 93,IBSS,5,41,1,0,31.504547,-24.428038,9.806635 95 | 94,IBSS,5,42,1,0,32.353569,-24.795824,9.806564 96 | 95,IBSS,5,43,1,0,31.342882,-26.878466,9.806583 97 | 96,IBSS,5,44,1,0,34.570107,-28.588562,9.80659 98 | 97,IBSS,5,45,1,0,33.332191,-31.822758,9.806585 99 | 98,IBSS,5,46,1,0,30.584991,-31.31674,9.806592 100 | 99,IBSS,5,47,1,0,34.089863,-34.473644,9.806548 101 | 100,IBSS,5,48,1,0,30.80946,-37.591557,9.806595 102 | 101,IBSS,5,49,1,0,27.863359,-38.757465,9.806606 103 | 102,IBSS,5,50,1,0.000004,32.200165,-32.015266,9.806541 104 | 103,IBSS,5,0,2,0,36.093811,-45.334072,9.806613 105 | 104,IBSS,5,1,2,0.000001,24.221413,-42.883369,9.806559 106 | 105,IBSS,5,2,2,0,21.45437,-34.285095,9.806555 107 | 106,IBSS,5,3,2,0,21.896179,-29.075043,9.806581 108 | 107,IBSS,5,4,2,0,24.784189,-30.93166,9.806555 109 | 108,IBSS,5,5,2,0,31.708841,-15.615825,9.806598 110 | 109,IBSS,5,6,2,0.000001,44.414948,-20.499434,9.80662 111 | 110,IBSS,5,7,2,0,23.078764,-34.393169,9.806608 112 | 111,IBSS,5,8,2,0,40.644558,-37.516411,9.806552 113 | 112,IBSS,5,9,2,0.000001,30.563299,-51.690353,9.806615 114 | 113,IBSS,5,10,2,0,29.468605,-36.899937,9.806579 115 | 114,IBSS,5,11,2,0,30.328215,-36.149647,9.806556 116 | 115,IBSS,5,12,2,0,27.652187,-37.584911,9.806628 117 | 116,IBSS,5,13,2,0,21.055853,-32.332001,9.806637 118 | 117,IBSS,5,14,2,0,14.309853,-44.906956,9.806549 119 | 118,IBSS,5,15,2,0,21.593742,-28.637472,9.806605 120 | 119,IBSS,5,16,2,0,22.539684,-24.843609,9.806641 121 | 120,IBSS,5,17,2,0,27.357645,-16.091673,9.806646 122 | 121,IBSS,5,18,2,0,44.798698,-28.673662,9.806584 123 | 122,IBSS,5,19,2,0,26.057043,-32.876534,9.806551 124 | 123,IBSS,5,20,2,0,40.437012,-35.732838,9.80662 125 | 124,IBSS,5,21,2,0,49.279373,-36.960716,9.806547 126 | 125,IBSS,5,22,2,0,38.877151,-49.28334,9.806623 127 | 126,IBSS,5,23,2,0,32.694195,-46.591507,9.806539 128 | 127,IBSS,5,24,2,0,35.524475,-30.276133,9.806586 129 | 128,IBSS,5,25,2,0,33.656586,-25.280689,9.806551 130 | 129,IBSS,5,26,2,0,37.001846,-35.454144,9.8066 131 | 130,IBSS,5,27,2,0,33.362408,-38.02113,9.806588 132 | 131,IBSS,5,28,2,0,27.253853,-34.528534,9.806564 133 | 132,IBSS,5,29,2,0.000001,20.862305,-33.338966,9.80658 134 | 133,IBSS,5,30,2,0,24.023876,-20.943327,9.806627 135 | 134,IBSS,5,31,2,0,26.036201,-12.963249,9.806644 136 | 135,IBSS,5,32,2,0,36.423721,-13.96549,9.806593 137 | 136,IBSS,5,33,2,0,39.757011,-28.670286,9.806605 138 | 137,IBSS,5,34,2,0,27.841061,-22.23201,9.806582 139 | 138,IBSS,5,35,2,0,22.204405,-15.759282,9.806554 140 | 139,IBSS,5,37,2,0,31.629944,-19.395348,9.806598 141 | 140,IBSS,5,38,2,0,51.820202,-29.100342,9.806562 142 | 141,IBSS,5,39,2,0,45.059082,-22.699453,9.806613 143 | 142,IBSS,5,40,2,-0.000001,39.433876,-34.956566,9.806596 144 | 143,IBSS,5,41,2,0,25.67938,-31.916502,9.806558 145 | 144,IBSS,5,42,2,0,19.887413,-19.283823,9.806641 146 | 145,IBSS,5,43,2,-0.000002,33.972126,-23.827993,9.806629 147 | 146,IBSS,5,44,2,0.000002,31.104137,-25.629374,9.806628 148 | 147,IBSS,5,45,2,0,35.190037,-28.268192,9.806633 149 | 148,IBSS,5,46,2,0,34.517727,-33.02507,9.806598 150 | 149,IBSS,5,46,2,0,34.791405,-33.302113,9.806605 151 | 150,IBSS,5,47,2,0,34.785294,-34.456818,9.806572 152 | 151,IBSS,5,48,2,0.000001,32.613281,-38.761326,9.806603 153 | 152,IBSS,5,49,2,0,32.335823,-43.435795,9.806584 154 | 153,IBSS,5,50,2,0,29.96273,-45.01918,9.806552 155 | 154,IBSS,5,0,3,0,31.904808,-33.05933,9.806606 156 | 155,IBSS,5,1,3,0,24.066446,-36.795166,9.806648 157 | 156,IBSS,5,2,3,0,25.049231,-32.690861,9.806633 158 | 157,IBSS,5,3,3,0,24.653143,-31.022421,9.806575 159 | 158,IBSS,5,4,3,0,24.421808,-28.19389,9.80662 160 | 159,IBSS,5,5,3,0,25.887384,-28.085382,9.806577 161 | 160,IBSS,5,6,3,0,25.284134,-28.608582,9.806548 162 | 161,IBSS,5,7,3,0,26.394014,-29.769306,9.806579 163 | 162,IBSS,5,8,3,0,27.938993,-32.493908,9.806576 164 | 163,IBSS,5,9,3,0,27.085972,-35.133038,9.806569 165 | 164,IBSS,5,10,3,0,26.493473,-36.536503,9.806546 166 | 165,IBSS,5,11,3,0,27.057077,-36.069824,9.806583 167 | 166,IBSS,5,12,3,0,27.015984,-36.099197,9.80663 168 | 167,IBSS,5,13,3,0,27.249435,-35.023701,9.806612 169 | 168,IBSS,5,14,3,0,25.763414,-34.29377,9.806629 170 | 169,IBSS,5,15,3,0,26.699104,-31.97823,9.806601 171 | 170,IBSS,5,16,3,0,28.607677,-30.251278,9.806581 172 | 171,IBSS,5,17,3,0,30.742672,-28.311634,9.806567 173 | 172,IBSS,5,18,3,0,33.580662,-27.268398,9.806553 174 | 173,IBSS,5,19,3,0,35.319447,-27.666143,9.806635 175 | 174,IBSS,5,20,3,0,37.766254,-27.244968,9.806612 176 | 175,IBSS,5,21,3,0,39.659233,-27.120842,9.806556 177 | 176,IBSS,5,22,3,0,42.076134,-28.548441,9.80655 178 | 177,IBSS,5,23,3,0,42.018147,-28.81567,9.80661 179 | 178,IBSS,5,24,3,0,42.013622,-28.52055,9.806605 180 | 179,IBSS,5,25,3,0,37.385426,-27.993954,9.806563 181 | 180,IBSS,5,26,3,0,35.024067,-25.650784,9.806603 182 | 181,IBSS,5,27,3,0,32.36525,-24.415634,9.806584 183 | 182,IBSS,5,28,3,0,30.219036,-23.133812,9.806556 184 | 183,IBSS,5,29,3,0,28.835968,-23.754002,9.806588 185 | 184,IBSS,5,30,3,0,28.003725,-24.296719,9.80662 186 | 185,IBSS,5,31,3,0,27.611462,-25.164728,9.806598 187 | 186,IBSS,5,32,3,0,29.181273,-24.584763,9.806597 188 | 187,IBSS,5,33,3,0,30.423553,-26.616211,9.806598 189 | 188,IBSS,5,34,3,0,30.251543,-28.117645,9.806573 190 | 189,IBSS,5,35,3,0,30.014509,-27.423403,9.806581 191 | 190,IBSS,5,36,3,0,30.640913,-27.560196,9.806566 192 | 191,IBSS,5,37,3,0,30.605251,-28.70265,9.806614 193 | 192,IBSS,5,38,3,-0.000001,30.862032,-29.026323,9.806606 194 | 193,IBSS,5,39,3,0,29.973267,-30.842625,9.806605 195 | 194,IBSS,5,40,3,0,30.267513,-31.136717,9.806556 196 | 195,IBSS,5,41,3,0,29.594898,-31.625635,9.806555 197 | 196,IBSS,5,42,3,0,29.040911,-31.695028,9.806588 198 | 197,IBSS,5,43,3,0,30.743193,-32.82275,9.806619 199 | 198,IBSS,5,44,3,0,29.662428,-34.19212,9.806595 200 | 199,IBSS,5,45,3,-0.000001,31.046389,-33.40221,9.806575 201 | 200,IBSS,5,46,3,0,32.435867,-34.86504,9.80662 202 | 201,IBSS,5,47,3,0.000001,32.222782,-37.185303,9.806627 203 | 202,IBSS,5,48,3,0.000001,32.151176,-37.807198,9.806553 204 | 203,IBSS,5,49,3,-0.000001,30.781631,-39.268097,9.806603 205 | 204,IBSS,5,50,3,0.000001,28.596581,-40.107925,9.806582 206 | 205,IBSS,5,0,4,0,28.900915,-36.119308,9.806587 207 | 206,IBSS,5,1,4,0,27.556376,-37.071217,9.806594 208 | 207,IBSS,5,2,4,0,25.674959,-36.148556,9.806561 209 | 208,IBSS,5,3,4,0,23.979265,-33.649952,9.806577 210 | 209,IBSS,5,4,4,0,23.401405,-32.655266,9.806594 211 | 210,IBSS,5,5,4,0,24.482492,-30.852444,9.806562 212 | 211,IBSS,5,6,4,0,24.411781,-31.909945,9.806606 213 | 212,IBSS,5,7,4,0,25.332956,-32.288181,9.806602 214 | 213,IBSS,5,8,4,0,26.891569,-34.847038,9.806539 215 | 214,IBSS,5,9,4,0,28.335794,-38.933346,9.80656 216 | 215,IBSS,5,10,4,0,26.368034,-39.89151,9.806598 217 | 216,IBSS,5,11,4,0.000001,26.995958,-38.999344,9.806591 218 | 217,IBSS,5,12,4,0,27.023567,-38.606293,9.806588 219 | 218,IBSS,5,13,4,0,26.526327,-35.439075,9.806553 220 | 219,IBSS,5,14,4,0,25.749678,-33.392799,9.806551 221 | 220,IBSS,5,15,4,0,27.097414,-31.399448,9.806622 222 | 221,IBSS,5,16,4,0,27.708111,-30.654879,9.806633 223 | 222,IBSS,5,17,4,0,28.574903,-28.249418,9.806602 224 | 223,IBSS,5,18,4,0,30.260387,-25.138988,9.80662 225 | 224,IBSS,5,19,4,0,32.743084,-24.178049,9.806573 226 | 225,IBSS,5,20,4,0,35.875748,-24.069908,9.806562 227 | 226,IBSS,5,21,4,0,37.618675,-25.534748,9.80656 228 | 227,IBSS,5,22,4,0,39.149517,-26.050863,9.80663 229 | 228,IBSS,5,23,4,0,40.540821,-26.97794,9.806625 230 | 229,IBSS,5,24,4,0,40.606178,-29.013025,9.806547 231 | 230,IBSS,5,25,4,0,37.04731,-27.885521,9.806625 232 | 231,IBSS,5,26,4,0,34.210548,-25.337452,9.806557 233 | 232,IBSS,5,27,4,0,31.468489,-22.068514,9.806627 234 | 233,IBSS,5,28,4,0,29.570784,-22.000584,9.806564 235 | 234,IBSS,5,29,4,0,29.104134,-22.453434,9.806602 236 | 235,IBSS,5,30,4,0,29.683332,-24.303452,9.806644 237 | 236,IBSS,5,31,4,0,28.578667,-25.802475,9.806552 238 | 237,IBSS,5,32,4,0,28.665779,-25.456676,9.806615 239 | 238,IBSS,5,33,4,0,30.789782,-26.053228,9.806579 240 | 239,IBSS,5,34,4,0,29.363733,-29.473934,9.806631 241 | 240,IBSS,5,35,4,0,29.781424,-29.965219,9.806567 242 | 241,IBSS,5,36,4,0.000001,31.007147,-40.755825,9.806564 243 | 242,IBSS,5,37,4,0.000001,31.015291,-40.394695,9.806603 244 | 243,IBSS,5,38,4,0,30.585575,-42.289074,9.806567 245 | 244,IBSS,5,39,4,0.000001,27.123447,-42.861858,9.806604 246 | 245,IBSS,5,40,4,0,25.296589,-41.710457,9.806565 247 | 246,IBSS,5,41,4,0,24.232098,-41.66473,9.806623 248 | 247,IBSS,5,42,4,0,25.69891,-42.926262,9.806637 249 | 248,IBSS,5,43,4,0,24.499352,-43.064728,9.806588 250 | 249,IBSS,5,44,4,0,28.12002,-37.641853,9.80663 251 | 250,IBSS,5,45,4,0,29.823648,-37.744453,9.806559 252 | 251,IBSS,5,46,4,0.000001,31.516251,-38.840458,9.806616 253 | 252,IBSS,5,47,4,0,32.6912,-40.524792,9.806583 254 | 253,IBSS,5,48,4,-0.000001,32.897938,-42.392223,9.806632 255 | 254,IBSS,5,49,4,0,30.614843,-43.587029,9.80664 256 | 255,IBSS,5,50,4,-0.000001,29.089251,-41.13781,9.806608 257 | 256,IBSS,5,0,5,0,31.609804,-31.907207,9.806589 258 | 257,IBSS,5,1,5,0,30.738632,-33.725914,9.806636 259 | 258,IBSS,5,2,5,0,28.772911,-32.034195,9.806561 260 | 259,IBSS,5,3,5,0,26.104927,-31.488243,9.806617 261 | 260,IBSS,5,4,5,0,25.761154,-30.341667,9.806575 262 | 261,IBSS,5,5,5,0,25.778265,-29.743509,9.806635 263 | 262,IBSS,5,6,5,0,25.838484,-31.654041,9.806612 264 | 263,IBSS,5,7,5,0,27.261873,-32.024117,9.80663 265 | 264,IBSS,5,8,5,0,29.134336,-34.999653,9.806551 266 | 265,IBSS,5,9,5,0,31.381336,-38.460579,9.806577 267 | 266,IBSS,5,10,5,0,31.1563,-42.476048,9.806634 268 | 267,IBSS,5,11,5,0,31.266718,-42.021271,9.806613 269 | 268,IBSS,5,12,5,0,31.282528,-41.058231,9.80665 270 | 269,IBSS,5,13,5,0,31.638062,-40.004997,9.806627 271 | 270,IBSS,5,14,5,0,29.898197,-37.929115,9.806553 272 | 271,IBSS,5,15,5,0,29.212093,-36.226517,9.806622 273 | 272,IBSS,5,16,5,0,30.24803,-32.959518,9.806611 274 | 273,IBSS,5,17,5,0,30.972986,-30.927435,9.806644 275 | 274,IBSS,5,18,5,0,31.823284,-27.993881,9.806551 276 | 275,IBSS,5,19,5,0,33.892639,-25.568159,9.806558 277 | 276,IBSS,5,20,5,0,36.681763,-25.282211,9.806569 278 | 277,IBSS,5,21,5,0,39.337124,-26.449263,9.806575 279 | 278,IBSS,5,22,5,0,39.569504,-28.448015,9.806566 280 | 279,IBSS,5,23,5,0,42.388847,-28.845543,9.806606 281 | 280,IBSS,5,24,5,0,41.965084,-29.883213,9.806551 282 | 281,IBSS,5,25,5,0,40.335392,-28.285898,9.806566 283 | 282,IBSS,5,26,5,0,37.915035,-26.260208,9.806555 284 | 283,IBSS,5,27,5,0,34.556171,-23.491686,9.806572 285 | 284,IBSS,5,28,5,0,31.788927,-23.062571,9.806638 286 | 285,IBSS,5,29,5,0,31.952101,-24.318222,9.806581 287 | 286,IBSS,5,30,5,0,32.065228,-25.953402,9.80655 288 | 287,IBSS,5,31,5,0,30.523239,-26.380768,9.806607 289 | 288,IBSS,5,32,5,0,31.514074,-28.207859,9.806577 290 | 289,IBSS,5,33,5,0,32.242104,-28.886992,9.806575 291 | 290,IBSS,5,34,5,0,33.56284,-30.905039,9.806601 292 | 291,IBSS,5,35,5,0,33.360252,-30.733603,9.806619 293 | 292,IBSS,5,36,5,0,33.967793,-33.887123,9.806569 294 | 293,IBSS,5,37,5,0,33.215343,-35.681244,9.806631 295 | 294,IBSS,5,38,5,0,31.816751,-37.202503,9.806572 296 | 295,IBSS,5,39,5,-0.000001,28.052347,-37.711842,9.806607 297 | 296,IBSS,5,40,5,0,24.686043,-38.037781,9.80663 298 | 297,IBSS,5,41,5,0,24.071955,-36.698334,9.806593 299 | 298,IBSS,5,42,5,0,26.159115,-35.748005,9.806576 300 | 299,IBSS,5,43,5,0,27.443949,-35.58213,9.806632 301 | 300,IBSS,5,44,5,0,28.529516,-35.259254,9.806588 302 | 301,IBSS,5,45,5,-0.000001,29.586662,-34.95863,9.806584 303 | 302,IBSS,5,46,5,0,31.443941,-35.554111,9.806638 304 | 303,IBSS,5,47,5,0,32.180607,-35.462162,9.806615 305 | 304,IBSS,5,48,5,0,33.880337,-38.210838,9.806556 306 | 305,IBSS,5,49,5,-0.000001,32.229248,-39.361092,9.80656 307 | 306,IBSS,5,50,5,0,30.523701,-38.702381,9.80657 308 | 307,IBSS,5,0,6,-0.000001,29.164804,-33.29895,9.806589 309 | 308,IBSS,5,1,6,-0.000001,35.517925,-31.045513,9.806597 310 | 309,IBSS,5,2,6,0.000001,83.557243,-17.740898,9.80658 311 | 310,IBSS,5,3,6,0,22.393328,-25.520973,9.806552 312 | 311,IBSS,5,4,6,0,23.56872,-32.124146,9.806549 313 | 312,IBSS,5,5,6,0,27.065601,-33.215328,9.806587 314 | 313,IBSS,5,6,6,0,26.295113,-34.058037,9.806571 315 | 314,IBSS,5,7,6,0,27.018204,-36.143715,9.806597 316 | 315,IBSS,5,8,6,0.000001,30.382914,-39.135132,9.806569 317 | 316,IBSS,5,9,6,0,31.761745,-43.535637,9.806602 318 | 317,IBSS,5,10,6,0,29.74087,-47.400883,9.806642 319 | 318,IBSS,5,11,6,0.000001,29.850559,-46.399956,9.806608 320 | 319,IBSS,5,12,6,0,29.965652,-43.82909,9.806605 321 | 320,IBSS,5,13,6,0,35.67046,-43.330276,9.806555 322 | 321,IBSS,5,14,6,0,40.784584,-41.516613,9.806626 323 | 322,IBSS,5,15,6,-0.000002,18.252926,-41.017982,9.80659 324 | 323,IBSS,5,16,6,0,21.931164,-31.381359,9.806632 325 | 324,IBSS,5,17,6,0,24.130047,-29.119812,9.806614 326 | 325,IBSS,5,18,6,0,25.194511,-23.891155,9.806638 327 | 326,IBSS,5,19,6,0,28.226849,-22.168808,9.806584 328 | 327,IBSS,5,20,6,0,33.022659,-21.699839,9.806572 329 | 328,IBSS,5,21,6,0,34.944653,-26.853336,9.806576 330 | 329,IBSS,5,22,6,0,37.809315,-26.209612,9.806555 331 | 330,IBSS,5,23,6,0,39.629089,-26.466816,9.806565 332 | 331,IBSS,5,24,6,0,42.147911,-29.713787,9.806544 333 | 332,IBSS,5,25,6,-0.000001,40.070644,-29.242252,9.806596 334 | 333,IBSS,5,26,6,0,38.703976,-27.308254,9.80656 335 | 334,IBSS,5,27,6,0,31.735895,-28.662453,9.806549 336 | 335,IBSS,5,28,6,0,26.765371,-27.778732,9.806594 337 | 336,IBSS,5,29,6,0,32.645878,-24.476801,9.806621 338 | 337,IBSS,5,30,6,0,31.567106,-23.874466,9.806615 339 | 338,IBSS,5,31,6,0,32.996147,-28.558811,9.806631 340 | 339,IBSS,5,32,6,0,32.613804,-28.496706,9.806555 341 | 340,IBSS,5,33,6,0,35.929039,-29.701286,9.806603 342 | 341,IBSS,5,34,6,0,36.252968,-32.187187,9.806551 343 | 342,IBSS,5,35,6,0,38.953743,-34.739487,9.806626 344 | 343,IBSS,5,36,6,0,41.519279,-39.948948,9.80659 345 | 344,IBSS,5,37,6,0,42.04187,-47.263691,9.806611 346 | 345,IBSS,5,38,6,0,34.440571,-57.649334,9.806547 347 | 346,IBSS,5,39,6,0,13.780042,-57.058334,9.806553 348 | 347,IBSS,5,40,6,0.000001,13.054213,-57.00396,9.806583 349 | 348,IBSS,5,41,6,0,22.447203,-39.115192,9.806592 350 | 349,IBSS,5,42,6,0,18.960682,-21.463821,9.806596 351 | 350,IBSS,5,43,6,0,25.04277,-31.336199,9.806605 352 | 351,IBSS,5,44,6,0,26.973295,-29.598221,9.806605 353 | 352,IBSS,5,45,6,-0.000001,29.872026,-30.117125,9.806605 354 | 353,IBSS,5,46,6,0,31.466639,-32.06316,9.806642 355 | 354,IBSS,5,47,6,0,33.543217,-34.040829,9.806645 356 | 355,IBSS,5,48,6,0,34.783081,-36.572285,9.806582 357 | 356,IBSS,5,49,6,0,33.564091,-37.212582,9.806597 358 | 357,IBSS,5,50,6,0,31.217859,-36.654797,9.806607 359 | 358,IBSS,5,0,7,0,25.042021,-32.655323,9.806556 360 | 359,IBSS,5,1,7,0,37.841305,-29.193733,9.806608 361 | 360,IBSS,5,2,7,0,63.607803,-20.980749,9.806564 362 | 361,IBSS,5,3,7,0,20.227308,-22.60368,9.806576 363 | 362,IBSS,5,4,7,0,24.364746,-29.374596,9.806577 364 | 363,IBSS,5,5,7,0,26.831947,-33.12228,9.806558 365 | 364,IBSS,5,6,7,0,25.234455,-33.225136,9.806549 366 | 365,IBSS,5,7,7,0,26.495815,-37.332687,9.806594 367 | 366,IBSS,5,8,7,0,30.135979,-39.752243,9.806636 368 | 367,IBSS,5,9,7,0,30.516218,-46.72612,9.806569 369 | 368,IBSS,5,10,7,0,30.16021,-48.836563,9.806628 370 | 369,IBSS,5,11,7,0,30.779053,-47.654655,9.806581 371 | 370,IBSS,5,12,7,0,30.851883,-45.299976,9.806572 372 | 371,IBSS,5,13,7,-0.000001,36.039265,-48.467854,9.806603 373 | 372,IBSS,5,14,7,0,41.500847,-45.561562,9.806554 374 | 373,IBSS,5,15,7,0,16.551626,-42.565353,9.806612 375 | 374,IBSS,5,16,7,0,19.455488,-32.405262,9.80662 376 | 375,IBSS,5,17,7,0,23.629833,-28.07332,9.806577 377 | 376,IBSS,5,18,7,0,25.174442,-22.468929,9.806613 378 | 377,IBSS,5,19,7,0,27.501623,-20.52639,9.806581 379 | 378,IBSS,5,20,7,0,30.501884,-21.934341,9.806621 380 | 379,IBSS,5,21,7,0,33.53616,-22.37845,9.806576 381 | 380,IBSS,5,22,7,0,37.680664,-25.453232,9.806568 382 | 381,IBSS,5,23,7,0,38.854996,-27.593531,9.806602 383 | 382,IBSS,5,24,7,0,41.702255,-28.71806,9.806588 384 | 383,IBSS,5,25,7,0,41.187054,-27.697123,9.806599 385 | 384,IBSS,5,26,7,0,40.09021,-27.585197,9.806604 386 | 385,IBSS,5,27,7,0,41.494965,-27.793674,9.806628 387 | 386,IBSS,5,28,7,0,17.112078,-26.905668,9.806612 388 | 387,IBSS,5,29,7,0,34.913517,-23.169538,9.806617 389 | 388,IBSS,5,30,7,0,30.598053,-20.924187,9.806567 390 | 389,IBSS,5,31,7,0,35.138,-22.337103,9.806588 391 | 390,IBSS,5,32,7,0,35.466942,-28.930723,9.806589 392 | 391,IBSS,5,33,7,0,36.570705,-30.134754,9.806634 393 | 392,IBSS,5,34,7,0,36.362411,-32.735645,9.806594 394 | 393,IBSS,5,35,7,0,40.493561,-35.418678,9.806637 395 | 394,IBSS,5,36,7,0,41.853542,-41.694057,9.806644 396 | 395,IBSS,5,37,7,0,44.352455,-52.432735,9.806601 397 | 396,IBSS,5,38,7,0,30.55287,-49.71307,9.806631 398 | 397,IBSS,5,39,7,0,24.730761,-46.566345,9.806596 399 | 398,IBSS,5,40,7,0,20.915194,-42.521324,9.806575 400 | 399,IBSS,5,41,7,0,15.794904,-41.256836,9.806598 401 | 400,IBSS,5,42,7,0,19.235926,-33.549324,9.806578 402 | 401,IBSS,5,43,7,0.000001,21.139441,-28.151361,9.806628 403 | 402,IBSS,5,44,7,0,26.097378,-25.822733,9.806569 404 | 403,IBSS,5,45,7,0,30.979397,-29.729763,9.806634 405 | 404,IBSS,5,46,7,0,31.464682,-33.470329,9.806593 406 | 405,IBSS,5,47,7,0,33.095131,-35.26614,9.806558 407 | 406,IBSS,5,48,7,0,33.643997,-36.647488,9.8066 408 | 407,IBSS,5,49,7,0,33.20734,-36.517956,9.806603 409 | 408,IBSS,5,50,7,0,35.661037,-35.975655,9.806559 410 | 409,IBSS,5,0,8,0,28.768223,-34.270622,9.806586 411 | 410,IBSS,5,1,8,0,29.959375,-31.756498,9.806634 412 | 411,IBSS,5,2,8,0.000001,30.144756,-30.313349,9.806607 413 | 412,IBSS,5,3,8,0.000001,27.551689,-30.11343,9.806582 414 | 413,IBSS,5,4,8,0,26.144505,-32.201153,9.806596 415 | 414,IBSS,5,5,8,0,25.444084,-35.167194,9.806633 416 | 415,IBSS,5,6,8,0,25.593506,-37.525928,9.806573 417 | 416,IBSS,5,7,8,0,26.625496,-40.401081,9.806612 418 | 417,IBSS,5,8,8,0,26.895769,-41.591766,9.806617 419 | 418,IBSS,5,9,8,0,28.98041,-44.408253,9.806645 420 | 419,IBSS,5,10,8,0,30.598455,-47.161671,9.806602 421 | 420,IBSS,5,11,8,0,29.541697,-48.561005,9.806564 422 | 421,IBSS,5,12,8,0,29.577055,-47.19936,9.806581 423 | 422,IBSS,5,13,8,0,30.550884,-44.301952,9.806596 424 | 423,IBSS,5,14,8,0,28.715919,-40.710163,9.80664 425 | 424,IBSS,5,15,8,0,25.604853,-38.200657,9.806587 426 | 425,IBSS,5,16,8,0,24.997879,-33.307762,9.806613 427 | 426,IBSS,5,17,8,0,25.970594,-29.291586,9.806581 428 | 427,IBSS,5,18,8,0,26.570919,-26.894361,9.806564 429 | 428,IBSS,5,19,8,0,27.650932,-25.025457,9.806582 430 | 429,IBSS,5,20,8,0,28.531868,-23.845587,9.806599 431 | 430,IBSS,5,21,8,0,30.896532,-24.282961,9.806594 432 | 431,IBSS,5,22,8,0,34.389111,-25.448524,9.806566 433 | 432,IBSS,5,23,8,0,36.935085,-26.560266,9.806581 434 | 433,IBSS,5,24,8,0,38.517544,-27.209766,9.806639 435 | 434,IBSS,5,25,8,0,39.883858,-26.791016,9.80657 436 | 435,IBSS,5,26,8,0,38.685383,-26.341808,9.806591 437 | 436,IBSS,5,27,8,-0.000001,35.822765,-24.90715,9.806626 438 | 437,IBSS,5,28,8,0,31.227638,-23.075754,9.806592 439 | 438,IBSS,5,29,8,0,31.058523,-22.797964,9.80661 440 | 439,IBSS,5,30,8,0,32.630329,-23.538864,9.806555 441 | 440,IBSS,5,31,8,0,32.484211,-25.860254,9.806601 442 | 441,IBSS,5,32,8,0,31.610607,-28.315878,9.806641 443 | 442,IBSS,5,33,8,0,31.843456,-29.573172,9.806574 444 | 443,IBSS,5,34,8,0,34.342136,-32.271561,9.806588 445 | 444,IBSS,5,35,8,0,36.139786,-35.168591,9.806579 446 | 445,IBSS,5,36,8,-0.000001,36.181553,-39.383892,9.806631 447 | 446,IBSS,5,37,8,0,35.574986,-42.316963,9.806588 448 | 447,IBSS,5,38,8,0,31.547279,-43.497929,9.806647 449 | 448,IBSS,5,39,8,0,27.958731,-44.580391,9.806621 450 | 449,IBSS,5,40,8,0,24.400856,-44.830761,9.806563 451 | 450,IBSS,5,41,8,0,19.864656,-43.945202,9.806618 452 | 451,IBSS,5,42,8,0,16.738214,-40.136341,9.806638 453 | 452,IBSS,5,43,8,0,19.174614,-35.137203,9.806627 454 | 453,IBSS,5,44,8,0,22.933727,-32.88369,9.806597 455 | 454,IBSS,5,45,8,0,26.426481,-32.927311,9.806565 456 | 455,IBSS,5,46,8,0,30.861618,-34.649616,9.806576 457 | 456,IBSS,5,47,8,-0.000001,32.218395,-35.123367,9.80655 458 | 457,IBSS,5,48,8,0,32.967514,-35.469154,9.806608 459 | 458,IBSS,5,49,8,0,33.461216,-35.271595,9.806645 460 | 459,IBSS,5,50,8,0,33.501617,-34.247791,9.806587 461 | 460,IBSS,5,0,9,0,24.494497,-37.418766,9.806636 462 | 461,IBSS,5,1,9,0,23.303104,-33.771469,9.806625 463 | 462,IBSS,5,2,9,0,22.048262,-30.115196,9.80659 464 | 463,IBSS,5,3,9,0,25.104158,-32.438042,9.806585 465 | 464,IBSS,5,4,9,0,22.9062,-36.829914,9.806629 466 | 465,IBSS,5,5,9,0,23.522795,-36.26889,9.806588 467 | 466,IBSS,5,6,9,0,24.544491,-38.393993,9.806629 468 | 467,IBSS,5,7,9,0,24.53389,-37.553329,9.806612 469 | 468,IBSS,5,8,9,0,28.159962,-37.75819,9.806561 470 | 469,IBSS,5,9,9,0,29.886612,-39.614323,9.806555 471 | 470,IBSS,5,10,9,0,31.161991,-43.658127,9.806607 472 | 471,IBSS,5,11,9,0,29.95631,-45.032135,9.806624 473 | 472,IBSS,5,12,9,0,27.510834,-42.176037,9.806632 474 | 473,IBSS,5,13,9,0,27.440033,-39.634335,9.806637 475 | 474,IBSS,5,14,9,0,27.092478,-36.764317,9.806593 476 | 475,IBSS,5,15,9,0,26.874552,-33.68821,9.806577 477 | 476,IBSS,5,16,9,0,21.797222,-33.610744,9.806603 478 | 477,IBSS,5,17,9,0,24.877497,-31.70871,9.8066 479 | 478,IBSS,5,19,9,0,25.473917,-28.117044,9.806621 480 | 479,IBSS,5,20,9,0,28.41013,-23.969408,9.80661 481 | 480,IBSS,5,21,9,0,28.196148,-25.843515,9.806559 482 | 481,IBSS,5,22,9,0,30.608793,-26.114456,9.806579 483 | 482,IBSS,5,23,9,0,32.660282,-25.780573,9.80662 484 | 483,IBSS,5,24,9,0,34.059883,-25.732975,9.806618 485 | 484,IBSS,5,25,9,0,35.895271,-25.208628,9.806605 486 | 485,IBSS,5,26,9,0,35.785866,-23.212349,9.806622 487 | 486,IBSS,5,27,9,0,34.281776,-22.110912,9.806601 488 | 487,IBSS,5,27,9,0,35.407833,-22.715731,9.806633 489 | 488,IBSS,5,28,9,0,32.238544,-22.156593,9.806593 490 | 489,IBSS,5,29,9,0,34.007378,-20.051842,9.806615 491 | 490,IBSS,5,30,9,0,34.663296,-23.856319,9.80659 492 | 491,IBSS,5,31,9,0,33.027206,-26.285105,9.806576 493 | 492,IBSS,5,32,9,0,31.697369,-28.29393,9.806548 494 | 493,IBSS,5,33,9,-0.000001,32.822556,-25.180758,9.806621 495 | 494,IBSS,5,34,9,0,36.861134,-29.640205,9.806544 496 | 495,IBSS,5,35,9,0,39.032402,-33.409023,9.806626 497 | 496,IBSS,5,36,9,0,37.555626,-34.434628,9.80656 498 | 497,IBSS,5,37,9,0,37.149807,-37.209774,9.806573 499 | 498,IBSS,5,38,9,-0.000001,35.013798,-39.542534,9.806604 500 | 499,IBSS,5,39,9,0,32.388748,-41.781242,9.806578 501 | 500,IBSS,5,40,9,0,28.945232,-44.767906,9.806599 502 | 501,IBSS,5,41,9,0,21.809307,-46.659569,9.806563 503 | 502,IBSS,5,42,9,0,17.015224,-43.341148,9.806613 504 | 503,IBSS,5,43,9,0,18.454769,-37.115627,9.806624 505 | 504,IBSS,5,44,9,0,21.655722,-33.565327,9.806552 506 | 505,IBSS,5,45,9,0,27.124821,-30.704266,9.806597 507 | 506,IBSS,5,46,9,0,29.476049,-30.030039,9.80655 508 | 507,IBSS,5,47,9,0,31.410425,-30.996763,9.806592 509 | 508,IBSS,5,48,9,0,30.553663,-32.074093,9.806632 510 | 509,IBSS,5,49,9,0,30.63945,-30.588139,9.806611 511 | 510,IBSS,5,50,9,0,32.152451,-30.142456,9.806582 512 | 511,IBSS,5,0,10,0.000001,35.320713,-27.336203,9.806602 513 | 512,IBSS,5,1,10,-0.000002,39.541302,-22.381655,9.806588 514 | 513,IBSS,5,2,10,0,24.913561,-22.058027,9.806612 515 | 514,IBSS,5,3,10,0.000001,28.340782,-26.048542,9.80659 516 | 515,IBSS,5,4,10,0,27.908752,-29.76812,9.806589 517 | 516,IBSS,5,5,10,0,27.033344,-31.303503,9.806581 518 | 517,IBSS,5,6,10,0.000001,27.090279,-33.533672,9.806604 519 | 518,IBSS,5,7,10,0,27.423012,-34.712521,9.806631 520 | 519,IBSS,5,8,10,0,29.280098,-34.907635,9.806629 521 | 520,IBSS,5,9,10,0.000001,30.085001,-36.090733,9.806569 522 | 521,IBSS,5,10,10,0,29.677937,-37.025879,9.806605 523 | 522,IBSS,5,11,10,0,29.15526,-38.388363,9.806553 524 | 523,IBSS,5,12,10,0,27.862144,-37.746456,9.806613 525 | 524,IBSS,5,13,10,0.000001,27.835667,-37.100895,9.806618 526 | 525,IBSS,5,14,10,0,28.326519,-35.14378,9.806636 527 | 526,IBSS,5,15,10,0,27.798212,-33.531837,9.806555 528 | 527,IBSS,5,16,10,0,26.967854,-32.306217,9.806638 529 | 528,IBSS,5,17,10,0,28.626312,-31.157227,9.806571 530 | 529,IBSS,5,18,10,0,28.232845,-30.682156,9.806587 531 | 530,IBSS,5,19,10,0,29.947821,-29.182932,9.806598 532 | 531,IBSS,5,20,10,0,31.248714,-30.927687,9.806567 533 | 532,IBSS,5,21,10,0,31.535158,-28.880384,9.806599 534 | 533,IBSS,5,22,10,0,33.28064,-28.174974,9.806591 535 | 534,IBSS,5,23,10,0,35.299637,-26.997215,9.806586 536 | 535,IBSS,5,24,10,0,35.910912,-26.705128,9.806578 537 | 536,IBSS,5,25,10,0,37.105953,-23.917419,9.806627 538 | 537,IBSS,5,26,10,0,37.192902,-22.717789,9.806615 539 | 538,IBSS,5,27,10,0,36.636818,-21.630444,9.806629 540 | 539,IBSS,5,28,10,0.000001,33.836933,-20.521423,9.806626 541 | 540,IBSS,5,29,10,0,32.983448,-20.813301,9.806638 542 | 541,IBSS,5,30,10,0,32.127293,-23.545525,9.806627 543 | 542,IBSS,5,31,10,0,33.721394,-24.263447,9.806572 544 | 543,IBSS,5,32,10,0,31.1814,-25.307585,9.806578 545 | 544,IBSS,5,33,10,0,31.847015,-29.22485,9.806602 546 | 545,IBSS,5,34,10,0,32.854717,-29.854746,9.806632 547 | 546,IBSS,5,35,10,0,34.288685,-31.517555,9.806624 548 | 547,IBSS,5,36,10,0.000001,35.334633,-34.41927,9.806625 549 | 548,IBSS,5,37,10,0,34.590332,-36.104736,9.806602 550 | 549,IBSS,5,38,10,0,33.98262,-37.236977,9.806595 551 | 550,IBSS,5,39,10,0,31.714418,-40.33609,9.806611 552 | 551,IBSS,5,40,10,0.000001,29.882881,-42.43306,9.806602 553 | 552,IBSS,5,41,10,0,23.872498,-41.812435,9.806597 554 | 553,IBSS,5,42,10,0,20.372761,-39.485573,9.806566 555 | 554,IBSS,5,43,10,0,20.763428,-34.15974,9.806587 556 | 555,IBSS,5,44,10,0,23.337368,-29.758928,9.806599 557 | 556,IBSS,5,45,10,0,26.954153,-27.66853,9.806615 558 | 557,IBSS,5,46,10,0,29.839632,-27.263374,9.806567 559 | 558,IBSS,5,47,10,0,30.448206,-30.112165,9.806645 560 | 559,IBSS,5,48,10,0,29.927769,-30.074398,9.806639 561 | 560,IBSS,5,49,10,0,30.846653,-28.285715,9.806549 562 | 561,IBSS,5,50,10,0,30.928598,-26.319626,9.806636 563 | 562,IBSS,5,0,11,-0.000001,31.647181,-31.856897,9.806598 564 | 563,IBSS,5,1,11,0,30.389198,-29.497822,9.806537 565 | 564,IBSS,5,2,11,0,30.54224,-28.584713,9.806558 566 | 565,IBSS,5,3,11,0,31.414719,-29.916063,9.806605 567 | 566,IBSS,5,4,11,0,31.41151,-31.581688,9.806597 568 | 567,IBSS,5,5,11,0,30.378983,-32.113079,9.806595 569 | 568,IBSS,5,6,11,0,30.663157,-32.78495,9.806563 570 | 569,IBSS,5,7,11,0,32.03397,-33.300312,9.806625 571 | 570,IBSS,5,8,11,0,32.829353,-34.194229,9.80663 572 | 571,IBSS,5,9,11,0,32.976547,-34.659172,9.806627 573 | 572,IBSS,5,10,11,0,32.242146,-35.849659,9.806634 574 | 573,IBSS,5,11,11,0,30.575781,-34.900249,9.80662 575 | 574,IBSS,5,12,11,0,31.042484,-35.26054,9.80661 576 | 575,IBSS,5,13,11,0,31.18857,-36.36232,9.806541 577 | 576,IBSS,5,14,11,0,30.52619,-37.961323,9.806621 578 | 577,IBSS,5,15,11,0,31.453382,-35.810337,9.806621 579 | 578,IBSS,5,16,11,0,30.349728,-36.512138,9.806553 580 | 579,IBSS,5,17,11,0,29.322165,-34.745724,9.806602 581 | 580,IBSS,5,18,11,0,28.984549,-33.553036,9.806588 582 | 581,IBSS,5,19,11,0,31.628044,-31.931372,9.80662 583 | 582,IBSS,5,20,11,0,31.749149,-34.309471,9.806629 584 | 583,IBSS,5,21,11,0,31.175543,-32.933163,9.806575 585 | 584,IBSS,5,22,11,0,31.938047,-31.043318,9.806622 586 | 585,IBSS,5,23,11,0,32.597137,-29.28405,9.806631 587 | 586,IBSS,5,24,11,0,33.889076,-27.533913,9.806566 588 | 587,IBSS,5,25,11,0,33.577389,-23.910645,9.806557 589 | 588,IBSS,5,26,11,0,37.055161,-21.028557,9.806638 590 | 589,IBSS,5,27,11,0,39.101925,-25.068045,9.806581 591 | 590,IBSS,5,28,11,0,38.927269,-23.907696,9.80662 592 | 591,IBSS,5,29,11,0,35.018402,-22.223927,9.806585 593 | 592,IBSS,5,30,11,0,35.114208,-25.161592,9.806575 594 | 593,IBSS,5,31,11,0,33.078938,-25.885695,9.806576 595 | 594,IBSS,5,32,11,0,34.399422,-26.166988,9.806628 596 | 595,IBSS,5,33,11,0,33.958767,-27.751295,9.80662 597 | 596,IBSS,5,34,11,0,32.437866,-30.22978,9.806621 598 | 597,IBSS,5,35,11,0.000001,32.977207,-29.827236,9.806631 599 | 598,IBSS,5,36,11,0,36.416862,-30.725143,9.806557 600 | 599,IBSS,5,37,11,0,37.065586,-32.43404,9.806631 601 | 600,IBSS,5,38,11,0,35.987091,-35.411812,9.806628 602 | 601,IBSS,5,39,11,0.000002,35.888416,-37.301685,9.806559 603 | 602,IBSS,5,40,11,0.000001,32.490829,-40.856342,9.806571 604 | 603,IBSS,5,41,11,0,28.477541,-44.845772,9.806568 605 | 604,IBSS,5,42,11,0,22.709875,-39.620262,9.806561 606 | 605,IBSS,5,43,11,0,21.057301,-34.004139,9.806637 607 | 606,IBSS,5,44,11,0,23.422852,-27.45356,9.806629 608 | 607,IBSS,5,45,11,0,26.959536,-22.924892,9.806619 609 | 608,IBSS,5,46,11,0,29.746164,-24.121153,9.806593 610 | 609,IBSS,5,47,11,0,30.695511,-24.426474,9.806616 611 | 610,IBSS,5,48,11,0,30.805218,-25.387615,9.806633 612 | 611,IBSS,5,49,11,-0.000001,28.650347,-24.082079,9.806568 613 | 612,IBSS,5,50,11,0,29.640543,-21.858667,9.806561 614 | 613,IBSS,5,0,12,0,31.885374,-28.718849,9.806572 615 | 614,IBSS,5,1,12,0.000001,31.234419,-27.784061,9.806552 616 | 615,IBSS,5,2,12,0.000001,30.708853,-26.664103,9.806619 617 | 616,IBSS,5,3,12,-0.000001,31.629778,-27.572823,9.806635 618 | 617,IBSS,5,4,12,-0.000001,32.220161,-29.749111,9.806555 619 | 618,IBSS,5,5,12,0,32.578732,-30.015512,9.806624 620 | 619,IBSS,5,6,12,0,32.843529,-31.150246,9.806613 621 | 620,IBSS,5,7,12,0,33.752914,-31.183903,9.806574 622 | 621,IBSS,5,8,12,0,34.284081,-30.567303,9.80662 623 | 622,IBSS,5,9,12,0,33.834587,-30.58049,9.806609 624 | 623,IBSS,5,10,12,0,32.259998,-29.309559,9.806567 625 | 624,IBSS,5,11,12,0,30.354692,-30.304811,9.806609 626 | 625,IBSS,5,12,12,0,29.942083,-30.749599,9.806622 627 | 626,IBSS,5,13,12,0,30.756784,-33.379986,9.806598 628 | 627,IBSS,5,14,12,0,30.057602,-34.507889,9.806641 629 | 628,IBSS,5,15,12,0,29.169044,-36.96793,9.806549 630 | 629,IBSS,5,16,12,0,29.064468,-37.346756,9.806587 631 | 630,IBSS,5,17,12,0,28.507568,-37.153954,9.806629 632 | 631,IBSS,5,18,12,0,30.499817,-37.370762,9.806544 633 | 632,IBSS,5,19,12,0,32.062225,-38.088123,9.806638 634 | 633,IBSS,5,20,12,-0.000001,33.790661,-36.359425,9.806604 635 | 634,IBSS,5,21,12,0,34.539665,-34.87466,9.806638 636 | 635,IBSS,5,22,12,0,34.570938,-32.510677,9.806569 637 | 636,IBSS,5,23,12,0,35.005611,-30.452085,9.806582 638 | 637,IBSS,5,24,12,0,34.460217,-28.393465,9.806606 639 | 638,IBSS,5,25,12,0,36.256691,-25.679955,9.806628 640 | 639,IBSS,5,26,12,0,37.037369,-26.596361,9.806545 641 | 640,IBSS,5,27,12,0,36.460735,-25.779219,9.806596 642 | 641,IBSS,5,28,12,0,35.379486,-25.359118,9.806548 643 | 642,IBSS,5,29,12,0,34.175831,-25.481022,9.806548 644 | 643,IBSS,5,30,12,0,32.448593,-25.494846,9.80661 645 | 644,IBSS,5,31,12,0,32.317307,-26.540686,9.80663 646 | 645,IBSS,5,32,12,0,31.958261,-27.721651,9.806611 647 | 646,IBSS,5,33,12,0,30.460011,-29.996677,9.80658 648 | 647,IBSS,5,34,12,0,30.478579,-31.708044,9.806579 649 | 648,IBSS,5,35,12,0,30.929197,-32.267223,9.806585 650 | 649,IBSS,5,36,12,0,32.294598,-32.057079,9.806595 651 | 650,IBSS,5,37,12,0,34.379314,-33.750477,9.806582 652 | 651,IBSS,5,38,12,0,34.101288,-35.459492,9.806629 653 | 652,IBSS,5,39,12,0,33.580299,-37.720707,9.806581 654 | 653,IBSS,5,40,12,0,31.527212,-40.020107,9.806624 655 | 654,IBSS,5,41,12,0,29.428722,-39.849537,9.806591 656 | 655,IBSS,5,42,12,0,28.642826,-37.448902,9.806622 657 | 656,IBSS,5,43,12,0,27.494602,-34.313126,9.806597 658 | 657,IBSS,5,44,12,0,27.905436,-29.252895,9.806598 659 | 658,IBSS,5,45,12,0,29.925335,-27.258846,9.80661 660 | 659,IBSS,5,46,12,0,31.680887,-26.120832,9.806593 661 | 660,IBSS,5,47,12,0,31.481764,-25.077066,9.806603 662 | 661,IBSS,5,48,12,0,31.648468,-24.703705,9.806577 663 | 662,IBSS,5,49,12,0,31.983561,-26.097193,9.806633 664 | 663,IBSS,5,50,12,0,31.966194,-25.471691,9.806588 665 | --------------------------------------------------------------------------------