|
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()) |