您的位置:

处理django出现报错GDALException("Specify srid for JSON or dict input.")

  发布时间:2023-04-04 12:49:41
报错的原因这个错误是由于Django在使用GEOS库进行空间操作时遇到了SRID问题。在Django中,默认情况下使用SRID 4326,即WGS 84。但是当传入的数据没有SRID信息时,会抛出上述错误。解决方法有两个:显式地将SRID传递给GEOS函数。在settings.py文件中设置DEFAULT_SRID为你想要的坐标系统的SRID。这样在你调用GEOS函数的时候就不需要指明SRID了。检查第三方库的文档,看看是否有方法可以指定SRID,例如django-leaflet中的方法。具体做法需要根据你的具体场景来判断选择。

报错的原因

这个错误是由于Django在使用GEOS库进行空间操作时遇到了SRID(空间参考系统ID)问题。SRID是一个整数,用于标识地理数据所使用的坐标参考系统。在Django中,默认情况下使用SRID 4326,即WGS 84(一种常用的地理坐标系统)。但是当传入的数据没有SRID信息时,会抛出上述错误。

解决方法有两个:

1. 显式地将SRID传递给GEOS函数。

2. 在你的settings.py文件中设置DEFAULT_SRID,设置默认的SRID,这样在你调用GEOS函数的时候就不需要指明SRID了

具体细节可以参考Django文档 https://docs.djangoproject.com/en/3.2/ref/contrib/gis/geos/

另外,也可能是在Django中使用了第三方库,如django-leaflet、django-geojson,它们未指定SRID的时候也可能出现这个错误

或者是你在使用了没有标明SRID的数据,导致GEOS库无法识别,抛出上述错误。

如果你确定自己的数据是有SRID的,而且你的Django的配置文件也没有问题,那么最好检查一下第三方库,看看是否是它们导致了问题

如何解决

解决方法有以下几种:

1. 显式地将SRID传递给GEOS函数,例如使用Point(x, y, srid=4326)来创建一个点。

2. 在settings.py文件中设置DEFAULT_SRID为你想要的坐标系统的SRID。这样在你调用GEOS函数的时候就不需要指明SRID了。

3. 检查第三方库的文档,看看是否有方法可以指定SRID,例如django-leaflet中的SpatialRefSys.objects.create()方法。

4. 校验你自己的数据是否有SRID信息,如果没有可以尝试手动在数据中加上SRID信息。

具体做法需要根据你的具体场景来判断选择。

使用例子

当然有,下面是一些例子:

1. 显式地传递SRID:


from django.contrib.gis.geos import Point

point = Point(x=1.0, y=2.0, srid=4326)

2. 设置DEFAULT_SRID:


# settings.py
DEFAULT_SRID = 4326

3. 使用第三方库:


from django.contrib.gis.db import models
from django_leaflet.fields import PointField

class MyModel(models.Model):
    point = PointField()
    #...

4. 校验数据,手动加上SRID信息:


from django.contrib.gis.geos import Point, WGS84_SRID

point = Point(x=1.0, y=2.0)
point.srid = WGS84_SRID

记住,需要根据你的具体场景来选择使用的方法。