summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit8759cf73decdfbe4413a9b9d52e5926ac5c8f7d1 (patch)
tree8992085d7bbbdba5af7c766dc70adc11029982fa
parentf67a9aab33194780e588e43570fc060369ea6c37 (diff)
downloadChimère-8759cf73decdfbe4413a9b9d52e5926ac5c8f7d1.tar.bz2
Chimère-8759cf73decdfbe4413a9b9d52e5926ac5c8f7d1.zip
Fix shapefile export.
- use ogr/gdal instead of native python bindings.
-rw-r--r--chimere/tests.py5
-rw-r--r--chimere/utils.py42
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