예제 #1
0
 def test09_authority(self):
     "Testing the authority name & code routines."
     for s in srlist:
         if hasattr(s, 'auth'):
             srs = SpatialReference(s.wkt)
             for target, tup in s.auth.items():
                 self.assertEqual(tup[0], srs.auth_name(target))
                 self.assertEqual(tup[1], srs.auth_code(target))
예제 #2
0
 def test04_proj(self):
     "Test PROJ.4 import and export."
     proj_parts = [
         '+proj=longlat', '+ellps=WGS84', '+towgs84=0,0,0,0,0,0,0', '+datum=WGS84', '+no_defs'
     ]
     srs1 = SpatialReference(srlist[0].wkt)
     srs2 = SpatialReference(WGS84_proj)
     self.assertTrue(all(part in proj_parts for part in srs1.proj.split()))
     self.assertTrue(all(part in proj_parts for part in srs2.proj.split()))
예제 #3
0
    def test_srs(self):
        "Testing OGR Geometries with Spatial Reference objects."
        for mp in self.geometries.multipolygons:
            # Creating a geometry w/spatial reference
            sr = SpatialReference('WGS84')
            mpoly = OGRGeometry(mp.wkt, sr)
            self.assertEqual(sr.wkt, mpoly.srs.wkt)

            # Ensuring that SRS is propagated to clones.
            klone = mpoly.clone()
            self.assertEqual(sr.wkt, klone.srs.wkt)

            # Ensuring all children geometries (polygons and their rings) all
            # return the assigned spatial reference as well.
            for poly in mpoly:
                self.assertEqual(sr.wkt, poly.srs.wkt)
                for ring in poly:
                    self.assertEqual(sr.wkt, ring.srs.wkt)

            # Ensuring SRS propagate in topological ops.
            a = OGRGeometry(self.geometries.topology_geoms[0].wkt_a, sr)
            b = OGRGeometry(self.geometries.topology_geoms[0].wkt_b, sr)
            diff = a.difference(b)
            union = a.union(b)
            self.assertEqual(sr.wkt, diff.srs.wkt)
            self.assertEqual(sr.srid, union.srs.srid)

            # Instantiating w/an integer SRID
            mpoly = OGRGeometry(mp.wkt, 4326)
            self.assertEqual(4326, mpoly.srid)
            mpoly.srs = SpatialReference(4269)
            self.assertEqual(4269, mpoly.srid)
            self.assertEqual('NAD83', mpoly.srs.name)

            # Incrementing through the multipolygon after the spatial reference
            # has been re-assigned.
            for poly in mpoly:
                self.assertEqual(mpoly.srs.wkt, poly.srs.wkt)
                poly.srs = 32140
                for ring in poly:
                    # Changing each ring in the polygon
                    self.assertEqual(32140, ring.srs.srid)
                    self.assertEqual('NAD83 / Texas South Central',
                                     ring.srs.name)
                    ring.srs = str(SpatialReference(4326))  # back to WGS84
                    self.assertEqual(4326, ring.srs.srid)

                    # Using the `srid` property.
                    ring.srid = 4322
                    self.assertEqual('WGS 72', ring.srs.name)
                    self.assertEqual(4322, ring.srid)

            # srs/srid may be assigned their own values, even when srs is None.
            mpoly = OGRGeometry(mp.wkt, srs=None)
            mpoly.srs = mpoly.srs
            mpoly.srid = mpoly.srid
예제 #4
0
 def test02_bad_wkt(self):
     "Testing initialization on invalid WKT."
     for bad in bad_srlist:
         try:
             srs = SpatialReference(bad)
             srs.validate()
         except (SRSException, GDALException):
             pass
         else:
             self.fail('Should not have initialized on bad WKT "%s"!')
예제 #5
0
 def test05_epsg(self):
     "Test EPSG import."
     for s in srlist:
         if s.epsg:
             srs1 = SpatialReference(s.wkt)
             srs2 = SpatialReference(s.epsg)
             srs3 = SpatialReference(str(s.epsg))
             srs4 = SpatialReference('EPSG:%d' % s.epsg)
             for srs in (srs1, srs2, srs3, srs4):
                 for attr, expected in s.attr:
                     self.assertEqual(expected, srs[attr])
예제 #6
0
 def test10_attributes(self):
     "Testing the attribute retrieval routines."
     for s in srlist:
         srs = SpatialReference(s.wkt)
         for tup in s.attr:
             att = tup[0]  # Attribute to test
             exp = tup[1]  # Expected result
             self.assertEqual(exp, srs[att])
