【问题标题】:django get polygons inside coordinatesdjango 获取坐标内的多边形
【发布时间】:2021-09-28 06:48:39
【问题描述】:

我有一个前端给我的坐标

"[[{"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。

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

【问题讨论】:

    标签: django gis geodjango


    【解决方案1】:

    解决方案需要两个步骤:

    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. 我们应该结合input_polygon考虑我们的数据的两种可能性(MyCords)(遵循此答案filter by polygon draw in geodjango中提出的相同模式):

      1. input_polygonintersects 我们的数据。

        那么查询应该是这样的:

        MyCords.objects.filter(geom__intersects=input_polygon)
        
      2. 数据完全是withininput_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)
      )
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 2015-08-08
      • 2012-07-05
      • 1970-01-01
      • 2011-04-19
      • 2011-12-05
      相关资源
      最近更新 更多