Changeset 1101


Ignore:
Timestamp:
Mar 17, 2005, 2:38:40 PM (20 years ago)
Author:
duncan
Message:

bug fix

Location:
inundation/ga/storm_surge/pyvolution
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • inundation/ga/storm_surge/pyvolution/combine_pts.py

    r1064 r1101  
    88   Geoscience Australia, 2005.   
    99"""
    10 from util import outside_polygon
     10from util import outside_polygon, inside_polygon
    1111from Numeric import take, concatenate
     12import time
    1213
    1314import exceptions
     
    1617def combine_rectangular_points_files(fine_points_file,
    1718                                    coarse_points_file,
    18                                     output_points_file):
     19                                    output_points_file,
     20                                     verbose = False):
    1921   
    2022    from load_mesh.loadASCII import load_points_file, extent, point_atts2array, write_pts, add_point_dictionaries,take_points
     
    2224   
    2325    # load fine points file
     26    if verbose:print "loading Point files"
    2427    try:
    2528        fine = load_points_file(fine_points_file,delimiter = ',')
     
    3538        coarse = load_points_file(coarse_points_file,
    3639                                              delimiter = ' ')
     40       
     41    if verbose:print "doing other stuff"
    3742    # convert to Numeric   
    3843    fine = point_atts2array(fine)
     
    4348    if not fine['attributelist'].keys() == coarse['attributelist'].keys():
    4449        raise AttributeError
     50   
    4551    # set points to the same geo ref -  say the fine points geo ref
    4652    if fine.has_key('geo_reference')and not fine['geo_reference'] is None:
     
    5460    # find out_points - coarse points outside of fine points extent
    5561
    56     #FIXME the closed doesn't seem to work here,
    57     #though it works in the test case
     62    if verbose:
     63        print "starting outside_polygon"
     64        t0 = time.time()
    5865    outside_coarse_indices = outside_polygon(coarse['pointlist'],
    5966                                             extent,closed=True)
     67    if verbose:
     68        print "Points outside determined"
     69        print 'That took %.2f seconds' %(time.time()-t0)
    6070
    6171    # Remove points from the coarse data
     
    6373       
    6474    # add fine points and out_points
     75    if verbose:print "Adding points"
    6576    combined = add_point_dictionaries(fine, coarse)
    6677
    6778    # save
     79    if verbose:print "writing points"
    6880    write_pts(output_points_file, combined)
    6981
     82def add_points_files(fine_points_file,
     83                                    coarse_points_file,
     84                                    output_points_file,
     85                                     verbose = False):
     86   
     87    from load_mesh.loadASCII import load_points_file, extent, point_atts2array, write_pts, add_point_dictionaries,take_points
     88
     89   
     90    # load fine points file
     91    if verbose:print "loading Point files"
     92    try:
     93        fine = load_points_file(fine_points_file,delimiter = ',')
     94    except SyntaxError,e:
     95        fine = load_points_file(fine_points_file,delimiter = ' ')
     96   
     97   
     98    # load course points file
     99    try:
     100        coarse = load_points_file(coarse_points_file,
     101                                              delimiter = ',')
     102    except SyntaxError,e:
     103        coarse = load_points_file(coarse_points_file,
     104                                              delimiter = ' ')
     105       
     106    if verbose:print "doing other stuff"
     107    # convert to Numeric   
     108    fine = point_atts2array(fine)
     109    coarse = point_atts2array(coarse)
     110   
     111    #check that the attribute info is the same
     112    #FIXME is not sorting this a problem?
     113    if not fine['attributelist'].keys() == coarse['attributelist'].keys():
     114        raise AttributeError
     115   
     116    # set points to the same geo ref -  say the fine points geo ref
     117    if fine.has_key('geo_reference')and not fine['geo_reference'] is None:
     118        if coarse.has_key('geo_reference'):
     119            coarse['pointlist'] = \
     120             fine['geo_reference'].change_points_geo_ref(coarse['pointlist'],
     121                                                         points_geo_ref=coarse['geo_reference']) 
     122       
     123    # add fine points and out_points
     124    if verbose:print "Adding points"
     125    combined = add_point_dictionaries(fine, coarse)
     126
     127    # save
     128    if verbose:print "writing points"
     129    write_pts(output_points_file, combined)
     130
     131def reduce_points_to_mesh_extent(points_file,
     132                                    mesh_file,
     133                                    output_points_file,
     134                                     verbose = False):
     135   
     136    from load_mesh.loadASCII import load_points_file, extent, point_atts2array, write_pts, add_point_dictionaries,take_points, mesh_file_to_mesh_dictionary
     137
     138   
     139    # load  points file
     140    try:
     141        points = load_points_file(points_file,delimiter = ',')
     142    except SyntaxError,e:
     143        points = load_points_file(points_file,delimiter = ' ')
     144   
     145    # load  mesh file
     146    mesh = mesh_file_to_mesh_dictionary(mesh_file)
     147
     148    # get extent of mesh
     149    extent = extent(mesh['vertices'])
     150    #print "extent",extent
     151    # set points to the same geo ref - the points geo ref
     152    if points.has_key('geo_reference')and not points['geo_reference'] is None:
     153        if mesh.has_key('geo_reference'):
     154            extent = \
     155             points['geo_reference'].change_points_geo_ref(extent,
     156                                                         points_geo_ref=mesh['geo_reference']) 
     157    #print "extent",extent
     158
     159    #get a list of in point indexes
     160    #FIXME closed doesn't seems to work here.
     161    inside_indices = inside_polygon(points['pointlist'],
     162                                             extent,closed=True)
     163    #create a list of in points
     164    points = take_points(points, inside_indices)
     165
     166    # save the list, along with geo-ref
     167    write_pts(output_points_file,points)
     168   
    70169    #-------------------------------------------------------------
    71170if __name__ == "__main__":
  • inundation/ga/storm_surge/pyvolution/test_combine_pts.py

    r1064 r1101  
    2727        import tempfile
    2828        import os
     29
    2930
    3031        # create a fine .pts file
     
    6364        results = load_points_file(out_file,
    6465                                  delimiter = ',')
     66        answer = [[2.0, 0.0],
     67                  [0.0, 1.0],
     68                  [0.0, 4.0],
     69                  [4.0, 4.0],
     70                  [4.0, 1.0]]
    6571        #print "results",results
    66         assert allclose(results['pointlist'], [[4.0, 3.0],
    67                                             [2.0, 0.0],
    68                                             [0.0, 1.0],
    69                                             [0.0, 4.0],
    70                                             [4.0, 4.0],
    71                                             [4.0, 1.0]])
    72         assert allclose(results['attributelist']['sonic'], [ 3., -2.,
     72        #print "answer",answer
     73       
     74        self.failUnless(len(results['pointlist']) == len(answer),
     75                         'final number of points wrong. failed.')
     76       
     77        assert allclose(results['pointlist'], answer)
     78        assert allclose(results['attributelist']['sonic'], [ -2.,
    7379                                                             1.,  4.,
    7480                                                             8.,  5.])
    75         assert allclose(results['attributelist']['elevation'],[30., -20.,
     81        assert allclose(results['attributelist']['elevation'],[ -20.,
    7682                                                               10.,  40.,
    7783                                                               80.,  50.])
     84       
     85        self.failUnless(results['geo_reference'] == fine_dict['geo_reference'],
     86                         ' failed.')
     87        #clean up
     88        os.remove(out_file)
     89
     90    def test_combine_rectangular_points_filesII(self):
     91        from load_mesh.loadASCII import write_pts
     92        import tempfile
     93        import os
     94
     95        # create a fine .pts file
     96        fine_dict = {}
     97        fine_dict['pointlist']=[[0,1],[0,4],[4,4],[4,1],[3,1],[2,2],[1,3],[3,4]]
     98        att_dict = {}
     99        fine_dict['attributelist'] = att_dict
     100        fine_dict['geo_reference'] = Geo_reference(56,2.0,1.0)
     101       
     102        fine_file = tempfile.mktemp(".pts")
     103        write_pts(fine_file, fine_dict)
     104
     105
     106        # create a coarse .pts file
     107        coarse_dict = {}
     108        coarse_dict['pointlist']=[[0,1],[0,0],[0.5,0.5],[1,1],
     109                                  [1.5,1.5],[2,1],[0,-2],[100,10],
     110                                  [-20,4],[-50,5],[60,70]]
     111        att_dict = {}
     112        coarse_dict['attributelist'] = att_dict
     113        coarse_dict['geo_reference'] = Geo_reference(56,4.0,3.0)
     114       
     115        coarse_file = tempfile.mktemp(".pts")
     116        write_pts(coarse_file, coarse_dict)
     117       
     118        out_file = tempfile.mktemp(".pts")
     119
     120        combine_rectangular_points_files(fine_file,coarse_file,out_file)
     121
     122        #clean up
     123        #os.remove(fine_file)
     124        #os.remove(coarse_file)
     125
     126        results = load_points_file(out_file,
     127                                  delimiter = ',')
     128        answer = [[2.0, 0.0],
     129                  [102.,12.],
     130                  [-18.,6.],
     131                  [-48.,7.],
     132                  [62.,72.],
     133                  [0.0, 1.0],
     134                  [0.0, 4.0],
     135                  [4.0, 4.0],
     136                  [4.0, 1.0],
     137                  [3.,1.],
     138                  [2.,2.],
     139                  [1.,3.],
     140                  [3.,4.]]
     141        #print "results",results['pointlist']
     142        #print "answer",answer
     143        #print "len(results['pointlist']",len(results['pointlist'])
     144        #print "len(answer)",len(answer)
     145       
     146        self.failUnless(len(results['pointlist']) == len(answer),
     147                         'final number of points wrong. failed.')
     148        assert allclose(results['pointlist'], answer)
    78149       
    79150        self.failUnless(results['geo_reference'] == fine_dict['geo_reference'],
     
    123194        os.remove(fine_file)
    124195        os.remove(coarse_file)
     196     
     197    def test_reduce_points_to_mesh_extent(self):
     198        from load_mesh.loadASCII import write_pts, export_mesh_file
     199        import tempfile
     200        import os
     201        x_origin = -45435345.
     202        y_origin = 433432432.
     203        # create a fine .pts file
     204        fine_dict = {}
     205        fine_dict['pointlist']=[[1.,1.],
     206                                [1.,7.],
     207                                [7.,1.],
     208                                [11.,11.],
     209                                [7.,8.],
     210                                [8.,8.],
     211                                [9.,8.]]
     212        att_dict = {}
     213        att_dict['elevation'] = [10,40,80,50,78,78,45]
     214        att_dict['sonic'] = [1,4,8,5,56,34,213]
     215        fine_dict['attributelist'] = att_dict
     216        fine_dict['geo_reference'] = Geo_reference(56,x_origin,y_origin)
     217       
     218        points_file = tempfile.mktemp(".pts")
     219        write_pts(points_file, fine_dict)
     220
     221
     222        # create a coarse .pts file
     223        mesh = {}
     224        mesh['vertices']=[[0,0],
     225                          [0,3],
     226                          [3,3],
     227                          [3,0],
     228                          [1,2]
     229                          ]
     230        mesh['vertex_attributes']=[[],
     231                          [],
     232                          [],
     233                          [],
     234                          []
     235                          ]
     236        mesh['geo_reference'] = Geo_reference(56,x_origin+7.,y_origin+7.)
     237       
     238        mesh_file = tempfile.mktemp(".tsh")
     239        export_mesh_file(mesh_file, mesh)
     240       
     241        out_file = tempfile.mktemp(".pts")
     242
     243        reduce_points_to_mesh_extent(points_file,mesh_file,out_file)
     244
     245        #clean up
     246        #os.remove(fine_file)
     247        #os.remove(coarse_file)
     248
     249        results = load_points_file(out_file,
     250                                  delimiter = ',')
     251        answer = [
     252            [7.,8.],
     253            [8.,8.],
     254            [9.,8.]]
     255        #print "results",results['pointlist']
     256        #print "answer",answer
     257       
     258        self.failUnless(len(results['pointlist']) == len(answer),
     259                         'final number of points wrong. failed.')
     260        assert allclose(results['pointlist'],answer)
     261
     262        answer = [78., 78.,45.]
     263       
     264        self.failUnless(len(results['attributelist']['elevation']) == len(answer),
     265                         'final number of points wrong. failed.')
     266        assert allclose(results['attributelist']['elevation'], answer)
     267       
     268        #clean up
     269        os.remove(out_file)
     270
     271        #FIXME do test for add points files
    125272       
    126273#-------------------------------------------------------------
    127274if __name__ == "__main__":
    128275    suite = unittest.makeSuite(Test_combine_pts,'test')
    129 
    130     #suite = unittest.makeSuite(Test_Least_Squares,'test_fit_to_msh_netcdf_fileII')
    131     #suite = unittest.makeSuite(Test_Least_Squares,'test_fit_to_mesh_fileII')
     276    #suite = unittest.makeSuite(Test_combine_pts,'test_reduce_points_to_mesh_extent')
    132277    runner = unittest.TextTestRunner(verbosity=1)
    133278    runner.run(suite)
Note: See TracChangeset for help on using the changeset viewer.