예제 #7
0
 def test08_angular_linear(self):
     "Testing the linear and angular units routines."
     for s in srlist:
         srs = SpatialReference(s.wkt)
         self.assertEqual(s.ang_name, srs.angular_name)
         self.assertEqual(s.lin_name, srs.linear_name)
         self.assertAlmostEqual(s.ang_units, srs.angular_units, 9)
         self.assertAlmostEqual(s.lin_units, srs.linear_units, 9)
예제 #8
0
    def test_unicode(self):
        wkt = (
            'PROJCS["DHDN / Soldner 39 Langschoß",'
            'GEOGCS["DHDN",DATUM["Deutsches_Hauptdreiecksnetz",'
            'SPHEROID["Bessel 1841",6377397.155,299.1528128,AUTHORITY["EPSG","7004"]],AUTHORITY["EPSG","6314"]],'
            'PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],'
            'UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],'
            'AUTHORITY["EPSG","4314"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],'
            'PROJECTION["Cassini_Soldner"],PARAMETER["latitude_of_origin",50.66738711],'
            'PARAMETER["central_meridian",6.28935703],PARAMETER["false_easting",0],'
            'PARAMETER["false_northing",0],AUTHORITY["mj10777.de","187939"],AXIS["x",NORTH],AXIS["y",EAST]]'
        )
        srs = SpatialReference(wkt)
        srs_list = [srs, srs.clone()]
        srs.import_wkt(wkt)

        for srs in srs_list:
            self.assertEqual(srs.name, 'DHDN / Soldner 39 Langschoß')
            self.assertEqual(srs.wkt, wkt)
            self.assertIn('Langschoß', srs.pretty_wkt)
            self.assertIn('Langschoß', srs.xml)
예제 #9
0
 def test11_wellknown(self):
     "Testing Well Known Names of Spatial References."
     for s in well_known:
         srs = SpatialReference(s.wk)
         self.assertEqual(s.name, srs.name)
         for tup in s.attrs:
             if len(tup) == 2:
                 key = tup[0]
                 exp = tup[1]
             elif len(tup) == 3:
                 key = tup[:2]
                 exp = tup[2]
             self.assertEqual(srs[key], exp)
예제 #10
0
    def test_srs_transform(self):
        "Testing transform()."
        orig = OGRGeometry('POINT (-104.609 38.255)', 4326)
        trans = OGRGeometry('POINT (992385.4472045 481455.4944650)', 2774)

        # Using an srid, a SpatialReference object, and a CoordTransform object
        # or transformations.
        t1, t2, t3 = orig.clone(), orig.clone(), orig.clone()
        t1.transform(trans.srid)
        t2.transform(SpatialReference('EPSG:2774'))
        ct = CoordTransform(SpatialReference('WGS84'), SpatialReference(2774))
        t3.transform(ct)

        # Testing use of the `clone` keyword.
        k1 = orig.clone()
        k2 = k1.transform(trans.srid, clone=True)
        self.assertEqual(k1, orig)
        self.assertNotEqual(k1, k2)

        prec = 3
        for p in (t1, t2, t3, k2):
            self.assertAlmostEqual(trans.x, p.x, prec)
            self.assertAlmostEqual(trans.y, p.y, prec)
예제 #11
0
    def check_srs(self, source_srs):
        "Check the compatibility of the given spatial reference object."

        if isinstance(source_srs, SpatialReference):
            sr = source_srs
        elif isinstance(source_srs, self.spatial_backend.spatial_ref_sys()):
            sr = source_srs.srs
        elif isinstance(source_srs, (int, str)):
            sr = SpatialReference(source_srs)
        else:
            # Otherwise just pulling the SpatialReference from the layer
            sr = self.layer.srs

        if not sr:
            raise LayerMapError('No source reference system defined.')
        else:
            return sr
예제 #12
0
 def test13_attr_value(self):
     "Testing the attr_value() method."
     s1 = SpatialReference('WGS84')
     with self.assertRaises(TypeError):
         s1.__getitem__(0)
     with self.assertRaises(TypeError):
         s1.__getitem__(('GEOGCS', 'foo'))
     self.assertEqual('WGS 84', s1['GEOGCS'])
     self.assertEqual('WGS_1984', s1['DATUM'])
     self.assertEqual('EPSG', s1['AUTHORITY'])
     self.assertEqual(4326, int(s1['AUTHORITY', 1]))
     self.assertIsNone(s1['FOOBAR'])
