Fixed #16231 -- Added support for GML and KML on the SpatiaLite backend. Thanks, steko for the bug report and jpaulett for the patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16800 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Justin Bronn 2011-09-11 00:52:08 +00:00
parent 83484cc109
commit 28cb5bf162
5 changed files with 28 additions and 11 deletions

View File

@ -393,6 +393,7 @@ answer newbie questions, and generally made Django that much better:
Jay Parlar <parlar@gmail.com> Jay Parlar <parlar@gmail.com>
Claude Paroz <claude@2xlibre.net> Claude Paroz <claude@2xlibre.net>
Carlos Eduardo de Paula <carlosedp@gmail.com> Carlos Eduardo de Paula <carlosedp@gmail.com>
John Paulett <john@paulett.org>
pavithran s <pavithran.s@gmail.com> pavithran s <pavithran.s@gmail.com>
Barry Pederson <bp@barryp.org> Barry Pederson <bp@barryp.org>
Andreas Pelme <andreas@pelme.se> Andreas Pelme <andreas@pelme.se>

View File

@ -133,6 +133,18 @@ class SpatiaLiteOperations(DatabaseOperations, BaseSpatialOperations):
gis_terms += self.geometry_functions.keys() gis_terms += self.geometry_functions.keys()
self.gis_terms = dict([(term, None) for term in gis_terms]) self.gis_terms = dict([(term, None) for term in gis_terms])
if version >= (2, 4, 0):
# Spatialite 2.4.0-RC4 added AsGML and AsKML, however both
# RC2 (shipped in popular Debian/Ubuntu packages) and RC4
# report version as '2.4.0', so we fall back to feature detection
try:
self._get_spatialite_func("AsGML(GeomFromText('POINT(1 1)'))")
self.gml = 'AsGML'
self.kml = 'AsKML'
except DatabaseError:
# we are using < 2.4.0-RC4
pass
def check_aggregate_support(self, aggregate): def check_aggregate_support(self, aggregate):
""" """
Checks if the given aggregate name is supported (that is, if it's Checks if the given aggregate name is supported (that is, if it's

View File

@ -1,5 +1,6 @@
import re import re
from django.db import connection from django.db import connection
from django.db.utils import DatabaseError
from django.contrib.gis import gdal from django.contrib.gis import gdal
from django.contrib.gis.geos import (fromstr, GEOSGeometry, from django.contrib.gis.geos import (fromstr, GEOSGeometry,
Point, LineString, LinearRing, Polygon, GeometryCollection) Point, LineString, LinearRing, Polygon, GeometryCollection)
@ -92,8 +93,8 @@ class GeoModelTest(TestCase):
def test03a_kml(self): def test03a_kml(self):
"Testing KML output from the database using GeoQuerySet.kml()." "Testing KML output from the database using GeoQuerySet.kml()."
# Only PostGIS supports KML serialization # Only PostGIS and Spatialite (>=2.4.0-RC4) support KML serialization
if not postgis: if not (postgis or (spatialite and connection.ops.kml)):
self.assertRaises(NotImplementedError, State.objects.all().kml, field_name='poly') self.assertRaises(NotImplementedError, State.objects.all().kml, field_name='poly')
return return
@ -117,7 +118,7 @@ class GeoModelTest(TestCase):
def test03b_gml(self): def test03b_gml(self):
"Testing GML output from the database using GeoQuerySet.gml()." "Testing GML output from the database using GeoQuerySet.gml()."
if mysql or spatialite: if mysql or (spatialite and not connection.ops.gml) :
self.assertRaises(NotImplementedError, Country.objects.all().gml, field_name='mpoly') self.assertRaises(NotImplementedError, Country.objects.all().gml, field_name='mpoly')
return return
@ -131,13 +132,16 @@ class GeoModelTest(TestCase):
if oracle: if oracle:
# No precision parameter for Oracle :-/ # No precision parameter for Oracle :-/
gml_regex = re.compile(r'^<gml:Point srsName="SDO:4326" xmlns:gml="http://www.opengis.net/gml"><gml:coordinates decimal="\." cs="," ts=" ">-104.60925\d+,38.25500\d+ </gml:coordinates></gml:Point>') gml_regex = re.compile(r'^<gml:Point srsName="SDO:4326" xmlns:gml="http://www.opengis.net/gml"><gml:coordinates decimal="\." cs="," ts=" ">-104.60925\d+,38.25500\d+ </gml:coordinates></gml:Point>')
for ptown in [ptown1, ptown2]: elif spatialite:
self.assertTrue(gml_regex.match(ptown.gml)) # Spatialite has extra colon in SrsName
gml_regex = re.compile(r'^<gml:Point SrsName="EPSG::4326"><gml:coordinates decimal="\." cs="," ts=" ">-104.609251\d+,38.255001</gml:coordinates></gml:Point>')
else: else:
gml_regex = re.compile(r'^<gml:Point srsName="EPSG:4326"><gml:coordinates>-104\.60925\d+,38\.255001</gml:coordinates></gml:Point>') gml_regex = re.compile(r'^<gml:Point srsName="EPSG:4326"><gml:coordinates>-104\.60925\d+,38\.255001</gml:coordinates></gml:Point>')
for ptown in [ptown1, ptown2]: for ptown in [ptown1, ptown2]:
self.assertTrue(gml_regex.match(ptown.gml)) self.assertTrue(gml_regex.match(ptown.gml))
def test03c_geojson(self): def test03c_geojson(self):
"Testing GeoJSON output from the database using GeoQuerySet.geojson()." "Testing GeoJSON output from the database using GeoQuerySet.geojson()."
# Only PostGIS 1.3.4+ supports GeoJSON. # Only PostGIS 1.3.4+ supports GeoJSON.

View File

@ -287,9 +287,9 @@ Method PostGIS Oracle SpatiaLite
:meth:`GeoQuerySet.force_rhr` X :meth:`GeoQuerySet.force_rhr` X
:meth:`GeoQuerySet.geohash` X :meth:`GeoQuerySet.geohash` X
:meth:`GeoQuerySet.geojson` X :meth:`GeoQuerySet.geojson` X
:meth:`GeoQuerySet.gml` X X :meth:`GeoQuerySet.gml` X X X
:meth:`GeoQuerySet.intersection` X X X :meth:`GeoQuerySet.intersection` X X X
:meth:`GeoQuerySet.kml` X :meth:`GeoQuerySet.kml` X X
:meth:`GeoQuerySet.length` X X X :meth:`GeoQuerySet.length` X X X
:meth:`GeoQuerySet.make_line` X :meth:`GeoQuerySet.make_line` X
:meth:`GeoQuerySet.mem_size` X :meth:`GeoQuerySet.mem_size` X

View File

@ -982,7 +982,7 @@ __ http://geojson.org/
.. method:: GeoQuerySet.gml(**kwargs) .. method:: GeoQuerySet.gml(**kwargs)
*Availability*: PostGIS, Oracle *Availability*: PostGIS, Oracle, SpatiaLite
Attaches a ``gml`` attribute to every model in the queryset that contains the Attaches a ``gml`` attribute to every model in the queryset that contains the
`Geographic Markup Language (GML)`__ representation of the geometry. `Geographic Markup Language (GML)`__ representation of the geometry.
@ -1013,7 +1013,7 @@ __ http://en.wikipedia.org/wiki/Geography_Markup_Language
.. method:: GeoQuerySet.kml(**kwargs) .. method:: GeoQuerySet.kml(**kwargs)
*Availability*: PostGIS *Availability*: PostGIS, SpatiaLite
Attaches a ``kml`` attribute to every model in the queryset that contains the Attaches a ``kml`` attribute to every model in the queryset that contains the
`Keyhole Markup Language (KML)`__ representation of the geometry fields. It `Keyhole Markup Language (KML)`__ representation of the geometry fields. It