Fixed #15378 -- Now properly handle OGR layers that have features with invalid geometries. Thanks, kunitoki for bug report and initial patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@15813 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Justin Bronn 2011-03-15 02:26:37 +00:00
parent dd3313bf6d
commit 1fdbcadd22
6 changed files with 19 additions and 3 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -43,6 +43,9 @@ class ICity1(CityBase):
class ICity2(ICity1): class ICity2(ICity1):
dt_time = models.DateTimeField(auto_now=True) dt_time = models.DateTimeField(auto_now=True)
class Invalid(models.Model):
point = models.PointField()
# Mapping dictionaries for the models above. # Mapping dictionaries for the models above.
co_mapping = {'name' : 'Name', co_mapping = {'name' : 'Name',
'state' : {'name' : 'State'}, # ForeignKey's use another mapping dictionary for the _related_ Model (State in this case). 'state' : {'name' : 'State'}, # ForeignKey's use another mapping dictionary for the _related_ Model (State in this case).

View File

@ -4,16 +4,19 @@ from decimal import Decimal
from django.utils.copycompat import copy from django.utils.copycompat import copy
from django.utils.unittest import TestCase from django.utils.unittest import TestCase
from django.contrib.gis.gdal import DataSource from django.contrib.gis.gdal import DataSource, OGRException
from django.contrib.gis.tests.utils import mysql from django.contrib.gis.tests.utils import mysql
from django.contrib.gis.utils.layermapping import LayerMapping, LayerMapError, InvalidDecimal, MissingForeignKey from django.contrib.gis.utils.layermapping import LayerMapping, LayerMapError, InvalidDecimal, MissingForeignKey
from models import City, County, CountyFeat, Interstate, ICity1, ICity2, State, city_mapping, co_mapping, cofeat_mapping, inter_mapping from models import \
City, County, CountyFeat, Interstate, ICity1, ICity2, Invalid, State, \
city_mapping, co_mapping, cofeat_mapping, inter_mapping
shp_path = os.path.realpath(os.path.join(os.path.dirname(__file__), os.pardir, 'data')) shp_path = os.path.realpath(os.path.join(os.path.dirname(__file__), os.pardir, 'data'))
city_shp = os.path.join(shp_path, 'cities', 'cities.shp') city_shp = os.path.join(shp_path, 'cities', 'cities.shp')
co_shp = os.path.join(shp_path, 'counties', 'counties.shp') co_shp = os.path.join(shp_path, 'counties', 'counties.shp')
inter_shp = os.path.join(shp_path, 'interstates', 'interstates.shp') inter_shp = os.path.join(shp_path, 'interstates', 'interstates.shp')
invalid_shp = os.path.join(shp_path, 'invalid', 'emptypoints.shp')
# Dictionaries to hold what's expected in the county shapefile. # Dictionaries to hold what's expected in the county shapefile.
NAMES = ['Bexar', 'Galveston', 'Harris', 'Honolulu', 'Pueblo'] NAMES = ['Bexar', 'Galveston', 'Harris', 'Honolulu', 'Pueblo']
@ -265,3 +268,10 @@ class LayerMapTest(TestCase):
self.assertEqual(6, ICity1.objects.count()) self.assertEqual(6, ICity1.objects.count())
self.assertEqual(3, ICity2.objects.count()) self.assertEqual(3, ICity2.objects.count())
def test07_invalid_layer(self):
"Tests LayerMapping on invalid geometries. See #15378."
invalid_mapping = {'point': 'POINT'}
lm = LayerMapping(Invalid, invalid_shp, invalid_mapping,
source_srs=4326)
lm.save(silent=True)

View File

@ -294,7 +294,10 @@ class LayerMapping(object):
if isinstance(model_field, GeometryField): if isinstance(model_field, GeometryField):
# Verify OGR geometry. # Verify OGR geometry.
val = self.verify_geom(feat.geom, model_field) try:
val = self.verify_geom(feat.geom, model_field)
except OGRException:
raise LayerMapError('Could not retrieve geometry from feature.')
elif isinstance(model_field, models.base.ModelBase): elif isinstance(model_field, models.base.ModelBase):
# The related _model_, not a field was passed in -- indicating # The related _model_, not a field was passed in -- indicating
# another mapping for the related Model. # another mapping for the related Model.