/
storage.py
128 lines (92 loc) · 3.66 KB
/
storage.py
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
# -*- coding: utf-8 -*-
import dataset
import logging
from util import parse_timestamp, parse_polygon, get_polygon_centroid, utm_to_gps
import geofence
# Initialize and connect to local sqlite database
db = dataset.connect("sqlite:///database.db")
def vegobjekter():
table_vegobjekter = db.get_table("vegobjekter")
return table_vegobjekter
def exists(vegobjekt):
table_vegobjekter = db.get_table("vegobjekter")
if table_vegobjekter.find_one(id=vegobjekt.get("id")):
return True
return False
def delete(geofence_id):
table = vegobjekter()
table.delete(id=geofence_id)
def add(vegobjekt):
table_vegobjekter = db.get_table("vegobjekter")
geofence = convert_to_geofence(vegobjekt)
nvdb_polygon = geofence.get("polygon")
polygon = parse_polygon(nvdb_polygon)
centroid = get_polygon_centroid(polygon)
geofence["centroid"] = ','.join(map(str, [centroid[0], centroid[1]]))
table_vegobjekter.insert(geofence)
def convert_to_geofence(vegobjekt):
"""
'datatype' == 19 -> GeomFlate, ref NVDB api explanation for vegobjekter
"""
log = logging.getLogger("geofencebroker")
tmp = [x for x in vegobjekt.get("egenskaper") if x["datatype"] == 19]
if not tmp:
log.error("Unable to find GeomFlate from vebobjekt. Something is wrong! {}".format(tmp))
return None
geomFlate = tmp[0]
if "POLYGON" not in geomFlate.get("verdi"):
log.error("Missing POLYGON in 'verdi' key! {}".format(geomFlate))
return None
geofence_obj = {
"id": vegobjekt["id"],
"name": geofence.get_name(vegobjekt),
"href": vegobjekt["href"],
"sist_modifisert": vegobjekt["metadata"]["sist_modifisert"],
"version": geofence.get_version(vegobjekt),
"type": vegobjekt["metadata"]["type"]["navn"],
"polygon": geomFlate.get("verdi")
}
return geofence_obj
def is_modified(vegobjekt):
# import pdb; pdb.set_trace()
log = logging.getLogger("geofencebroker")
next_date = parse_timestamp(vegobjekt["metadata"]["sist_modifisert"])
table_vegobjekter = db.get_table("vegobjekter")
geofence = table_vegobjekter.find_one(id=vegobjekt.get("id"))
if not geofence:
log.warn("vegobjekt not found in database")
return False
prev_date = parse_timestamp(geofence["sist_modifisert"])
if next_date > prev_date:
# 'vegobjekt' has been modified
return True
elif next_date < prev_date:
log.warn("next_date < prev_data: (%s < %s)" % (next_date, prev_date))
log.warn("Most likely a bug!!")
return False
def fix_centroid():
"""Fixes missing centroids if anyone, since we didn't store that before
"""
log = logging.getLogger("geofencebroker")
table_vegobjekter = vegobjekter()
rows = list(table_vegobjekter.find(centroid=None))
for row in rows:
nvdb_polygon = row.get("polygon")
polygon = parse_polygon(nvdb_polygon)
centroid = get_polygon_centroid(polygon)
row["centroid"] = ','.join(map(str, [centroid[0], centroid[1]]))
update_data = {
'id': row.get("id"),
'centroid': row["centroid"]
}
table_vegobjekter.update(update_data, ['id'])
log.info("Updated geofence object {} with centroid".format(row.get("id")))
return True
def update(vegobjekt):
table_vegobjekter = db.get_table("vegobjekter")
geofence = convert_to_geofence(vegobjekt)
nvdb_polygon = geofence.get("polygon")
polygon = parse_polygon(nvdb_polygon)
centroid = get_polygon_centroid(polygon)
geofence["centroid"] = ','.join(map(str, [centroid[0], centroid[1]]))
table_vegobjekter.update(geofence, ['id'])