您的位置:

处理django出现报错Exception("Spatial reference requires an SRID to be ""compatible with the spatial backend.")

  发布时间:2023-04-01 14:01:03
报错的原因这是由于Django模型中的空间字段未指定空间参考系统 。可以使用Django的`SpatialReference`对象来指定SRID。这通常取决于您使用的地图和数据的来源。例如或者也可以在数据库中执行这样的总结一下,就是需要让Django和数据库都知道空间字段的SRID,这样才能避免这个错误。在数据库里面,可以用postgis的函数来做一些空间查询, 例如上面的例子中,我们通过Distance 函数和 __distance_lte 进行了空间查询,这些操作都是建立在正确的SRID上才能进行的。

报错的原因

这是由于Django模型中的空间字段未指定空间参考系统 (SRID)。 在使用Django的空间字段时,需要在模型中指定空间字段的SRID。 如果没有指定SRID,则Django会抛出上述异常。

如何解决

解决方法是在模型中指定空间字段的SRID。 可以使用Django的`SpatialReference`对象来指定SRID。 例如,使用SRID 4326(WGS 84)可以这样指定空间字段:


from django.contrib.gis.db import models

class MyModel(models.Model):
    point = models.PointField(srid=4326)

在这个例子中,point是空间字段,srid=4326指定了使用SRID 4326。这样就可以避免错误 Exception("Spatial reference requires an SRID to be ""compatible with the spatial backend.")

需要注意的是,使用不同的SRID可能会导致空间数据在地图上显示不正确。因此,在使用空间字段时,应该确保使用正确的SRID。这通常取决于您使用的地图和数据的来源。

还有,当使用postgis数据库作为Django数据库后端时,需要在数据库上为空间字段指定SRID。 可以通过在创建空间字段时使用`SRID`参数来完成此操作。

例如:


class MyModel(models.Model):
    point = models.PointField(srid=4326)
    ...
    def __str__(self):
        return str(self.point.srid)

或者也可以在数据库中执行这样的SQL


SELECT UpdateGeometrySRID('app_name','table_name','geom_field',4326);

总结一下,就是需要让Django和数据库都知道空间字段的SRID,这样才能避免这个错误。

使用例子

确定了Django的模型,以及数据库的配置,就可以尝试一些基本操作了

例如,在Django shell里面:


from myapp.models import MyModel

# create a new point object
point = Point(x=1, y=2, srid=4326)

# Create a new MyModel object and save it to the database
my_model = MyModel(point=point)
my_model.save()

# Print out the SRID of the point
print(my_model.point.srid) # should print 4326

上面的例子中,我们在Django里面创建了一个MyModel的实例,并且存入数据库,取出来的时候会有一个正确的SRID.

另外,你还可以通过gis的query来进行一些空间查询。

如果需要更多的例子可以参考Django's GIS documentation,里面会有更详细的讲解。

在数据库里面,可以用postgis的函数来做一些空间查询, 例如:


from django.contrib.gis.db.models.functions import Distance
from django.contrib.gis.geos import Point

# Reference point
pnt = Point(x=1, y=1, srid=4326)

# Find all MyModel objects within 5 units of the reference point
MyModel.objects.filter(point__distance_lte=(pnt, 5))

# Find the distance from the reference point to all MyModel objects
MyModel.objects.annotate(distance=Distance('point', pnt)).order_by('distance')

上面的例子中,我们通过Distance 函数和 __distance_lte 进行了空间查询,这些操作都是建立在正确的SRID上才能进行的。

如果还需要更多的例子或者更深入的了解,可以参考Django's GIS documentation,里面有详细的说明和例子。