예제 #13
0
 def get_dump_object(self, obj):
     data = {
         "type": "Feature",
         "properties": self._current,
     }
     if ((self.selected_fields is None or 'pk' in self.selected_fields) and
             'pk' not in data["properties"]):
         data["properties"]["pk"] = obj._meta.pk.value_to_string(obj)
     if self._geometry:
         if self._geometry.srid != self.srid:
             # If needed, transform the geometry in the srid of the global geojson srid
             if self._geometry.srid not in self._cts:
                 srs = SpatialReference(self.srid)
                 self._cts[self._geometry.srid] = CoordTransform(self._geometry.srs, srs)
             self._geometry.transform(self._cts[self._geometry.srid])
         data["geometry"] = eval(self._geometry.geojson)
     else:
         data["geometry"] = None
     return data
예제 #14
0
def add_srs_entry(srs,
                  auth_name='EPSG',
                  auth_srid=None,
                  ref_sys_name=None,
                  database=None):
    """
    Take a GDAL SpatialReference system and add its information to the
    `spatial_ref_sys` table of the spatial backend. Doing this enables
    database-level spatial transformations for the backend.  Thus, this utility
    is useful for adding spatial reference systems not included by default with
    the backend:

    >>> from djmodels.contrib.gis.utils import add_srs_entry
    >>> add_srs_entry(3857)

    Keyword Arguments:
     auth_name:
       This keyword may be customized with the value of the `auth_name` field.
       Defaults to 'EPSG'.

     auth_srid:
       This keyword may be customized with the value of the `auth_srid` field.
       Defaults to the SRID determined by GDAL.

     ref_sys_name:
       For SpatiaLite users only, sets the value of the `ref_sys_name` field.
       Defaults to the name determined by GDAL.

     database:
      The name of the database connection to use; the default is the value
      of `djmodels.db.DEFAULT_DB_ALIAS` (at the time of this writing, its value
      is 'default').
    """
    database = database or DEFAULT_DB_ALIAS
    connection = connections[database]

    if not hasattr(connection.ops, 'spatial_version'):
        raise Exception('The `add_srs_entry` utility only works '
                        'with spatial backends.')
    if not connection.features.supports_add_srs_entry:
        raise Exception('This utility does not support your database backend.')
    SpatialRefSys = connection.ops.spatial_ref_sys()

    # If argument is not a `SpatialReference` instance, use it as parameter
    # to construct a `SpatialReference` instance.
    if not isinstance(srs, SpatialReference):
        srs = SpatialReference(srs)

    if srs.srid is None:
        raise Exception('Spatial reference requires an SRID to be '
                        'compatible with the spatial backend.')

    # Initializing the keyword arguments dictionary for both PostGIS
    # and SpatiaLite.
    kwargs = {
        'srid': srs.srid,
        'auth_name': auth_name,
        'auth_srid': auth_srid or srs.srid,
        'proj4text': srs.proj4,
    }

    # Backend-specific fields for the SpatialRefSys model.
    srs_field_names = {f.name for f in SpatialRefSys._meta.get_fields()}
    if 'srtext' in srs_field_names:
        kwargs['srtext'] = srs.wkt
    if 'ref_sys_name' in srs_field_names:
        # SpatiaLite specific
        kwargs['ref_sys_name'] = ref_sys_name or srs.name

    # Creating the spatial_ref_sys model.
    try:
        # Try getting via SRID only, because using all kwargs may
        # differ from exact wkt/proj in database.
        SpatialRefSys.objects.using(database).get(srid=srs.srid)
    except SpatialRefSys.DoesNotExist:
        SpatialRefSys.objects.using(database).create(**kwargs)
예제 #15
0
 def test01_wkt(self):
     "Testing initialization on valid OGC WKT."
     for s in srlist:
         SpatialReference(s.wkt)
예제 #16
0
 def test07_boolean_props(self):
     "Testing the boolean properties."
     for s in srlist:
         srs = SpatialReference(s.wkt)
         self.assertEqual(s.projected, srs.projected)
         self.assertEqual(s.geographic, srs.geographic)
예제 #17
0
 def test03_get_wkt(self):
     "Testing getting the WKT."
     for s in srlist:
         srs = SpatialReference(s.wkt)
         self.assertEqual(s.wkt, srs.wkt)
예제 #18
0
 def test12_coordtransform(self):
     "Testing initialization of a CoordTransform."
     target = SpatialReference('WGS84')
     CoordTransform(SpatialReference(srlist[0].wkt), target)