source: TI01-discovery/trunk/ingestAutomation/OAIBatch/SpaceTimeIngestFromMOLES.py @ 2252

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI01-discovery/trunk/ingestAutomation/OAIBatch/SpaceTimeIngestFromMOLES.py@2252
Revision 2252, 7.5 KB checked in by selatham, 13 years ago (diff)

Copes with MDIP format. Some new config file

Line 
1#!/usr/bin/env python
2import cElementTree
3import elementtree.ElementTree as etree
4import molesReadWrite as MRW
5import sys
6import db_funcs
7import os
8
9#connect to db (in separate db functions module)
10connection = db_funcs.db_connect()
11
12def listify(item):
13        ''' listify checks if an item is a list, if it isn't it puts it inside a list and returns it. Always returns a list object.'''
14        if type(item) is list:
15            return item
16        else:
17            return [item]
18
19def id_exists(Mid):
20        sql = "select id from spatiotemp where id = '"+Mid+"';"
21        cursor = connection.cursor()
22        try:
23            cursor.execute(sql)
24        except:
25            print "Error: database error %s %s" %(sys.exc_type, sys.exc_value)
26        if len(cursor.fetchall()) <1:
27            return False
28        else:
29            return True
30
31
32def do_insert(Mid,west,south,east,north,startdate,enddate):
33        sql = "INSERT INTO spatiotemp (id, coordinates, startdate, enddate) VALUES ( '"+Mid+ "', sbox'(("+west+"d , "+south+"d), ("+east+"d , "+north+"d))', '"+startdate+"', '"+enddate+"');"
34        #sql.replace("'null'",None)
35        print sql
36        cursor = connection.cursor()
37        try:
38            cursor.execute(sql)
39        except:
40            print "Error: database error %s %s" %(sys.exc_type, sys.exc_value)
41        connection.commit()
42
43def do_update(Mid,west,south,east,north,startdate,enddate):
44        sql = "UPDATE spatiotemp SET coordinates = sbox'(("+west+"d , "+south+"d), ("+east+"d , "+north+"d))', startdate='"+startdate+"', enddate= '"+enddate+"', update_time= now() WHERE id='"+Mid+"';"
45        #sql.replace("'null'",None)
46        print sql
47        cursor = connection.cursor()
48        try:
49            cursor.execute(sql)
50        except:
51            print "Error: database error %s %s" %(sys.exc_type, sys.exc_value)
52        connection.commit()
53
54def main(indir):
55    if indir == "":
56        sys.exit("USAGE: argument 1 = full path of directory where MOLES records reside")
57    else:
58        print "INFO: moles records are in %s" %indir
59
60#this is a fix to the  ElementTree namespace problem that namespaces are usually represented as ns0, ns1, ns2 etc.
61    etree._namespace_map.update({'http://ndg.nerc.ac.uk/moles': 'moles', 'http://www.w3.org/1999/xlink':'xlink'})
62    numfilesproc = 0
63
64    filenames = os.listdir(indir)
65    for filename in filenames:
66        Mid = filename
67        print Mid
68        if filename.find('.xml') != -1:
69            full_filename = indir + "/" + filename
70            #print full_filename
71            no_bbox = False
72            no_dates = False
73            east = 0
74            west = 0
75            north = 0
76            south = 0
77            startdate="January 1, 01 BC"
78            enddate="January 1, 01 BC"
79            dgMeta=MRW.dgMetadata()
80            try:
81                dgMeta.fromXML(cElementTree.ElementTree(file=full_filename).getroot())
82            except:
83                print "WARNING: Cannot parse the XML moles document %s. Will not process" %full_filename
84                continue
85            try:
86                bbox_list=listify(dgMeta.dgMetadataRecord.dgDataEntity.dgDataSummary.dgDataCoverage.dgSpatialCoverage.BoundingBox)
87            except:
88                print "INFO: XML moles document %s does not contain a bounding box." %full_filename
89                no_bbox=True
90            if bbox_list[0] =='None':
91                no_bbox=True
92
93            try:
94                dates=dgMeta.dgMetadataRecord.dgDataEntity.dgDataSummary.dgDataCoverage.dgTemporalCoverage.DateRange
95                print dates
96            except:
97                print "INFO: XML moles document %s does not contain temporal info." %full_filename
98                no_dates=True
99
100            if no_bbox and no_dates:
101                print "INFO: XML moles document %s does not contain any spatiotemporal info." %full_filename
102                continue
103            if no_dates:
104                pass
105            else:
106                startdate=dates.DateRangeStart
107                enddate= dates.DateRangeEnd
108
109            if no_bbox:
110                pass
111            else:
112                # for bbox in bbox_list:
113                #parse the coordinates somewhat - only use the first bounding box.
114                #print bbox_list
115                bbox=bbox_list[0]
116                #print bbox
117                #west
118                west = bbox.LimitWest.strip()
119                if west.endswith('E'):
120                    west=bbox.LimitWest.split('E')[0]
121                elif west.endswith('W'):
122                    if west.startswith('-'):
123                        west = bbox.LimitWest.split('W')[0]
124                    else:
125                        west = "-" +bbox.LimitWest.split('W')[0]
126                try:
127                    float(west)
128                except:
129                    print "ERROR:  Will not process File %s. Contains incorrect West bounding box limit." %full_filename
130                    continue
131                #print "West = %s" %west
132                #east
133                east = bbox.LimitEast.strip()
134                if east.endswith('E'):
135                    east=bbox.LimitEast.split('E')[0]
136                elif east.endswith('W'):
137                    if east.startswith('-'):
138                        east = bbox.LimitEast.split('W')[0]
139                    else:
140                        east = "-" +bbox.LimitEast.split('W')[0]
141                try:
142                    float(east)
143                except:
144                    print "ERROR:  Will not process File %s. Contains incorrect East bounding box limit." %full_filename
145                    continue
146                #print "East = %s" %east
147                #north
148                north = bbox.LimitNorth.strip()
149                if north.endswith('N'):
150                    north=bbox.LimitNorth.split('N')[0]
151                elif north.endswith('S'):
152                    if north.startswith('-'):
153                        north = bbox.LimitNorth.split('S')[0]
154                    else:
155                        north = "-" +bbox.LimitNorth.split('S')[0]
156                try:
157                    float(north)
158                except:
159                    print "ERROR: Will not process File %s. Contains incorrect North bounding box limit." %full_filename
160                    continue
161                #print "North = %s" %north
162                #south
163                south = bbox.LimitSouth.strip()
164                if south.endswith('N'):
165                    south=bbox.LimitSouth.split('N')[0]
166                elif south.endswith('S'):
167                    if south.startswith('-'):
168                        south = bbox.LimitSouth.split('S')[0]
169                    else:
170                        south = "-" +bbox.LimitSouth.split('S')[0]
171                try:
172                    float(south)
173                except:
174                    print "ERROR: Will not process File %s. Contains incorrect North bounding box limit." %full_filename
175                    continue
176                #print "North = %s" %south
177
178            if id_exists( Mid ):
179                print "INFO: doc %s exists, updating\n" %Mid
180                do_update( Mid, west, south, east, north, startdate, enddate )
181            else:
182                print "INFO: doc %s does not exist, inserting new record\n" %Mid
183                do_insert( Mid, west, south, east, north, startdate, enddate )
184            numfilesproc += 1
185        else:
186            print "WARNING: File %s appears not to be XML. Will not be processed." %filename
187
188    print 'INFO: SpaceTimeIngestFromMOLES.py ran to end. files processed= %s' %(numfilesproc)
189
190if __name__=='__main__':
191    indir=sys.argv[1]
192    main(indir)
Note: See TracBrowser for help on using the repository browser.