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:
parent
83484cc109
commit
28cb5bf162
1
AUTHORS
1
AUTHORS
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue