forked from project-open-data/esri2open
-
Notifications
You must be signed in to change notification settings - Fork 5
/
esri2open.py
90 lines (84 loc) · 2.83 KB
/
esri2open.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
# ---------------------------------------------------------------------------
# esri2open.py
# Created on: March 11, 2013
# Created by: Michael Byrne
# Federal Communications Commission
# exports the feature classes for any feature class to
# a csv file, JSON file or geoJSON file
# also adding edits from sgillies and Shaun Walbridge
# updates include using the python json.dumps method and indentation issues
# Edit by Calvin Metcalf to merge in improvments made for exporting
# Massachusetts Department Of Transportation Data
# edits made 4/8/2013
# ---------------------------------------------------------------------------
#imports
from arcpy import AddMessage, GetCount_management
from utilities import getExt
from parseRow import parse
from prepare import prepareFile
#----
#close file
#----
def closeJSON(out):
out.write("""]}""")
out.close()
return True
def closeSqlite(out):
out[2].commit()
out[1].close()
return True
def closeCSV(out):
out[1].close()
return True
def closeUp(out,fileType):
if fileType == "geojson":
return closeJSON(out)
elif fileType == "csv":
return closeCSV(out)
if fileType == "json":
return closeJSON(out)
else:
return False
#this is the meat of the function, we could put it into a seperate file if we wanted
def writeFile(outArray,featureClass,fileType,includeGeometry, first=True):
parser = parse(outArray,featureClass,fileType,includeGeometry,first)
#wrap it in a try so we don't lock the database
try:
for row in parser.rows:
#parse row
parser.parse(row)
except Exception as e:
#using chrome has rubbed off on me
AddMessage("OH SNAP! " + str(e))
finally:
#clean up
return parser.cleanUp(row)
#this is the main entry point into the module
def toOpen(featureClass, outJSON, includeGeometry="geojson"):
#check the file type based on the extention
fileType=getExt(outJSON)
#some sanity checking
#valid geojson needs features, seriously you'll get an error
if not int(GetCount_management(featureClass).getOutput(0)):
AddMessage("No features found, skipping")
return
elif not fileType:
AddMessage("this filetype doesn't make sense")
return
#geojson needs geometry
if fileType=="geojson":
includeGeometry="geojson"
elif fileType=="sqlite":
includeGeometry="well known binary"
else:
includeGeometry=includeGeometry.lower()
#open up the file
outFile=prepareFile(outJSON,featureClass,fileType,includeGeometry)
#outFile will be false if the format isn't defined
if not outFile:
AddMessage("I don't understand the format")
return
#write the rows
writeFile(outFile,featureClass,fileType,includeGeometry)
#go home
closeUp(outFile,fileType)