不会在“Unknown SRID”上引发异常

时间:2016-05-03 13:29:27

标签: python django geodjango spatialite

采用这个模型:

<div class="switch">
  <label>
    <input type="checkbox">
    <span class="lever"></span>  <span>Option Unchecked</span> 
  </label>
</div>
<div class="switch">
  <label>
    <input type="checkbox" checked>
    <span class="lever"></span>  <span>Option Checked</span> 
  </label>
</div>
<div class="switch">
  <label>
    <input type="checkbox" disabled>
    <span class="lever"></span>  <span>Option Disabled</span> 
  </label>
</div>
<div class="switch">
  <label>
    <input type="checkbox" disabled checked>
    <span class="lever"></span>  <span>Option Checked and disabled</span> 
  </label>
</div>

然后尝试执行此操作,故意给它一个错误的SRID:

from django.contrib.gis.db import models


class Location(models.Model):
    point = models.PointField(null=True, blank=True)

执行最后一个语句from django.contrib.gis.geos import Point from testpoint.models import Location some_location = Location() some_location.point = Point(x=15, y=16, srid=210) some_location.save() 后,控制台上会显示消息“unknown SRID:210”。到现在为止还挺好。问题是some_location.save()成功返回,null存储在.save()中;但我想要的是没有任何东西可以保存,也可以提出异常。

Django似乎将此SQL发送到了spaceite:

point

和spatialite似乎执行它(控制台上印有警告),而没有告诉Django出错了。

如何判断spatialite失败并在SRID错误时返回错误?

1 个答案:

答案 0 :(得分:0)

On GeoDjango Database API documentation声明:

  

此外,如果GEOSGeometry在不同的坐标系中(具有不同的SRID值),那么它将使用空间数据库的转换过程隐式转换为模型字段的SRID。

BaseSpatialField上,PointField的基础,默认的srid设置为4326.它会警告您srid=210不存在并继续转换( x,y)配对EPSG:4326。

我看到两种方法可以解决这个问题(至少目前):

  1. 简单易行:通过在模型定义中定义,强制所有内容转换为EPSG:2100(希腊网格):

    class Location(models.Model):
        point = models.PointField(null=True, blank=True, srid=2100)
    
  2. (更简单)更复杂的方式:创建自定义异常和已接受的SRID列表:SRIDS=[2100, 4326, 3857,...],检查该列表中的传入srid以及它是否为' t匹配,引发自定义异常:

    my_app/exceptions.py

    class UnknownSRID(Exception):
        def __init__(self, message=None):
            self.message = message
    

    my_app/my_test.py

    from django.conf import settings
    from django.contrib.gis.geos import Point
    
    from testpoint.exceptions import UnknownSRID
    from testpoint.models import Location
    
    some_location = Location()
    test_srid=210
    if test_srid not in settings.SRIDS:
        raise UnknownSRID(
            'SRID {} not in list of acceptable SRIDs'.format(test_srid)
        )
    
    some_location.point = Point(x=15, y=16, srid=test_srid)
    some_location.save()