コード例 #1
0
    def test_diff_intersection_union(self):
        "Testing the `difference`, `intersection`, `sym_difference`, and `union` GeoQuerySet methods."
        geom = Point(5, 23, srid=4326)
        qs = Country.objects.all().annotate(
            difference=functions.Difference('mpoly', geom),
            sym_difference=functions.SymDifference('mpoly', geom),
            union=functions.Union('mpoly', geom),
        )

        # For some reason SpatiaLite does something screwy with the Texas geometry here.
        # Also, it doesn't like the null intersection.
        if spatialite:
            qs = qs.exclude(name='Texas')
        else:
            qs = qs.annotate(
                intersection=functions.Intersection('mpoly', geom))

        if oracle:
            # Should be able to execute the queries; however, they won't be the same
            # as GEOS (because Oracle doesn't use GEOS internally like PostGIS or
            # SpatiaLite).
            return
        for c in qs:
            self.assertTrue(c.mpoly.difference(geom).equals(c.difference))
            if not (spatialite or mysql):
                self.assertEqual(c.mpoly.intersection(geom), c.intersection)
            self.assertTrue(
                c.mpoly.sym_difference(geom).equals(c.sym_difference))
            self.assertTrue(c.mpoly.union(geom).equals(c.union))
コード例 #2
0
 def test_intersection(self):
     geom = Point(5, 23, srid=4326)
     qs = Country.objects.annotate(inter=functions.Intersection("mpoly", geom))
     for c in qs:
         if connection.features.empty_intersection_returns_none:
             self.assertIsNone(c.inter)
         else:
             self.assertIs(c.inter.empty, True)
コード例 #3
0
 def test_intersection(self):
     geom = Point(5, 23, srid=4326)
     qs = Country.objects.annotate(
         inter=functions.Intersection('mpoly', geom))
     for c in qs:
         expected = (None
                     if connection.features.empty_intersection_returns_none
                     else c.mpoly.intersection(geom))
         self.assertEqual(c.inter, expected)
コード例 #4
0
 def test_intersection(self):
     geom = Point(5, 23, srid=4326)
     qs = Country.objects.annotate(inter=functions.Intersection('mpoly', geom))
     for c in qs:
         if spatialite or (mysql and not connection.features.supports_empty_geometry_collection) or oracle:
             # When the intersection is empty, some databases return None.
             expected = None
         else:
             expected = c.mpoly.intersection(geom)
         self.assertEqual(c.inter, expected)
コード例 #5
0
 def test_intersection(self):
     geom = Point(5, 23, srid=4326)
     qs = Country.objects.annotate(
         inter=functions.Intersection('mpoly', geom))
     for c in qs:
         if spatialite:
             # When the intersection is empty, Spatialite returns None
             expected = None
         else:
             expected = c.mpoly.intersection(geom)
         self.assertEqual(c.inter, expected)
コード例 #6
0
 def test_intersection(self):
     geom = Point(5, 23, srid=4326)
     qs = Country.objects.annotate(inter=functions.Intersection('mpoly', geom))
     for c in qs:
         if spatialite or mysql:
             # When the intersection is empty, Spatialite and MySQL return None
             expected = None
         elif oracle:
             # When the intersection is empty, Oracle returns an empty string
             expected = ''
         else:
             expected = c.mpoly.intersection(geom)
         self.assertEqual(c.inter, expected)
コード例 #7
0
    def test_diff_intersection_union(self):
        geom = Point(5, 23, srid=4326)
        qs = Country.objects.all().annotate(
            difference=functions.Difference('mpoly', geom),
            sym_difference=functions.SymDifference('mpoly', geom),
            union=functions.Union('mpoly', geom),
            intersection=functions.Intersection('mpoly', geom),
        )

        if oracle:
            # Should be able to execute the queries; however, they won't be the same
            # as GEOS (because Oracle doesn't use GEOS internally like PostGIS or
            # SpatiaLite).
            return
        for c in qs:
            self.assertTrue(c.mpoly.difference(geom).equals(c.difference))
            if not (spatialite or mysql):
                self.assertEqual(c.mpoly.intersection(geom), c.intersection)
            self.assertTrue(c.mpoly.sym_difference(geom).equals(c.sym_difference))
            self.assertTrue(c.mpoly.union(geom).equals(c.union))
コード例 #8
0
    def test_diff_intersection_union(self):
        geom = Point(5, 23, srid=4326)
        qs = Country.objects.annotate(
            difference=functions.Difference("mpoly", geom),
            sym_difference=functions.SymDifference("mpoly", geom),
            union=functions.Union("mpoly", geom),
            intersection=functions.Intersection("mpoly", geom),
        )

        if connection.ops.oracle:
            # Should be able to execute the queries; however, they won't be the same
            # as GEOS (because Oracle doesn't use GEOS internally like PostGIS or
            # SpatiaLite).
            return
        for c in qs:
            self.assertTrue(c.mpoly.difference(geom).equals(c.difference))
            if connection.features.empty_intersection_returns_none:
                self.assertIsNone(c.intersection)
            else:
                self.assertIs(c.intersection.empty, True)
            self.assertTrue(c.mpoly.sym_difference(geom).equals(c.sym_difference))
            self.assertTrue(c.mpoly.union(geom).equals(c.union))
コード例 #9
0
    def tile(self, bbox, z=0, format=None, clip=True):
        """Returns a GeoQuerySet intersecting a tile boundary.

        Arguments:
        bbox -- tile extent as geometry
        Keyword args:
        z -- tile zoom level used as basis for geometry simplification
        format -- vector tile format as str (pbf, geojson)
        clip -- clip geometries to tile boundary as boolean
        """
        # Tile grid uses 3857, but GeoJSON coordinates should be in 4326.
        tile_srid = 3857
        bbox = getattr(bbox, 'geos', bbox)
        clone = filter_geometry(self, intersects=bbox)
        field = clone.geo_field
        srid = field.srid
        sql = field.name
        try:
            tilew = self.tilewidths[z]
        except IndexError:
            tilew = self.tilewidths[-1]
        if bbox.srid != srid:
            bbox = bbox.transform(srid, clone=True)
        # Estimate tile width in degrees instead of meters.
        if bbox.srs.geographic:
            p = geos.Point(tilew, tilew, srid=tile_srid)
            p.transform(srid)
            tilew = p.x
        if clip:
            bufbox = bbox.buffer(tilew)
            sql = geofn.Intersection(sql, bufbox.envelope)
        sql = SimplifyPreserveTopology(sql, tilew)
        if format == 'pbf':
            return clone.pbf(bbox, geo_col=sql)
        sql = geofn.Transform(sql, 4326)
        return clone.annotate(**{format: sql})