-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathgenerate_kmz.py
More file actions
157 lines (139 loc) · 4.29 KB
/
generate_kmz.py
File metadata and controls
157 lines (139 loc) · 4.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#!/usr/bin/python
import csv
import re
import telnetlib
import os
import getopt
import sys
from scipy.interpolate import griddata
import numpy
import matplotlib.pyplot as plt
import simplekml
from simplekml import AltitudeMode
def usage():
print "generate_kmz.py"
print "\t-h - Help"
print "\t-i <Input file>"
print "\t\tRequired"
print "\t-o <Output file>"
print "\t\tDefault: <input filename>.kmz"
print "\t-r <resolution>"
print "\t\tDefault: 10. Used to determine the interpolation resolution."
print "\t\tIncreasing this may significantly increase runtime."
print "\t-O <Altitude Offset in Meters>"
print "\t\tDefault: 0. This is used to determine the offset between the levels read and sea level."
print "\tAt least ONE of the following is required:"
print "\t-s <ssid>"
print "\t\tSSID of Target Network"
print "\t-b <bssid>"
print "\t\tBSSID of Target Network (00:00:00:00:00:00)"
#print "\t-n <slice count>"
#Haven't gotten to this yet...
#print "\t\tNumber of horizontal slices"
print "Example Usage:"
print "./generate_kmz -i flight7.csv -s bobs-linksys"
print "./generate_kmz -i flight7.csv -o flight7_linksys.kmz -r 15 -r 20 -s bobs-linksys -b de:ad:be:ef"
def main(argv):
input_filename = ""
output_filename = ""
resolution = 10
altitude_offset = 0
bssid = "any"
ssid = "any"
slice_count = 0
try:
opts, args = getopt.getopt(sys.argv[1:],"hi:o:r:a:b:s:n:")
except getopt.GetoptError as err:
print str(err)
usage()
sys.exit()
for o, a in opts:
if o == "-h":
usage()
return
elif o == "-i":
input_filename = a
elif o == "-r":
resolution = int(a)
elif o == "-o":
output_filename = a
elif o == "-a":
altitude_offset = int(a)
elif o == "-b":
bssid = str(a)
elif o == "-s":
ssid = str(a)
elif o == "-n":
slice_count = int(n)
if input_filename is "":
print "Must specify input file with -i"
return
if ssid=="" and bssid=="":
print "Must specify either an SSID (-s) or BSSID (-b)"
return
if altitude_offset == 0:
print "WARNING: Sanity Check: No Altitude Offset. Starting at sea-level"
if output_filename == "":
output_filename = input_filename + ".kmz"
print "Filtering on SSID = %s and BSSID = %s"%(ssid,bssid)
x = []
y = []
z = []
v = []
try:
input = open(input_filename)
print "Reading data from %s" % input_filename
except:
print "ERROR: Unable to read %s" % input_filename
return
reader = csv.DictReader(input)
datapoint_count = 0
for row in reader:
if (ssid=="any" and row['bssid']== bssid) or (bssid=="any" and row['ssid']==ssid) or (bssid==row['bssid'] and ssid==row['ssid']):
x.append(float(row['lon']))
y.append(float(row['lat']))
z.append(float(row['alt']))
v.append(float(row['rssi']))
datapoint_count = datapoint_count+1
print "Identified %s relevant data points" % datapoint_count
#The range of each axis desired
xr = numpy.linspace(min(x),max(x),resolution)
yr = numpy.linspace(min(y),max(y),resolution)
zr = numpy.linspace(min(z),max(z),resolution)
x_slice,y_slice = numpy.meshgrid(xr,yr)
print "Performing Interpolation"
#The expaded coordinates of each axis across the grid.
[xi,yi,zi] = numpy.meshgrid(xr,yr,zr)
vi = griddata((x,y,z),v,(xi,yi,zi),method='linear',fill_value=min(v))
figures = []
slice_num = 0
for idx in range(0,resolution):
if idx%10 == 0: print "Generating slice %s of %s" % (idx,resolution)
plt.figure()
alt = zi[0][0][idx]
CS = plt.contour(x_slice,y_slice,vi[idx],linewidths=3)
plt.clabel(CS, inline=1, fontsize=10)
t = plt.title(str(int(alt))+"m")
t.set_color("red")
t.set_weight("bold")
plt.axis('off')
figname = 'alt_%s.png'%idx
plt.savefig(figname,transparent=True)
figures.append({'figname':figname,'alt':alt+altitude_offset})
plt.close()
print "Interpolation complete. Writing KMZ"
kml = simplekml.Kml()
for fig in figures:
image_inkmz = kml.addfile(fig['figname'])
overlay = kml.newgroundoverlay(name=fig['figname'],altitude=fig['alt'],altitudemode=AltitudeMode.absolute)
overlay.icon.href=image_inkmz
overlay.latlonbox.north = max(xr)
overlay.latlonbox.south = min(xr)
overlay.latlonbox.east = max(yr)
overlay.latlonbox.west = min(yr)
kml.savekmz(output_filename)
for fig in figures:
os.remove(fig['figname'])
print "KMZ written to %s" % output_filename
if __name__ == "__main__":
main(sys.argv[1:])