Skip to content

Commit

Permalink
Adding more grown-up KMZ support.
Browse files Browse the repository at this point in the history
  • Loading branch information
Tom MacWright committed Sep 1, 2010
1 parent aa7d30d commit 7911bc4
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 30 deletions.
63 changes: 36 additions & 27 deletions mapsonastick/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,19 +39,28 @@ def get(self, filename):
self.connections[filename] = sqlite3.connect(filename)
return self.connections[filename]

map_cache = MapCache()

class ZipCache(object):
""" a simple static cache to prevent reconnecting to sqlite """
class KMZFile(object):
def __init__(self, filename):
self.zipfile = zipfile.ZipFile(filename)
try:
self.docroot = os.path.split([n for n in self.zipfile.namelist() if os.path.basename(n) == 'doc.kml'][0])[0]
except IndexError, e:
raise Exception('doc.kml not found in KMZ file')
def member(self, filename):
return self.zipfile.read(os.path.join(self.docroot, filename))

class KMZCache(object):
""" provides a simple interface for connecting to KMZ files """
def __init__(self):
self.zips = {}
self.kmzs = {}

def get(self, filename):
if not self.zips.has_key(filename):
self.zips[filename] = zipfile.ZipFile(os.path.join('KML', filename))
return self.zips[filename]
if not self.kmzs.has_key(filename):
self.kmzs[filename] = KMZFile(os.path.join('KML', filename))
return self.kmzs[filename]

zip_cache = ZipCache()
map_cache = MapCache()
kmz_cache = KMZCache()

def maps_dir():
if sys.platform == 'darwin' and False:
Expand All @@ -65,21 +74,17 @@ def kml_dir():
else:
return KML_DIR

@app.route('/kmz/<string:filename_64>/<string:member>')
def kmz(filename_64, member):
filename = "%s" % base64.urlsafe_b64decode(str(filename_64))
zip_file = zip_cache.get(filename)
stripped_names = dict([(os.path.split(n)[1], n) for n in zip_file.namelist()])
print stripped_names
return zip_file.read(stripped_names[member])


def layer_entry(file):
ext = os.path.splitext(file)[1]
if ext in ['.kml', '.rss']:
return file
if ext == '.kmz':
return base64.urlsafe_b64encode(file)
if os.path.splitext(file)[1] in ['.kmz', '.kml', '.rss', '.mbtiles']:
if os.path.splitext(file)[1] == '.kmz':
path = '/kmz/' + base64.urlsafe_b64encode(file) + '/doc.kml'
else:
# TODO: use proper routing
path = '/kml?url=' + file
return {
'path': path,
'filename': file
}

def layers_list():
""" return a json object of layers ready for configuration """
Expand All @@ -95,9 +100,8 @@ def layers_list():
layers.append(layer)
except:
pass
overlays = []
for root, dirs, files in os.walk(kml_dir()):
overlays.extend(map(layer_entry, files))
overlays = map(layer_entry, files)
return {'layers': layers, 'overlays': overlays}

def allowed_file(filename):
Expand All @@ -108,6 +112,12 @@ def allowed_file(filename):
def home():
""" serve the home page """
return render_template('start.html')

@app.route('/kmz/<string:filename_64>/<path:member>')
def kmz(filename_64, member):
filename = "%s" % base64.urlsafe_b64decode(str(filename_64))
zip_file = kmz_cache.get(filename)
return zip_file.member(member)

@app.route('/kml', methods=['GET', 'POST'])
def kml():
Expand All @@ -130,7 +140,6 @@ def kml():
except Exception, e:
return str(e)


@app.route('/proxy', methods=['GET'])
def proxy():
url = request.args.get('url', False)
Expand Down Expand Up @@ -165,5 +174,5 @@ def tile(layername_64, z, x, y):
spid = open('server.pid', 'w')
spid.write("%s\n" % str(os.getpid()))
spid.close()
app.config['SERVER_NAME'] = 'localhost'
app.config['SERVER_NAME'] = 'localhost'
app.run(debug=True)
7 changes: 4 additions & 3 deletions mapsonastick/static/js/map.js
Original file line number Diff line number Diff line change
Expand Up @@ -352,12 +352,13 @@ function load_layers() {
map.zoomToExtent(map.getLayersBy('isBaseLayer', true)[0].options.ext);
map.zoomIn();
for(var j = 0; j < resp.overlays.length; j++) {
if(resp.overlays[j].search(".kml") !== -1) {
add_kml(resp.overlays[j], "/kml?url=" + resp.overlays[j], resp.overlays[j]);
}
add_kml(resp.overlays[j].file, resp.overlays[j].path, resp.overlays[j].file);
/**
* TODO: readd RSS
if(resp.overlays[j].search(".rss") !== -1) {
add_rss(resp.overlays[j], "/kml?url=" + resp.overlays[j], resp.overlays[j]);
}
*/
}
});
}
Expand Down

0 comments on commit 7911bc4

Please sign in to comment.