test_srs.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  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, GDALException, 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 = (
  13. TestSRS(
  14. 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,'
  15. 'AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],'
  16. 'PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",'
  17. '0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]',
  18. proj='+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ',
  19. epsg=4326, projected=False, geographic=True, local=False,
  20. lin_name='unknown', ang_name='degree', lin_units=1.0, ang_units=0.0174532925199,
  21. auth={'GEOGCS': ('EPSG', '4326'), 'spheroid': ('EPSG', '7030')},
  22. attr=(('DATUM', 'WGS_1984'), (('SPHEROID', 1), '6378137'), ('primem|authority', 'EPSG'),),
  23. ),
  24. TestSRS(
  25. 'PROJCS["NAD83 / Texas South Central",GEOGCS["NAD83",DATUM["North_American_Datum_1983",'
  26. 'SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],'
  27. 'AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],'
  28. 'UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],'
  29. 'AUTHORITY["EPSG","4269"]],PROJECTION["Lambert_Conformal_Conic_2SP"],'
  30. 'PARAMETER["standard_parallel_1",30.28333333333333],'
  31. 'PARAMETER["standard_parallel_2",28.38333333333333],'
  32. 'PARAMETER["latitude_of_origin",27.83333333333333],'
  33. 'PARAMETER["central_meridian",-99],PARAMETER["false_easting",600000],'
  34. 'PARAMETER["false_northing",4000000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],'
  35. 'AUTHORITY["EPSG","32140"]]',
  36. proj=None, epsg=32140, projected=True, geographic=False, local=False,
  37. lin_name='metre', ang_name='degree', lin_units=1.0, ang_units=0.0174532925199,
  38. auth={'PROJCS': ('EPSG', '32140'), 'spheroid': ('EPSG', '7019'), 'unit': ('EPSG', '9001')},
  39. attr=(
  40. ('DATUM', 'North_American_Datum_1983'),
  41. (('SPHEROID', 2), '298.257222101'),
  42. ('PROJECTION', 'Lambert_Conformal_Conic_2SP'),
  43. ),
  44. ),
  45. TestSRS(
  46. 'PROJCS["NAD_1983_StatePlane_Texas_South_Central_FIPS_4204_Feet",'
  47. 'GEOGCS["GCS_North_American_1983",DATUM["North_American_Datum_1983",'
  48. 'SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],'
  49. 'UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],'
  50. 'PARAMETER["False_Easting",1968500.0],PARAMETER["False_Northing",13123333.33333333],'
  51. 'PARAMETER["Central_Meridian",-99.0],PARAMETER["Standard_Parallel_1",28.38333333333333],'
  52. 'PARAMETER["Standard_Parallel_2",30.28333333333334],PARAMETER["Latitude_Of_Origin",27.83333333333333],'
  53. 'UNIT["Foot_US",0.3048006096012192]]',
  54. proj=None, epsg=None, projected=True, geographic=False, local=False,
  55. lin_name='Foot_US', ang_name='Degree', lin_units=0.3048006096012192, ang_units=0.0174532925199,
  56. auth={'PROJCS': (None, None)},
  57. attr=(('PROJCS|GeOgCs|spheroid', 'GRS_1980'), (('projcs', 9), 'UNIT'), (('projcs', 11), None),),
  58. ),
  59. # This is really ESRI format, not WKT -- but the import should work the same
  60. TestSRS(
  61. 'LOCAL_CS["Non-Earth (Meter)",LOCAL_DATUM["Local Datum",0],UNIT["Meter",1.0],AXIS["X",EAST],AXIS["Y",NORTH]]',
  62. esri=True, proj=None, epsg=None, projected=False, geographic=False, local=True,
  63. lin_name='Meter', ang_name='degree', lin_units=1.0, ang_units=0.0174532925199,
  64. attr=(('LOCAL_DATUM', 'Local Datum'), ('unit', 'Meter')),
  65. ),
  66. )
  67. # Well-Known Names
  68. well_known = (
  69. TestSRS(
  70. 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,'
  71. 'AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],'
  72. 'PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,'
  73. 'AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]',
  74. wk='WGS84', name='WGS 84',
  75. attrs=(('GEOGCS|AUTHORITY', 1, '4326'), ('SPHEROID', 'WGS 84')),
  76. ),
  77. TestSRS(
  78. 'GEOGCS["WGS 72",DATUM["WGS_1972",SPHEROID["WGS 72",6378135,298.26,'
  79. 'AUTHORITY["EPSG","7043"]],AUTHORITY["EPSG","6322"]],'
  80. 'PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],'
  81. 'UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],'
  82. 'AUTHORITY["EPSG","4322"]]',
  83. wk='WGS72', name='WGS 72',
  84. attrs=(('GEOGCS|AUTHORITY', 1, '4322'), ('SPHEROID', 'WGS 72')),
  85. ),
  86. TestSRS(
  87. 'GEOGCS["NAD27",DATUM["North_American_Datum_1927",'
  88. 'SPHEROID["Clarke 1866",6378206.4,294.9786982138982,'
  89. 'AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],'
  90. 'PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],'
  91. 'UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],'
  92. 'AUTHORITY["EPSG","4267"]]',
  93. wk='NAD27', name='NAD27',
  94. attrs=(('GEOGCS|AUTHORITY', 1, '4267'), ('SPHEROID', 'Clarke 1866'))
  95. ),
  96. TestSRS(
  97. 'GEOGCS["NAD83",DATUM["North_American_Datum_1983",'
  98. 'SPHEROID["GRS 1980",6378137,298.257222101,'
  99. 'AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],'
  100. 'PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],'
  101. 'UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],'
  102. 'AUTHORITY["EPSG","4269"]]',
  103. wk='NAD83', name='NAD83',
  104. attrs=(('GEOGCS|AUTHORITY', 1, '4269'), ('SPHEROID', 'GRS 1980')),
  105. ),
  106. TestSRS(
  107. 'PROJCS["NZGD49 / Karamea Circuit",GEOGCS["NZGD49",'
  108. 'DATUM["New_Zealand_Geodetic_Datum_1949",'
  109. 'SPHEROID["International 1924",6378388,297,'
  110. 'AUTHORITY["EPSG","7022"]],'
  111. 'TOWGS84[59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993],'
  112. 'AUTHORITY["EPSG","6272"]],PRIMEM["Greenwich",0,'
  113. 'AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,'
  114. 'AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4272"]],'
  115. 'PROJECTION["Transverse_Mercator"],'
  116. 'PARAMETER["latitude_of_origin",-41.28991152777778],'
  117. 'PARAMETER["central_meridian",172.1090281944444],'
  118. 'PARAMETER["scale_factor",1],PARAMETER["false_easting",300000],'
  119. 'PARAMETER["false_northing",700000],'
  120. 'UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27216"]]',
  121. wk='EPSG:27216', name='NZGD49 / Karamea Circuit',
  122. attrs=(('PROJECTION', 'Transverse_Mercator'), ('SPHEROID', 'International 1924')),
  123. ),
  124. )
  125. bad_srlist = (
  126. 'Foobar',
  127. 'OOJCS["NAD83 / Texas South Central",GEOGCS["NAD83",'
  128. 'DATUM["North_American_Datum_1983",'
  129. 'SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],'
  130. 'AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],'
  131. 'UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],'
  132. 'AUTHORITY["EPSG","4269"]],PROJECTION["Lambert_Conformal_Conic_2SP"],'
  133. 'PARAMETER["standard_parallel_1",30.28333333333333],'
  134. 'PARAMETER["standard_parallel_2",28.38333333333333],'
  135. 'PARAMETER["latitude_of_origin",27.83333333333333],'
  136. 'PARAMETER["central_meridian",-99],PARAMETER["false_easting",600000],'
  137. 'PARAMETER["false_northing",4000000],UNIT["metre",1,'
  138. 'AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32140"]]',
  139. )
  140. @skipUnless(HAS_GDAL, "GDAL is required")
  141. class SpatialRefTest(unittest.TestCase):
  142. def test01_wkt(self):
  143. "Testing initialization on valid OGC WKT."
  144. for s in srlist:
  145. SpatialReference(s.wkt)
  146. def test02_bad_wkt(self):
  147. "Testing initialization on invalid WKT."
  148. for bad in bad_srlist:
  149. try:
  150. srs = SpatialReference(bad)
  151. srs.validate()
  152. except (SRSException, GDALException):
  153. pass
  154. else:
  155. self.fail('Should not have initialized on bad WKT "%s"!')
  156. def test03_get_wkt(self):
  157. "Testing getting the WKT."
  158. for s in srlist:
  159. srs = SpatialReference(s.wkt)
  160. self.assertEqual(s.wkt, srs.wkt)
  161. def test04_proj(self):
  162. "Test PROJ.4 import and export."
  163. for s in srlist:
  164. if s.proj:
  165. srs1 = SpatialReference(s.wkt)
  166. srs2 = SpatialReference(s.proj)
  167. self.assertEqual(srs1.proj, srs2.proj)
  168. def test05_epsg(self):
  169. "Test EPSG import."
  170. for s in srlist:
  171. if s.epsg:
  172. srs1 = SpatialReference(s.wkt)
  173. srs2 = SpatialReference(s.epsg)
  174. srs3 = SpatialReference(str(s.epsg))
  175. srs4 = SpatialReference('EPSG:%d' % s.epsg)
  176. for srs in (srs1, srs2, srs3, srs4):
  177. for attr, expected in s.attr:
  178. self.assertEqual(expected, srs[attr])
  179. def test07_boolean_props(self):
  180. "Testing the boolean properties."
  181. for s in srlist:
  182. srs = SpatialReference(s.wkt)
  183. self.assertEqual(s.projected, srs.projected)
  184. self.assertEqual(s.geographic, srs.geographic)
  185. def test08_angular_linear(self):
  186. "Testing the linear and angular units routines."
  187. for s in srlist:
  188. srs = SpatialReference(s.wkt)
  189. self.assertEqual(s.ang_name, srs.angular_name)
  190. self.assertEqual(s.lin_name, srs.linear_name)
  191. self.assertAlmostEqual(s.ang_units, srs.angular_units, 9)
  192. self.assertAlmostEqual(s.lin_units, srs.linear_units, 9)
  193. def test09_authority(self):
  194. "Testing the authority name & code routines."
  195. for s in srlist:
  196. if hasattr(s, 'auth'):
  197. srs = SpatialReference(s.wkt)
  198. for target, tup in s.auth.items():
  199. self.assertEqual(tup[0], srs.auth_name(target))
  200. self.assertEqual(tup[1], srs.auth_code(target))
  201. def test10_attributes(self):
  202. "Testing the attribute retrieval routines."
  203. for s in srlist:
  204. srs = SpatialReference(s.wkt)
  205. for tup in s.attr:
  206. att = tup[0] # Attribute to test
  207. exp = tup[1] # Expected result
  208. self.assertEqual(exp, srs[att])
  209. def test11_wellknown(self):
  210. "Testing Well Known Names of Spatial References."
  211. for s in well_known:
  212. srs = SpatialReference(s.wk)
  213. self.assertEqual(s.name, srs.name)
  214. for tup in s.attrs:
  215. if len(tup) == 2:
  216. key = tup[0]
  217. exp = tup[1]
  218. elif len(tup) == 3:
  219. key = tup[:2]
  220. exp = tup[2]
  221. self.assertEqual(srs[key], exp)
  222. def test12_coordtransform(self):
  223. "Testing initialization of a CoordTransform."
  224. target = SpatialReference('WGS84')
  225. for s in srlist:
  226. if s.proj:
  227. CoordTransform(SpatialReference(s.wkt), target)
  228. def test13_attr_value(self):
  229. "Testing the attr_value() method."
  230. s1 = SpatialReference('WGS84')
  231. self.assertRaises(TypeError, s1.__getitem__, 0)
  232. self.assertRaises(TypeError, s1.__getitem__, ('GEOGCS', 'foo'))
  233. self.assertEqual('WGS 84', s1['GEOGCS'])
  234. self.assertEqual('WGS_1984', s1['DATUM'])
  235. self.assertEqual('EPSG', s1['AUTHORITY'])
  236. self.assertEqual(4326, int(s1['AUTHORITY', 1]))
  237. self.assertEqual(None, s1['FOOBAR'])