Django:如何使用GeoDjango QuerySet对几何类型应用过滤器

时间:2014-10-14 06:14:56

标签: django django-queryset geodjango

我正在尝试将SQL转换为Django Query:

SELECT * from tbl_name where geometrytype(geometry) LIKE 'POINT';

我已经搜索了它但找不到任何几何类型函数,是否存在?

4 个答案:

答案 0 :(得分:1)

根据这个答案google djangouser forum

  

"你不能,至少不能使用当前的Django版本。 GeoDjango内置   假设几何列仅包含一种几何类型。

     

但是你应该能够使用.raw()查询来获得你想要的东西。 "

所以我创建了这个查询,它适用于我

queryset = ModelName.objects.extra(where=["geometrytype(geometry) LIKE 'POINT'"])

我正在使用额外功能,因为我必须添加一些其他过滤器,例如

queryset = ModelName.objects.extra(where=["geometrytype(geometry) LIKE 'POINT'"]).filter(verified__isnull=True, btype__contains='PHONE')

<强>更新

GeometryType是一个记录GeometryType

的postgis函数
  

GeometryType - 以字符串形式返回几何的类型。例如:   &#39; LINESTRING&#39;,&#39; POLYGON&#39;,&#39; MULTIPOINT&#39;等

我想得到几何类型为POINT的所有记录.Howevver Django没有为 GeometryField 提供自定义过滤器。所以我在django查询中放了postgis函数 GeometryType

答案 1 :(得分:0)

对于偶然发现此线程的任何人,我只是在Django问题跟踪器上创建了一个故障单,以便在def Graph1a(): g1 = tf.Graph() with g1.as_default() as g: matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]]) product = tf.matmul( matrix1, matrix2, name = "product") init_op = tf.global_variables_initializer() sess = tf.Session( graph = g ) sess.run(init_op) return product 上实施过滤:https://code.djangoproject.com/ticket/28696

答案 2 :(得分:0)

你可以注册一个Lookup来实现这个功能,例如:

from django.contrib.gis.db.models import GeometryField
from django.db.models import Lookup


class GeometryTypeLookup(Lookup):  # type:ignore
    """
    Geometry type as a lookup
    """

    lookup_name = "type"
    prepare_rhs = False

    def as_sql(self, compiler: Any, connection: Any) -> Any:
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)
        params = lhs_params + rhs_params

        return "GeometryType(%s) ILIKE %s" % (lhs, rhs), params


GeometryField.register_lookup(GeometryTypeLookup)

然后你像这样使用:

queryset = Feature.objects.filter(geom__type="polygon")

答案 3 :(得分:0)

通过几何类型实现过滤的最简单和最短的方法 (AFAIK) 是通过定义模型 Func 对象来注释查询,然后分别过滤。

from django.db.models import Func

class GeometryType(Func):
    function = "GeometryType"
    output_field = CharField()

#geom is the model's field name for geometry
filtered_qs = ModelName.objects.annotate(geom_type=GeometryType("geom"))
             .filter(geom_type__in={"POINT", "MULTIPOINT"},)