]> git.sthu.org Git - dvrdb.git/commitdiff
Add create-map.py
authorStefan Huber <shuber@sthu.org>
Wed, 15 Jan 2014 21:17:38 +0000 (22:17 +0100)
committerStefan Huber <shuber@sthu.org>
Fri, 17 Jan 2014 13:30:19 +0000 (14:30 +0100)
create-map.py [new file with mode: 0755]
dvr-db.py

diff --git a/create-map.py b/create-map.py
new file mode 100755 (executable)
index 0000000..5ffaa5b
--- /dev/null
@@ -0,0 +1,149 @@
+#!/usr/bin/env python3
+
+
+import bs4
+import getopt
+import os
+import re
+import sqlite3
+import sys
+import urllib.request
+import urllib.parse
+import urllib.error
+import json
+import gzip
+import time
+
+
+def queryLocation(address):
+    """Get (lat, lng) pair of given postal address."""
+
+    urlargs = {}
+    urlargs['address'] = address
+    urlargs['sensor'] = "false"
+    urlparam = urllib.parse.urlencode(urlargs)
+
+    url = "http://maps.googleapis.com/maps/api/geocode/json?" + urlparam
+    try:
+        response = urllib.request.urlopen(url).read().decode('utf-8')
+        data = json.loads(response)
+        print(data)
+        loc = data['results'][0]['geometry']['location']
+        return loc['lat'], loc['lng']
+    except urllib.error.URLError as e:
+        print(e, file=sys.stderr)
+        return None
+
+
+def printHTML(rows):
+    """Print HTML page with the given result set"""
+
+    print("""
+<html>
+  <head>
+    <meta charset="UTF-8">
+    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+    <script type="text/javascript">
+      google.load("visualization", "1", {packages:["map"]});
+      google.setOnLoadCallback(drawMap);
+      function drawMap() {
+        var data = google.visualization.arrayToDataTable([
+            ['Lat', 'Lon', 'Name'],
+            """)
+
+    for r in rows:
+        text = "%s (ID: %d, DVR: %d), %s" % (r[2], r[0], r[1], r[3])
+        addr = r[3]
+        loc = None
+
+        for i in range(1, 10):
+            try:
+                loc = queryLocation(addr)
+                break
+            except IndexError as e:
+                time.sleep(0.1)
+
+        if loc is None:
+            print("Error: could not get location for %s at %s." % (text, addr),
+                  file=sys.stderr)
+        else:
+            print("[%s, %s, %s]," % (loc[0], loc[1], repr(text)))
+
+    print("""
+            ]);
+
+        var map = new google.visualization.Map(document.getElementById('map_div'));
+        map.draw(data, {showTip: true});
+      }
+    </script>
+  </head>
+
+  <body>
+    <div id="map_div" style="width: 800px; height: 600px"></div>
+  </body>
+</html>
+            """)
+
+
+def usage():
+    """Print help text."""
+
+    print("""
+USAGE:
+  {0} -d FILE [where clause]
+  {0} -h
+
+Creates a html file loading a google map with bubbles at the locations of the
+registrations selected using the where clause.
+
+OPTIONS:
+  -d FILE     Use given sqlite3 database.
+  -h          Print this help text.
+""")
+
+
+if __name__ == "__main__":
+
+    add = None
+    dbfn = None
+    query = None
+    showLocation = False
+
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], "d:h")
+
+        for opt, arg in opts:
+            if opt == "-d":
+                dbfn = arg
+            elif opt == "-h":
+                usage()
+                sys.exit(os.EX_OK)
+            else:
+                print("Unknown option '", opt, "'.", file=sys.stderr)
+                assert(False)
+
+    except getopt.GetoptError as e:
+        print("Error parsing arguments:", e, file=sys.stderr)
+        usage()
+        sys.exit(os.EX_USAGE)
+
+    if dbfn is None:
+        print("No database given.", file=sys.stderr)
+        sys.exit(os.EX_USAGE)
+
+    conn = sqlite3.connect(dbfn, timeout=60)
+    conn.execute("PRAGMA foreign_keys = ON")
+    conn.execute("PRAGMA journal_mode = MEMORY")
+    conn.execute("PRAGMA synchronous = OFF")
+
+    stmt = "SELECT * FROM dvrtable, registrations, purposes"
+    stmt += " WHERE dvrtable.id=registrations.dvrid AND dvrtable.id=purposes.dvrid"
+    if len(args) > 0:
+        stmt += " AND " + " ".join(args)
+    c = conn.cursor()
+
+    superstmt = "SELECT DISTINCT id, dvr, name, address FROM (%s)" % stmt
+    c.execute(superstmt)
+    printHTML(c.fetchall())
+
+    sys.exit(os.EX_OK)
index ca848f6ddd7cb5c244e9522b589ec8748214d164..4cb5588cd394a4fb0082cffe05ead564c5489052 100755 (executable)
--- a/dvr-db.py
+++ b/dvr-db.py
@@ -141,7 +141,7 @@ def queryLocation(address):
         response = urllib.request.urlopen(url).read().decode('utf-8')
         data = json.loads(response)
         loc = data['results'][0]['geometry']['location']
-        return loc['lng'], loc['lat']
+        return loc['lat'], loc['lng']
     except urllib.error.URLError as e:
         print(e, file=sys.stderr)
         return None
@@ -292,16 +292,16 @@ if __name__ == "__main__":
             elif opt == "-q":
                 query = int(arg)
             else:
-                print("Unknown option '", opt, "'.")
+                print("Unknown option '", opt, "'.", file=sys.stderr)
                 assert(False)
 
     except getopt.GetoptError as e:
-        print("Error parsing arguments:", e)
+        print("Error parsing arguments:", e, file=sys.stderr)
         usage()
         sys.exit(os.EX_USAGE)
 
     if dbfn is None:
-        print("No database given.")
+        print("No database given.", file=sys.stderr)
         sys.exit(os.EX_USAGE)
 
     db = Database(dbfn)