-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathusergroups.py
128 lines (108 loc) · 3.81 KB
/
usergroups.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 -*-
'''
Created on 20.06.2011
@author: Matthias Meißer
'''
import geojson
import pickle
import mykml
import codecs
import os.path
import sys
import logging
def saveCache(groups):
fcache = open("usergroups.cache", "wb")
pickle.dump(groups, fcache)
fcache.close()
def loadCache():
groups = {}
try:
fcache = open("usergroups.cache", "rb")
groups = pickle.load(fcache)
fcache.close()
except (IOError, EOFError):
logging.log(logging.WARNING, "no cache file present!")
return groups
def getNewestUserGroups(currGroups):
oldGroups = []
newGroups = []
# flatten lists
for group in loadCache():
if group["name"] != "":
oldGroups.append(group["name"])
for group in currGroups:
if group["name"] != "":
newGroups.append(group["name"])
diff = list(set(newGroups) - set(oldGroups))
diff = __appendNewestUserGroups(diff)
return diff
def __appendNewestUserGroups(newgroups):
try:
fcache = open("lastgroups.cache", "rb")
lastgroups = pickle.load(fcache)
fcache.close()
except IOError:
logging.log(logging.WARNING, "no lastgroups file present!")
lastgroups = []
lastgroups = newgroups + lastgroups
if len(lastgroups) >= 5:
lastgroups = lastgroups[0:4]
fcache = open("lastgroups.cache", "wb")
pickle.dump(lastgroups, fcache)
fcache.close()
return lastgroups
def _exportUserGroupsJSON(groups, filename, langCodes=None):
features = []
for ugroup in groups:
if langCodes is not None and ugroup["country"] not in langCodes:
continue
try:
lon = float(ugroup["lonlat"][0])
lat = float(ugroup["lonlat"][1])
properties = ugroup.copy()
properties.pop("lonlat", None)
features.append(geojson.Feature(
geometry=geojson.Point((lon, lat)), properties=properties))
except ValueError as err:
logging.log(logging.WARNING, "Coordinate parse error for user group {}: {}".format(
ugroup.get("name", ""), err))
collection = geojson.FeatureCollection(features)
with codecs.open(filename, 'w+', "utf-8") as f:
geojson.dump(collection, f)
def exportUserGroupsJSON(groups, filename):
_exportUserGroupsJSON(groups, filename)
def exportUserGroupsCountriesJSON(groups, langCodes, filename):
_exportUserGroupsJSON(groups, filename, langCodes)
def exportUserGroups(groups, filename):
# create a KML
k = mykml.kml("OSM usergroups worldwide",
"Generated list of OpenStreetMap local user groups by UserGroupsBot")
k.add_style("usergroup", "localgroup.png")
# save groups
for ugroup in groups:
point = ugroup["lonlat"]
name = ugroup["name"]
rest = ugroup.copy()
del rest["lonlat"]
del rest["name"]
k.add_placemark(name, point[0], point[1], "usergroup", rest)
k.save(filename)
def exportUserGroupsCountries(groups, langCodes, filename):
countries = []
for ugroup in groups:
if ugroup["country"] in langCodes:
countries.append(ugroup)
k = mykml.kml("OSM usergroups",
"Generated list of OpenStreetMap local user groups by UserGroupsBot")
k.add_style("usergroup", "localgroup.png")
try:
for ugroup in countries:
point = ugroup["lonlat"]
name = ugroup["name"]
rest = ugroup.copy()
del rest["lonlat"]
del rest["name"]
k.add_placemark(name, point[0], point[1], "usergroup", rest)
k.save(filename)
except KeyError:
sys.stderr.write("\nBad usergroup in countries")