您的位置:

解决ValueError("Only numeric values of degree units are ""allowed on geographic DWithin queries.")在django出现报错

  发布时间:2023-04-04 22:20:23
报错的原因这个错误消息表明,你正在使用Django ORM查询中的DWithin查询,并且你正在尝试使用非数字值作为距离单位。请注意,上面的代码仅作为示例代码, 根据你实际需求可能需要做出相应调整。注意,在上面的示例中,MyModel是你的Django模型的名称,location是你存储位置信息的字段。如果你需要使用其他单位或不能使用PyProj库,可以使用上面提到的自定义函数将距离值转换为度,然后将转换后的值传递给DWithin查询。

报错的原因

这个错误消息表明,你正在使用Django ORM查询中的DWithin查询(一种地理查询,用于找到与某个位置距离在特定范围内的对象),并且你正在尝试使用非数字值作为距离单位。

Django要求距离必须是以度为单位的数字,所以如果你使用了其他单位,如米或英里,就会抛出这个错误。

解决这个错误的方法是确保距离值是以度为单位的数字。如果你正在使用其他单位,可以使用工具或库将它们转换为度。

如何解决

要解决这个问题,你需要确保你使用的距离值是以度为单位的。如果你正在使用其他单位,可以使用以下方法将它们转换为度。

- 使用 Python 库,如 PyProj 可以轻松地将距离单位转换为度。

- 可以自己写转换代码,将米或其他单位转换为度。

举个例子,如果你要将距离转换为度(举个例子是将米转换为度),可以使用以下代码:


from math import pi

def distance_to_degrees(distance, radius=6371):
    return distance / radius / 1000 / pi * 180

然后可以将距离值传递给这个函数转换为度,然后将转换后的值用于Django的DWithin查询。

请注意,上面的代码仅作为示例代码, 根据你实际需求可能需要做出相应调整。

使用例子

当然可以,以下是在Django中使用DWithin查询的示例代码,其中包括使用PyProj库将距离转换为度的代码:


from django.contrib.gis.geos import Point
from django.contrib.gis.measure import D
from pyproj import Transformer

transformer = Transformer.from_crs("epsg:3857", "epsg:4326")
# epsg:3857 is for distance in meter
# epsg:4326 is for degree

# Create a point representing the location you want to search around
point = Point(x=12.4924, y=41.8902)

# Use the transformer to convert the point's coordinates to degrees
point.transform(transformer.transform)

# Use the DWithin manager method to search for objects within a certain distance of the point
objects = MyModel.objects.filter(location__dwithin=(point, D(m=1000)))

这个例子中,我们使用PyProj库将查询点的坐标从"epsg:3857"转换为"epsg:4326" ,然后我们就可以在这个点周围1km(1000m)内的所有对象。

注意,在上面的示例中,MyModel是你的Django模型的名称,location是你存储位置信息的字段。

如果你需要使用其他单位或不能使用PyProj库,可以使用上面提到的自定义函数将距离值转换为度,然后将转换后的值传递给DWithin查询。