web/lib/django/contrib/gis/tests/test_spatialrefsys.py
author ymh <ymh.work@gmail.com>
Wed, 02 Jun 2010 18:57:35 +0200
changeset 38 77b6da96e6f1
permissions -rw-r--r--
update django
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
import unittest
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
from django.db import connection
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
from django.contrib.gis.tests.utils import mysql, no_mysql, oracle, postgis, spatialite
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
test_srs = ({'srid' : 4326,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
             'auth_name' : ('EPSG', True),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
             'auth_srid' : 4326,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
             'srtext' : '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"]]',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
             'srtext14' : 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
             'proj4' : '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
             'spheroid' : 'WGS 84', 'name' : 'WGS 84', 
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
             'geographic' : True, 'projected' : False, 'spatialite' : True,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
             'ellipsoid' : (6378137.0, 6356752.3, 298.257223563), # From proj's "cs2cs -le" and Wikipedia (semi-minor only)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
             'eprec' : (1, 1, 9),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
             },
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
            {'srid' : 32140,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
             'auth_name' : ('EPSG', False),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
             'auth_srid' : 32140,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
             'srtext' : '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"]]',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
             'srtext14': '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"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],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],AUTHORITY["EPSG","32140"],AXIS["X",EAST],AXIS["Y",NORTH]]',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
             'proj4' : '+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 ',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
             'spheroid' : 'GRS 1980', 'name' : 'NAD83 / Texas South Central',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
             'geographic' : False, 'projected' : True, 'spatialite' : False,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
             'ellipsoid' : (6378137.0, 6356752.31414, 298.257222101), # From proj's "cs2cs -le" and Wikipedia (semi-minor only)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
             'eprec' : (1, 5, 10),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
             },
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
            )
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
if oracle:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    from django.contrib.gis.db.backends.oracle.models import SpatialRefSys
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
elif postgis:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
    from django.contrib.gis.db.backends.postgis.models import SpatialRefSys
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
elif spatialite:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    from django.contrib.gis.db.backends.spatialite.models import SpatialRefSys
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
class SpatialRefSysTest(unittest.TestCase):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    @no_mysql
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    def test01_retrieve(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
        "Testing retrieval of SpatialRefSys model objects."
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
        for sd in test_srs:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
            srs = SpatialRefSys.objects.get(srid=sd['srid'])
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
            self.assertEqual(sd['srid'], srs.srid)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
            # Some of the authority names are borked on Oracle, e.g., SRID=32140.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
            #  also, Oracle Spatial seems to add extraneous info to fields, hence the
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
            #  the testing with the 'startswith' flag.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
            auth_name, oracle_flag = sd['auth_name']
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
            if postgis or (oracle and oracle_flag):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
                self.assertEqual(True, srs.auth_name.startswith(auth_name))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
                
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
            self.assertEqual(sd['auth_srid'], srs.auth_srid)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
            # No proj.4 and different srtext on oracle backends :(
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
            if postgis:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
                if connection.ops.spatial_version >= (1, 4, 0):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
                    srtext = sd['srtext14']
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
                else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
                    srtext = sd['srtext']
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
                self.assertEqual(srtext, srs.wkt)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
                self.assertEqual(sd['proj4'], srs.proj4text)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
    @no_mysql
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
    def test02_osr(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
        "Testing getting OSR objects from SpatialRefSys model objects."
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
        for sd in test_srs:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
            sr = SpatialRefSys.objects.get(srid=sd['srid'])
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
            self.assertEqual(True, sr.spheroid.startswith(sd['spheroid']))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
            self.assertEqual(sd['geographic'], sr.geographic)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
            self.assertEqual(sd['projected'], sr.projected)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
            if not (spatialite and not sd['spatialite']):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
                # Can't get 'NAD83 / Texas South Central' from PROJ.4 string
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
                # on SpatiaLite
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
                self.assertEqual(True, sr.name.startswith(sd['name']))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
            # Testing the SpatialReference object directly.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
            if postgis or spatialite:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
                srs = sr.srs
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
                self.assertEqual(sd['proj4'], srs.proj4)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
                # No `srtext` field in the `spatial_ref_sys` table in SpatiaLite
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
                if not spatialite:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
                    if connection.ops.spatial_version >= (1, 4, 0):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
                        srtext = sd['srtext14']
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
                    else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
                        srtext = sd['srtext']
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
                    self.assertEqual(srtext, srs.wkt)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
    @no_mysql
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
    def test03_ellipsoid(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
        "Testing the ellipsoid property."
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
        for sd in test_srs:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
            # Getting the ellipsoid and precision parameters.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
            ellps1 = sd['ellipsoid']
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
            prec = sd['eprec']
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
            # Getting our spatial reference and its ellipsoid
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
            srs = SpatialRefSys.objects.get(srid=sd['srid'])
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
            ellps2 = srs.ellipsoid
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
            for i in range(3):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
                param1 = ellps1[i]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
                param2 = ellps2[i]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
                self.assertAlmostEqual(ellps1[i], ellps2[i], prec[i])
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
def suite():
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    s = unittest.TestSuite()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
    s.addTest(unittest.makeSuite(SpatialRefSysTest))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
    return s
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
def run(verbosity=2):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
    unittest.TextTestRunner(verbosity=verbosity).run(suite())