diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-07-19 00:04:49 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-07-19 00:04:49 +0200 |
commit | 8759cf73decdfbe4413a9b9d52e5926ac5c8f7d1 (patch) | |
tree | 8992085d7bbbdba5af7c766dc70adc11029982fa | |
parent | f67a9aab33194780e588e43570fc060369ea6c37 (diff) | |
download | Chimère-8759cf73decdfbe4413a9b9d52e5926ac5c8f7d1.tar.bz2 Chimère-8759cf73decdfbe4413a9b9d52e5926ac5c8f7d1.zip |
Fix shapefile export.
- use ogr/gdal instead of native python bindings.
-rw-r--r-- | chimere/tests.py | 5 | ||||
-rw-r--r-- | chimere/utils.py | 42 |
2 files changed, 25 insertions, 22 deletions
diff --git a/chimere/tests.py b/chimere/tests.py index a659075..b3ad3fb 100644 --- a/chimere/tests.py +++ b/chimere/tests.py @@ -13,6 +13,7 @@ from django.test import TestCase from chimere.models import Area, Icon, Importer, Category, SubCategory, Marker,\ Route +from chimere.utils import ShapefileManager def area_setup(): area_1 = Area.objects.create(name='area 1', order=1, available=True, @@ -132,6 +133,10 @@ class ShapefileImporterTest(TestCase, ImporterTest): self.marker_importers = [(importer, 29), (importer2, 5),] + self.markers = marker_setup() + + def test_export(self): + filename, zip_stream = ShapefileManager.export(Marker.objects.all()) class OSMImporterTest(TestCase, ImporterTest): def setUp(self): diff --git a/chimere/utils.py b/chimere/utils.py index 9eed7f7..38f060e 100644 --- a/chimere/utils.py +++ b/chimere/utils.py @@ -30,12 +30,11 @@ import urllib2 import unicodedata import zipfile +from osgeo import ogr, osr from lxml import etree from django.conf import settings -from django.contrib.gis.gdal import DataSource, Driver, OGRGeometry, \ - OGRGeomType, SpatialReference, check_err -from django.contrib.gis.gdal.libgdal import lgdal +from django.contrib.gis.gdal import DataSource, OGRGeomType, check_err from django.core.exceptions import ObjectDoesNotExist from django.shortcuts import render_to_response from django.utils.translation import ugettext_lazy as _ @@ -395,41 +394,40 @@ class ShapefileManager(ImportManager): geo_field = getattr(queryset.model, 'point' if 'point' in field_names else 'route')._field - dr = Driver('ESRI Shapefile') - ds = lgdal.OGR_Dr_CreateDataSource(dr._ptr, tmp_name, None) + dr = ogr.GetDriverByName('ESRI Shapefile') + ds = dr.CreateDataSource(tmp_name) if ds is None: raise Exception(_(u'Could not create file!')) ogr_type = OGRGeomType(geo_field.geom_type).num - srs = SpatialReference(geo_field.srid) + srs = osr.SpatialReference() + srs.ImportFromEPSG(geo_field.srid) - layer = lgdal.OGR_DS_CreateLayer(ds, 'lyr', srs._ptr, ogr_type, None) + layer = ds.CreateLayer('lyr', srs=srs, geom_type=ogr_type) for field_name in ('name', 'category'): - fld = lgdal.OGR_Fld_Create(field_name, 4) - added = lgdal.OGR_L_CreateField(layer, fld, 0) - check_err(added) + field_defn = ogr.FieldDefn(str(field_name), ogr.OFTString) + field_defn.SetWidth(255) + if layer.CreateField(field_defn) != 0: + raise Exception(_(u'Failed to create field')) - feature_def = lgdal.OGR_L_GetLayerDefn(layer) + feature_def = layer.GetLayerDefn() for item in queryset: # duplicate items when in several categories for category in item.categories.all(): - feat = lgdal.OGR_F_Create(feature_def) - lgdal.OGR_F_SetFieldString(feat, 0, - str(unicode_normalize(item.name)[:80])) - lgdal.OGR_F_SetFieldString(feat, 1, - str(unicode_normalize(category.name)[:80])) + feat = ogr.Feature(feature_def) + feat.SetField('name', str(unicode_normalize(item.name)[:80])) + feat.SetField('category', + str(unicode_normalize(category.name)[:80])) geom = getattr(item, geo_field.name) if not geom: continue - ogr_geom = OGRGeometry(geom.wkt, srs) - check_err(lgdal.OGR_F_SetGeometry(feat, ogr_geom._ptr)) - check_err(lgdal.OGR_L_SetFeature(layer, feat)) + ogr_geom = ogr.CreateGeometryFromWkt(geom.wkt) + check_err(feat.SetGeometry(ogr_geom)) + check_err(layer.CreateFeature(feat)) # Cleaning up - check_err(lgdal.OGR_L_SyncToDisk(layer)) - lgdal.OGR_DS_Destroy(ds) - lgdal.OGRCleanupAll() + ds.Destroy() # writing to a zip file filename = unicode_normalize(settings.PROJECT_NAME) + '-' + date |