-
Notifications
You must be signed in to change notification settings - Fork 1
/
tmexport.py
60 lines (47 loc) · 1.66 KB
/
tmexport.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
from pymongo import MongoClient
import sys
import json
from bson import json_util
args = sys.argv[1:]
if len(args) != 2:
print "Usage: <collectionId> <type>\n" +\
" type should be one of 'json', 'geojson', or 'shp'\n" +\
" will write to a file of the form '<collectionId>.<type>'"
sys.exit()
cid, typ = args
assert typ in ["json", "geojson", "shp"]
db = MongoClient('localhost', 3001).meteor
fname = cid + "." + typ
if typ == "json":
with open(fname, "w") as f:
for place in db['places'].find({"collectionId": cid}):
f.write(json.dumps(place, default=json_util.default) + "\n")
if typ == "geojson":
with open(fname, "w") as f:
features = [p for p in db['places'].find({"collectionId": cid})]
f.write(json.dumps({
"type": "FeatureCollection",
"features": features
}, default=json_util.default))
tmap = {
"unicode": "str",
"float": "float",
"int": "int",
"NoneType": "str"
}
if typ == "shp":
import fiona
from fiona.crs import from_epsg
# get a sample place do build a schema from - if other places don't match
# this schema you'll get a fiona error, although this should be dealt with
# in the future
p = db['places'].find_one({"collectionId": cid})
props = {k: tmap[type(v).__name__] for k, v in p["properties"].iteritems()}
myschema = {
'geometry': p["geometry"]["type"],
'properties': props,
}
with fiona.open(fname, 'w', crs=from_epsg(4326),
driver='ESRI Shapefile', schema=myschema) as f:
for place in db['places'].find({"collectionId": cid}):
f.write(place)