django 获取坐标内的多边形

django get polygons inside coordinates

我有一个前端给我的坐标

"[[{"lat":45.36324254131911,"lng":2.471923828125},{"lat":46.667815881216754,"lng":2.471923828125},{"lat":46.667815881216754,"lng":6.50390625},{"lat":45.36324254131911,"lng":6.50390625}]]"

这是一个矩形。

我有一个存储多边形数据的模型

from djgeojson.fields import PolygonField

class MyCords(models.Model):

    geom = PolygonField()

Mycords.geom 的单个实例给我这样的数据:

{'type': 'Polygon',
 'coordinates': [[[5.328369, 45.251688],
   [5.910645, 44.980342],
   [6.328125, 45.375302],
   [6.075439, 45.859412],
   [5.471191, 45.698507],
   [5.328369, 45.251688]]]}

这里我想过滤给定坐标内的所有MyCords。

我怎样才能通过查询集得到这个?

解决方案需要 2 个步骤:

  1. 根据输入坐标创建一个 Polygon。我们需要通读列表并创建坐标元组列表(根据链接文档):

    input_coords = json.loads("[[{"lat":45.36324254131911,"lng":2.471923828125},{"lat":46.667815881216754,"lng":2.471923828125},{"lat":46.667815881216754,"lng":6.50390625},{"lat":45.36324254131911,"lng":6.50390625}]]")
    coord_lst = [(pair['lat'], pair['lng']) for pair in input_coords]
    
    # Note: In order to have a valid Polygon, the first coord pair 
    # needs to be equal to the last pair:
    coord_lst.append(coord_lst[0])
    input_polygon = Polygon(coord_lst)
    

    注意: 如果输入是边界框并且您知道 (Xmin, Ymin)(Xmax, Ymax) 对,则可以创建一个有效的多边形,如下所示:
    input_polygon = Polygon.from_bbox((Xmin, Ymin, Xmax, Ymax))

  2. 我们应该考虑我们的数据 (MyCords) 与 input_polygon 的 2 种可能性(遵循此答案 filter by polygon draw in geodjango 中呈现的相同模式):

    1. input_polygonintersects我们的数据。

      那么查询应该如下所示:

      MyCords.objects.filter(geom__intersects=input_polygon)
      
    2. 数据完全within input_polygon.

      那么查询应该如下所示:

      MyCords.objects.filter(geom__within=input_polygon)
      

    我们甚至可以将 2 组合起来并搜索 within intersect 给定 input_polygon 的数据。为此,我们可以使用 Django 的 Q() object| (OR) 运算符,如下所示:

    MyCords.objects.filter(
        Q(geom__intersects=input_polygon) |
        Q(geom__within=input_polygon)
    )