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 个步骤:
根据输入坐标创建一个 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))
我们应该考虑我们的数据 (MyCords
) 与 input_polygon
的 2 种可能性(遵循此答案 filter by polygon draw in geodjango 中呈现的相同模式):
input_polygon
intersects
我们的数据。
那么查询应该如下所示:
MyCords.objects.filter(geom__intersects=input_polygon)
数据完全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)
)
我有一个前端给我的坐标
"[[{"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 个步骤:
根据输入坐标创建一个
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))
我们应该考虑我们的数据 (
MyCords
) 与input_polygon
的 2 种可能性(遵循此答案 filter by polygon draw in geodjango 中呈现的相同模式):input_polygon
intersects
我们的数据。那么查询应该如下所示:
MyCords.objects.filter(geom__intersects=input_polygon)
数据完全
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) )