test_srs.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import unittest
  2. from unittest import skipUnless
  3. from django.contrib.gis.gdal import HAS_GDAL
  4. if HAS_GDAL:
  5. from django.contrib.gis.gdal import SpatialReference, CoordTransform, OGRException, SRSException
  6. class TestSRS:
  7. def __init__(self, wkt, **kwargs):
  8. self.wkt = wkt
  9. for key, value in kwargs.items():
  10. setattr(self, key, value)
  11. # Some Spatial Reference examples
  12. 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"]]',
  13. proj='+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ',
  14. epsg=4326, projected=False, geographic=True, local=False,
  15. lin_name='unknown', ang_name='degree', lin_units=1.0, ang_units=0.0174532925199,
  16. auth={'GEOGCS': ('EPSG', '4326'), 'spheroid': ('EPSG', '7030')},
  17. attr=(('DATUM', 'WGS_1984'), (('SPHEROID', 1), '6378137'), ('primem|authority', 'EPSG'),),
  18. ),
  19. 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"]]',
  20. proj=None, 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=None, epsg=None, projected=True, geographic=False, local=False,
  27. lin_name='Foot_US', ang_name='Degree', lin_units=0.3048006096012192, ang_units=0.0174532925199,
  28. auth={'PROJCS': (None, None)},
  29. attr=(('PROJCS|GeOgCs|spheroid', 'GRS_1980'), (('projcs', 9), 'UNIT'), (('projcs', 11), None),),
  30. ),
  31. # This is really ESRI format, not WKT -- but the import should work the same
  32. TestSRS('LOCAL_CS["Non-Earth (Meter)",LOCAL_DATUM["Local Datum",0],UNIT["Meter",1.0],AXIS["X",EAST],AXIS["Y",NORTH]]',
  33. esri=True, proj=None, epsg=None, projected=False, geographic=False, local=True,
  34. lin_name='Meter', ang_name='degree', lin_units=1.0, ang_units=0.0174532925199,
  35. attr=(('LOCAL_DATUM', 'Local Datum'), ('unit', 'Meter')),
  36. ),
  37. )
  38. # Well-Known Names
  39. 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'))),
  40. 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'))),
  41. 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'))),
  42. 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'))),
  43. 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'))),
  44. )
  45. 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"]]',)
  46. @skipUnless(HAS_GDAL, "GDAL is required")
  47. class SpatialRefTest(unittest.TestCase):
  48. def test01_wkt(self):
  49. "Testing initialization on valid OGC WKT."
  50. for s in srlist:
  51. SpatialReference(s.wkt)
  52. def test02_bad_wkt(self):
  53. "Testing initialization on invalid WKT."
  54. for bad in bad_srlist:
  55. try:
  56. srs = SpatialReference(bad)
  57. srs.validate()
  58. except (SRSException, OGRException):
  59. pass
  60. else:
  61. self.fail('Should not have initialized on bad WKT "%s"!')
  62. def test03_get_wkt(self):
  63. "Testing getting the WKT."
  64. for s in srlist:
  65. srs = SpatialReference(s.wkt)
  66. self.assertEqual(s.wkt, srs.wkt)
  67. def test04_proj(self):
  68. "Test PROJ.4 import and export."
  69. for s in srlist:
  70. if s.proj:
  71. srs1 = SpatialReference(s.wkt)
  72. srs2 = SpatialReference(s.proj)
  73. self.assertEqual(srs1.proj, srs2.proj)
  74. def test05_epsg(self):
  75. "Test EPSG import."
  76. for s in srlist:
  77. if s.epsg:
  78. srs1 = SpatialReference(s.wkt)
  79. srs2 = SpatialReference(s.epsg)
  80. srs3 = SpatialReference(str(s.epsg))
  81. srs4 = SpatialReference('EPSG:%d' % s.epsg)
  82. for srs in (srs1, srs2, srs3, srs4):
  83. for attr, expected in s.attr:
  84. self.assertEqual(expected, srs[attr])
  85. def test07_boolean_props(self):
  86. "Testing the boolean properties."
  87. for s in srlist:
  88. srs = SpatialReference(s.wkt)
  89. self.assertEqual(s.projected, srs.projected)
  90. self.assertEqual(s.geographic, srs.geographic)
  91. def test08_angular_linear(self):
  92. "Testing the linear and angular units routines."
  93. for s in srlist:
  94. srs = SpatialReference(s.wkt)
  95. self.assertEqual(s.ang_name, srs.angular_name)
  96. self.assertEqual(s.lin_name, srs.linear_name)
  97. self.assertAlmostEqual(s.ang_units, srs.angular_units, 9)
  98. self.assertAlmostEqual(s.lin_units, srs.linear_units, 9)
  99. def test09_authority(self):
  100. "Testing the authority name & code routines."
  101. for s in srlist:
  102. if hasattr(s, 'auth'):
  103. srs = SpatialReference(s.wkt)
  104. for target, tup in s.auth.items():
  105. self.assertEqual(tup[0], srs.auth_name(target))
  106. self.assertEqual(tup[1], srs.auth_code(target))
  107. def test10_attributes(self):
  108. "Testing the attribute retrieval routines."
  109. for s in srlist:
  110. srs = SpatialReference(s.wkt)
  111. for tup in s.attr:
  112. att = tup[0] # Attribute to test
  113. exp = tup[1] # Expected result
  114. self.assertEqual(exp, srs[att])
  115. def test11_wellknown(self):
  116. "Testing Well Known Names of Spatial References."
  117. for s in well_known:
  118. srs = SpatialReference(s.wk)
  119. self.assertEqual(s.name, srs.name)
  120. for tup in s.attrs:
  121. if len(tup) == 2:
  122. key = tup[0]
  123. exp = tup[1]
  124. elif len(tup) == 3:
  125. key = tup[:2]
  126. exp = tup[2]
  127. self.assertEqual(srs[key], exp)
  128. def test12_coordtransform(self):
  129. "Testing initialization of a CoordTransform."
  130. target = SpatialReference('WGS84')
  131. for s in srlist:
  132. if s.proj:
  133. CoordTransform(SpatialReference(s.wkt), target)
  134. def test13_attr_value(self):
  135. "Testing the attr_value() method."
  136. s1 = SpatialReference('WGS84')
  137. self.assertRaises(TypeError, s1.__getitem__, 0)
  138. self.assertRaises(TypeError, s1.__getitem__, ('GEOGCS', 'foo'))
  139. self.assertEqual('WGS 84', s1['GEOGCS'])
  140. self.assertEqual('WGS_1984', s1['DATUM'])
  141. self.assertEqual('EPSG', s1['AUTHORITY'])
  142. self.assertEqual(4326, int(s1['AUTHORITY', 1]))
  143. self.assertEqual(None, s1['FOOBAR'])