web/lib/django/contrib/gis/gdal/tests/test_srs.py
changeset 0 0d40e90630ef
equal deleted inserted replaced
-1:000000000000 0:0d40e90630ef
       
     1 import unittest
       
     2 from django.contrib.gis.gdal import SpatialReference, CoordTransform, OGRException, SRSException
       
     3 
       
     4 class TestSRS:
       
     5     def __init__(self, wkt, **kwargs):
       
     6         self.wkt = wkt
       
     7         for key, value in kwargs.items():
       
     8             setattr(self, key, value)
       
     9 
       
    10 # Some Spatial Reference examples
       
    11 srlist = (TestSRS('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]',
       
    12                   proj='+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ',
       
    13                   epsg=4326, projected=False, geographic=True, local=False,
       
    14                   lin_name='unknown', ang_name='degree', lin_units=1.0, ang_units=0.0174532925199,
       
    15                   auth={'GEOGCS' : ('EPSG', '4326'), 'spheroid' : ('EPSG', '7030')},
       
    16                   attr=(('DATUM', 'WGS_1984'), (('SPHEROID', 1), '6378137'),('primem|authority', 'EPSG'),),
       
    17                   ),
       
    18           TestSRS('PROJCS["NAD83 / Texas South Central",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",30.28333333333333],PARAMETER["standard_parallel_2",28.38333333333333],PARAMETER["latitude_of_origin",27.83333333333333],PARAMETER["central_meridian",-99],PARAMETER["false_easting",600000],PARAMETER["false_northing",4000000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32140"]]',
       
    19                   proj='+proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs ',
       
    20                   epsg=32140, projected=True, geographic=False, local=False,
       
    21                   lin_name='metre', ang_name='degree', lin_units=1.0, ang_units=0.0174532925199,
       
    22                   auth={'PROJCS' : ('EPSG', '32140'), 'spheroid' : ('EPSG', '7019'), 'unit' : ('EPSG', '9001'),},
       
    23                   attr=(('DATUM', 'North_American_Datum_1983'),(('SPHEROID', 2), '298.257222101'),('PROJECTION','Lambert_Conformal_Conic_2SP'),),
       
    24                   ),
       
    25           TestSRS('PROJCS["NAD_1983_StatePlane_Texas_South_Central_FIPS_4204_Feet",GEOGCS["GCS_North_American_1983",DATUM["North_American_Datum_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["False_Easting",1968500.0],PARAMETER["False_Northing",13123333.33333333],PARAMETER["Central_Meridian",-99.0],PARAMETER["Standard_Parallel_1",28.38333333333333],PARAMETER["Standard_Parallel_2",30.28333333333334],PARAMETER["Latitude_Of_Origin",27.83333333333333],UNIT["Foot_US",0.3048006096012192]]',
       
    26                   proj='+proj=lcc +lat_1=28.38333333333333 +lat_2=30.28333333333334 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.999999999 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs ',
       
    27                   epsg=None, projected=True, geographic=False, local=False,
       
    28                   lin_name='Foot_US', ang_name='Degree', lin_units=0.3048006096012192, ang_units=0.0174532925199,
       
    29                   auth={'PROJCS' : (None, None),},
       
    30                   attr=(('PROJCS|GeOgCs|spheroid', 'GRS_1980'),(('projcs', 9), 'UNIT'), (('projcs', 11), None),),
       
    31                   ),
       
    32           # This is really ESRI format, not WKT -- but the import should work the same
       
    33           TestSRS('LOCAL_CS["Non-Earth (Meter)",LOCAL_DATUM["Local Datum",0],UNIT["Meter",1.0],AXIS["X",EAST],AXIS["Y",NORTH]]',
       
    34                   esri=True, proj=None, epsg=None, projected=False, geographic=False, local=True,
       
    35                   lin_name='Meter', ang_name='degree', lin_units=1.0, ang_units=0.0174532925199,
       
    36                   attr=(('LOCAL_DATUM', 'Local Datum'), ('unit', 'Meter')),
       
    37                   ),
       
    38           )
       
    39 
       
    40 # Well-Known Names
       
    41 well_known = (TestSRS('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]', wk='WGS84', name='WGS 84', attrs=(('GEOGCS|AUTHORITY', 1, '4326'), ('SPHEROID', 'WGS 84'))),
       
    42               TestSRS('GEOGCS["WGS 72",DATUM["WGS_1972",SPHEROID["WGS 72",6378135,298.26,AUTHORITY["EPSG","7043"]],AUTHORITY["EPSG","6322"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4322"]]', wk='WGS72', name='WGS 72', attrs=(('GEOGCS|AUTHORITY', 1, '4322'), ('SPHEROID', 'WGS 72'))),
       
    43               TestSRS('GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.9786982138982,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]]', wk='NAD27', name='NAD27', attrs=(('GEOGCS|AUTHORITY', 1, '4267'), ('SPHEROID', 'Clarke 1866'))),
       
    44               TestSRS('GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]]', wk='NAD83', name='NAD83', attrs=(('GEOGCS|AUTHORITY', 1, '4269'), ('SPHEROID', 'GRS 1980'))),
       
    45               TestSRS('PROJCS["NZGD49 / Karamea Circuit",GEOGCS["NZGD49",DATUM["New_Zealand_Geodetic_Datum_1949",SPHEROID["International 1924",6378388,297,AUTHORITY["EPSG","7022"]],TOWGS84[59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993],AUTHORITY["EPSG","6272"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4272"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",-41.28991152777778],PARAMETER["central_meridian",172.1090281944444],PARAMETER["scale_factor",1],PARAMETER["false_easting",300000],PARAMETER["false_northing",700000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27216"]]', wk='EPSG:27216', name='NZGD49 / Karamea Circuit', attrs=(('PROJECTION','Transverse_Mercator'), ('SPHEROID', 'International 1924'))),
       
    46               )
       
    47 
       
    48 bad_srlist = ('Foobar', 'OOJCS["NAD83 / Texas South Central",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",30.28333333333333],PARAMETER["standard_parallel_2",28.38333333333333],PARAMETER["latitude_of_origin",27.83333333333333],PARAMETER["central_meridian",-99],PARAMETER["false_easting",600000],PARAMETER["false_northing",4000000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32140"]]',)
       
    49 
       
    50 class SpatialRefTest(unittest.TestCase):
       
    51 
       
    52     def test01_wkt(self):
       
    53         "Testing initialization on valid OGC WKT."
       
    54         for s in srlist:
       
    55             srs = SpatialReference(s.wkt)
       
    56 
       
    57     def test02_bad_wkt(self):
       
    58         "Testing initialization on invalid WKT."
       
    59         for bad in bad_srlist:
       
    60             try:
       
    61                 srs = SpatialReference(bad)
       
    62                 srs.validate()
       
    63             except (SRSException, OGRException):
       
    64                 pass
       
    65             else:
       
    66                 self.fail('Should not have initialized on bad WKT "%s"!')
       
    67 
       
    68     def test03_get_wkt(self):
       
    69         "Testing getting the WKT."
       
    70         for s in srlist:
       
    71             srs = SpatialReference(s.wkt)
       
    72             self.assertEqual(s.wkt, srs.wkt)
       
    73 
       
    74     def test04_proj(self):
       
    75         "Test PROJ.4 import and export."
       
    76 
       
    77         for s in srlist:
       
    78             if s.proj:
       
    79                 srs1 = SpatialReference(s.wkt)
       
    80                 srs2 = SpatialReference(s.proj)
       
    81                 self.assertEqual(srs1.proj, srs2.proj)
       
    82         
       
    83     def test05_epsg(self):
       
    84         "Test EPSG import."
       
    85         for s in srlist:
       
    86             if s.epsg:
       
    87                 srs1 = SpatialReference(s.wkt)
       
    88                 srs2 = SpatialReference(s.epsg)
       
    89                 srs3 = SpatialReference(str(s.epsg))
       
    90                 srs4 = SpatialReference('EPSG:%d' % s.epsg)
       
    91                 #self.assertEqual(srs1.wkt, srs2.wkt)
       
    92                 for srs in (srs1, srs2, srs3, srs4):
       
    93                     for attr, expected in s.attr:
       
    94                         self.assertEqual(expected, srs[attr])
       
    95 
       
    96     def test07_boolean_props(self):
       
    97         "Testing the boolean properties."
       
    98         for s in srlist:
       
    99             srs = SpatialReference(s.wkt)
       
   100             self.assertEqual(s.projected, srs.projected)
       
   101             self.assertEqual(s.geographic, srs.geographic)
       
   102 
       
   103     def test08_angular_linear(self):
       
   104         "Testing the linear and angular units routines."
       
   105         for s in srlist:
       
   106             srs = SpatialReference(s.wkt)
       
   107             self.assertEqual(s.ang_name, srs.angular_name)
       
   108             self.assertEqual(s.lin_name, srs.linear_name)
       
   109             self.assertAlmostEqual(s.ang_units, srs.angular_units, 9)
       
   110             self.assertAlmostEqual(s.lin_units, srs.linear_units, 9)
       
   111 
       
   112     def test09_authority(self):
       
   113         "Testing the authority name & code routines."
       
   114         for s in srlist:
       
   115             if hasattr(s, 'auth'):
       
   116                 srs = SpatialReference(s.wkt)
       
   117                 for target, tup in s.auth.items():
       
   118                     self.assertEqual(tup[0], srs.auth_name(target))
       
   119                     self.assertEqual(tup[1], srs.auth_code(target))
       
   120 
       
   121     def test10_attributes(self):
       
   122         "Testing the attribute retrieval routines."
       
   123         for s in srlist:
       
   124             srs = SpatialReference(s.wkt)
       
   125             for tup in s.attr:
       
   126                 att = tup[0] # Attribute to test
       
   127                 exp = tup[1] # Expected result
       
   128                 self.assertEqual(exp, srs[att])
       
   129 
       
   130     def test11_wellknown(self):
       
   131         "Testing Well Known Names of Spatial References."
       
   132         for s in well_known:
       
   133             srs = SpatialReference(s.wk)
       
   134             self.assertEqual(s.name, srs.name)
       
   135             for tup in s.attrs:
       
   136                 if len(tup) == 2:
       
   137                     key = tup[0]
       
   138                     exp = tup[1]
       
   139                 elif len(tup) == 3:
       
   140                     key = tup[:2]
       
   141                     exp = tup[2]
       
   142                 self.assertEqual(srs[key], exp)
       
   143 
       
   144     def test12_coordtransform(self):
       
   145         "Testing initialization of a CoordTransform."
       
   146         target = SpatialReference('WGS84')
       
   147         for s in srlist:
       
   148             if s.proj:
       
   149                 ct = CoordTransform(SpatialReference(s.wkt), target)
       
   150 
       
   151     def test13_attr_value(self):
       
   152         "Testing the attr_value() method."
       
   153         s1 = SpatialReference('WGS84')
       
   154         self.assertRaises(TypeError, s1.__getitem__, 0)
       
   155         self.assertRaises(TypeError, s1.__getitem__, ('GEOGCS', 'foo'))
       
   156         self.assertEqual('WGS 84', s1['GEOGCS'])
       
   157         self.assertEqual('WGS_1984', s1['DATUM'])
       
   158         self.assertEqual('EPSG', s1['AUTHORITY'])
       
   159         self.assertEqual(4326, int(s1['AUTHORITY', 1]))
       
   160         #for i in range(7): self.assertEqual(0, int(s1['TOWGS84', i]))
       
   161         self.assertEqual(None, s1['FOOBAR'])
       
   162     
       
   163 def suite():
       
   164     s = unittest.TestSuite()
       
   165     s.addTest(unittest.makeSuite(SpatialRefTest))
       
   166     return s
       
   167 
       
   168 def run(verbosity=2):
       
   169     unittest.TextTestRunner(verbosity=verbosity).run(suite())