SHOW:
|
|
- or go back to the newest paste.
1 | import xml.dom.minidom as m | |
2 | from pprint import pprint | |
3 | import re | |
4 | - | import uuid |
4 | + | |
5 | kml = "d:\state_pts_MI.kml" | |
6 | dom = m.parse(kml) | |
7 | ||
8 | placemarks = dom.getElementsByTagName("Placemark") | |
9 | ||
10 | r = {} | |
11 | ||
12 | # this is how we split the key/value pairs inside the description nodes | |
13 | splitre = re.compile("([\w\s]+):(.*)") | |
14 | ||
15 | unnamed_counter = 0 | |
16 | ||
17 | # one placemark is one jail | |
18 | for p in placemarks: | |
19 | ||
20 | # get name of jail from <name> node, or generate an UUID | |
21 | if p.getElementsByTagName("name").length > 0: | |
22 | jail_name = p.getElementsByTagName("name")[0].firstChild.data | |
23 | - | jail_name = uuid.uuid1().urn |
23 | + | |
24 | unnamed_counter += 1 | |
25 | - | # pprint(jail_name) |
25 | + | jail_name = "unnamed"+str(unnamed_counter) |
26 | ||
27 | # get coordinates as list (split coordinates from KML at comma) | |
28 | coords = p.getElementsByTagName("coordinates")[0].firstChild.data.split(",") | |
29 | #pprint(coords) | |
30 | # convert to float so we can use the precision printing formats to define number of decimals, e.g. by using %.3f or %.6f | |
31 | lon = float(coords[0]) | |
32 | lat = float(coords[1]) | |
33 | ||
34 | # prepare results dict for this jail | |
35 | r[jail_name] = {} | |
36 | r[jail_name]["lon"] = lon | |
37 | r[jail_name]["lat"] = lat | |
38 | ||
39 | # exactly one description per jail | |
40 | d = p.getElementsByTagName("description")[0] | |
41 | ||
42 | # grab one line per key-value-pair | |
43 | descTextLines = d.toxml().replace("<description>","").replace("</description>","").replace("<div>","").split("</div>") | |
44 | ||
45 | for line in descTextLines: | |
46 | if line.strip() != "": | |
47 | - | # pprint(r) |
47 | + | |
48 | # split it by using the regexp we defined | |
49 | rem = splitre.match(line) | |
50 | kv = rem.groups() | |
51 | - | print(jailname + " has " + r[jailname]['2010 Correctional Population'] + " inmates."); |
51 | + | |
52 | ||
53 | r[jail_name][kv[0]] = kv[1].strip() | |
54 | ||
55 | # display the results | |
56 | ||
57 | total_inmates = 0 | |
58 | for jailname in r.keys(): | |
59 | print("%s is @ %.3f,%.3f and has %d inmates." % (jailname, r[jailname]['lon'], r[jailname]['lat'], int(r[jailname]['2010 Correctional Population']))); | |
60 | total_inmates += int(r[jailname]['2010 Correctional Population']) | |
61 | ||
62 | print("Total inmates: %d" % total_inmates) |