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

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

cope with multiple bounding boxes.

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                print sql
35                cursor = connection.cursor()
36                try:
37                        cursor.execute(sql)
38                except:
39                        print "Error: database error %s %s" %(sys.exc_type, sys.exc_value)
40                        connection.commit()
41
42def do_update(Mid,west,south,east,north,startdate,enddate):
43                sql = "UPDATE spatiotemp SET coordinates = sbox'(("+west+"d , "+south+"d), ("+east+"d , "+north+"d))', startdate='"+startdate+"', enddate= '"+enddate+"', update_time= now() WHERE id='"+Mid+"';"
44                print sql
45                cursor = connection.cursor()
46                try:
47                        cursor.execute(sql)
48                except:
49                        print "Error: database error %s %s" %(sys.exc_type, sys.exc_value)
50                        connection.commit()
51
52def main(indir):
53    if indir == "":
54        sys.exit("USAGE: argument 1 = full path of directory where MOLES records reside")
55    else:
56        print "INFO: moles records are in %s" %indir
57
58#this is a fix to the  ElementTree namespace problem that namespaces are usually represented as ns0, ns1, ns2 etc.
59    etree._namespace_map.update({'http://ndg.nerc.ac.uk/moles': 'moles', 'http://www.w3.org/1999/xlink':'xlink'})
60    numfilesproc = 0
61
62    filenames = os.listdir(indir)
63    for filename in filenames:
64                Mid = filename
65                print Mid
66                if filename.find('.xml') != -1:
67                        full_filename = indir + "/" + filename
68                        #print full_filename
69                        no_bbox = False
70                        no_dates = False
71                        dgMeta=MRW.dgMetadata()
72                        try:
73                                dgMeta.fromXML(cElementTree.ElementTree(file=full_filename).getroot())
74                        except:
75                                print "WARNING: Cannot parse the XML moles document %s. Will not process" %full_filename
76                                continue
77
78                        try:
79                                bbox_list=listify(dgMeta.dgMetadataRecord.dgDataEntity.dgDataSummary.dgDataCoverage.dgSpatialCoverage.BoundingBox)
80                        except:
81                                print "INFO: XML moles document %s does not contain a bounding box." %full_filename
82                                no_bbox=True
83
84                        try:
85                                dates=dgMeta.dgMetadataRecord.dgDataEntity.dgDataSummary.dgDataCoverage.dgTemporalCoverage.DateRange
86                                print dates
87                        except:
88                                print "INFO: XML moles document %s does not contain temporal info." %full_filename
89                                no_dates=True
90
91                        if no_bbox and no_dates:
92                                print "INFO: XML moles document %s does not contain any spatiotemporal info." %full_filename
93                                continue
94
95                        if no_bbox:
96                                pass
97                        else:
98                                # for bbox in bbox_list:
99                                #parse the coordinates somewhat - only use the first bounding box.
100                                print bbox_list
101                                bbox=bbox_list[0]
102                                print bbox
103                                #west
104                                west = bbox.LimitWest.strip()
105                                if west.endswith('E'):
106                                        west=bbox.LimitWest.split('E')[0]
107                                elif west.endswith('W'):
108                                        if west.startswith('-'):
109                                                west = bbox.LimitWest.split('W')[0]
110                                        else:
111                                                west = "-" +bbox.LimitWest.split('W')[0]
112                                try:
113                                        float(west)
114                                except:
115                                        print "ERROR:  Will not process File %s. Contains incorrect West bounding box limit." %full_filename
116                                        continue
117                                #print "West = %s" %west
118                                #east
119                                east = bbox.LimitEast.strip()
120                                if east.endswith('E'):
121                                        east=bbox.LimitEast.split('E')[0]
122                                elif east.endswith('W'):
123                                        if east.startswith('-'):
124                                                east = bbox.LimitEast.split('W')[0]
125                                        else:
126                                                east = "-" +bbox.LimitEast.split('W')[0]
127                                try:
128                                        float(east)
129                                except:
130                                        print "ERROR:  Will not process File %s. Contains incorrect East bounding box limit." %full_filename
131                                        continue
132                                #print "East = %s" %east
133                                #north
134                                north = bbox.LimitNorth.strip()
135                                if north.endswith('N'):
136                                        north=bbox.LimitNorth.split('N')[0]
137                                elif north.endswith('S'):
138                                        if north.startswith('-'):
139                                                north = bbox.LimitNorth.split('S')[0]
140                                        else:
141                                                north = "-" +bbox.LimitNorth.split('S')[0]
142                                try:
143                                        float(north)
144                                except:
145                                        print "ERROR: Will not process File %s. Contains incorrect North bounding box limit." %full_filename
146                                        continue
147                                #print "North = %s" %north
148                                #south
149                                south = bbox.LimitSouth.strip()
150                                if south.endswith('N'):
151                                        south=bbox.LimitSouth.split('N')[0]
152                                elif south.endswith('S'):
153                                        if south.startswith('-'):
154                                                south = bbox.LimitSouth.split('S')[0]
155                                        else:
156                                                south = "-" +bbox.LimitSouth.split('S')[0]
157                                try:
158                                        float(south)
159                                except:
160                                        print "ERROR: Will not process File %s. Contains incorrect North bounding box limit." %full_filename
161                                        continue
162                                #print "North = %s" %south
163
164                        if id_exists( Mid ):
165                                print "INFO: doc %s exists, updating\n" %Mid
166                                do_update( Mid, west, south, east, north, dates.DateRangeStart, dates.DateRangeEnd )
167                        else:
168                                print "INFO: doc %s does not exist, inserting new record\n" %Mid
169                                do_insert( Mid, west, south, east, north, dates.DateRangeStart, dates.DateRangeEnd )
170                        numfilesproc += 1
171                else:
172                        print "WARNING: File %s appears not to be XML. Will not be processed." %filename
173
174    print 'INFO: SpaceTimeIngestFromMOLES.py ran to end. files processed= %s' %(numfilesproc)
175
176if __name__=='__main__':
177    indir=sys.argv[1]
178    main(indir)
Note: See TracBrowser for help on using the repository browser.