您的位置:

报错LayerMapError("Could not retrieve geometry from feature.")的解决

  发布时间:2023-04-03 21:54:52
报错的原因这个错误通常是由于在使用Django的GIS模块时, 没有正确的提供几何字段或者在保存数据时没有正确的设置几何字段导致的。还有如果使用Django自带的form来进行数据验证,可以在form中使用gis form fields, 例如PointField 来验证几何数据这样就可以在使用form.is_valid()进行数据验证时对几何数据进行验证。

报错的原因

"Could not retrieve geometry from feature" 这个错误通常是由于在使用Django的GIS模块时, 没有正确的提供几何字段(geometry field)或者在保存数据时没有正确的设置几何字段导致的。

如果你使用Django GIS模型,需要在模型中使用专门的GIS字段(如PointField,LineStringField, PolygonField)代替普通字段。这些字段需要被指定为几何字段。

还要保证提供的几何数据是符合WKT(Well-Known Text)或WKB(Well-Known Binary)格式的数据

另外如果你使用的是django.contrib.gis.geos的GEOSGeometry,要确保传入的字符串是WKT格式的,使用GEOSGeometry.from_wkt()来创建几何对象


from django.contrib.gis.geos import GEOSGeometry
point = GEOSGeometry('POINT(5 23)')

通过以上修改来保证你的数据是正确的,避免出现 "Could not retrieve geometry from feature" 这个错误

另外在保存模型时,要确保传入的几何数据是有效的,如果数据是从前端获取的,可能存在数据不符合几何格式的情况,需要在保存之前检查数据并进行验证。

还有如果使用Django自带的form来进行数据验证,可以在form中使用gis form fields, 例如PointField 来验证几何数据


from django import forms
from django.contrib.gis.forms import PointField

class MyForm(forms.Form):
    point = PointField()

这样就可以在使用form.is_valid()进行数据验证时对几何数据进行验证。

总之这个错误大概是因为几何数据不是正确的格式或者没有传入,需要进行检查并确保数据是正确的。

如何解决

解决方法:

1. 使用 GIS 字段来存储几何数据,如PointField,LineStringField, PolygonField。

2. 保证传入的数据是符合 WKT 或 WKB 格式的。

3. 在保存模型时对几何数据进行验证, 确保数据是正确的

4. 使用GEOSGeometry.from_wkt()或GEOSGeometry.from_wkb()来创建几何对象

5. 使用Django自带的form来进行数据验证,如PointField

6. 保证数据库的GIS扩展已经正确配置,以便支持GIS字段

通过以上修改来保证你的数据是正确的,避免出现 "LayerMapError" 这个错误。

还有就是确保你使用了正确的空间参考系(SRID)来存储和操作几何数据,确保几何字段的SRID和你的数据的SRID相同,并且对数据进行坐标变换转换到目标的空间参考系。

还要注意Django数据库连接的配置, 确保你的Django配置文件中的DATABASES配置的ENGINE是'django.contrib.gis.db.backends.postgis'或者其他GIS数据库,如果是普通数据库,会导致这个错误。

如果仍然存在问题,可以在程序中打印出来空间数据和其对应的SRID,进行debug


print(point.wkt, point.srid)

调试信息可以帮助你找到问题所在,并找到解决问题的方法。

使用例子

下面为例子:

1. 使用GIS字段来存储几何数据:


from django.contrib.gis.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    location = models.PointField()

2. 使用GEOSGeometry来创建几何对象


from django.contrib.gis.geos import GEOSGeometry
point = GEOSGeometry('POINT(5 23)')
MyModel.objects.create(name='my point', location=point)

3. 使用Django form进行数据验证


from django import forms
from django.contrib.gis.forms import PointField

class MyForm(forms.Form):
    name = forms.CharField(max_length=100)
    location = PointField()

form = MyForm(data={'name': 'my point', 'location': 'POINT(5 23)'})
form.is_valid()
#True

4. 打印出来空间数据和其对应的SRID


point = MyModel.objects.get(name='my point').location
print(point.wkt, point.srid)

以上代码仅供参考,具体实现可能因为项目而有所不同

还有就是如果数据库连接配置有问题,可能会导致无法使用GIS字段,需要在配置文件中检查DATABASES的配置:


DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}