Commit 28cb5bf1 authored by Justin Bronn's avatar Justin Bronn
Browse files

Fixed #16231 -- Added support for GML and KML on the SpatiaLite backend. ...

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
parent 83484cc1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -393,6 +393,7 @@ answer newbie questions, and generally made Django that much better:
    Jay Parlar <parlar@gmail.com>
    Claude Paroz <claude@2xlibre.net>
    Carlos Eduardo de Paula <carlosedp@gmail.com>
    John Paulett <john@paulett.org>
    pavithran s <pavithran.s@gmail.com>
    Barry Pederson <bp@barryp.org>
    Andreas Pelme <andreas@pelme.se>
+12 −0
Original line number Diff line number Diff line
@@ -133,6 +133,18 @@ class SpatiaLiteOperations(DatabaseOperations, BaseSpatialOperations):
        gis_terms += self.geometry_functions.keys()
        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):
        """
        Checks if the given aggregate name is supported (that is, if it's
+11 −7
Original line number Diff line number Diff line
import re
from django.db import connection
from django.db.utils import DatabaseError
from django.contrib.gis import gdal
from django.contrib.gis.geos import (fromstr, GEOSGeometry,
    Point, LineString, LinearRing, Polygon, GeometryCollection)
@@ -92,8 +93,8 @@ class GeoModelTest(TestCase):

    def test03a_kml(self):
        "Testing KML output from the database using GeoQuerySet.kml()."
        # Only PostGIS supports KML serialization
        if not postgis:
        # Only PostGIS and Spatialite (>=2.4.0-RC4) support KML serialization
        if not (postgis or (spatialite and connection.ops.kml)):
            self.assertRaises(NotImplementedError, State.objects.all().kml, field_name='poly')
            return

@@ -117,7 +118,7 @@ class GeoModelTest(TestCase):

    def test03b_gml(self):
        "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')
            return

@@ -131,13 +132,16 @@ class GeoModelTest(TestCase):
        if 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>')
            for ptown in [ptown1, ptown2]:
                self.assertTrue(gml_regex.match(ptown.gml))
        elif spatialite:
            # 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:
            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]:
            self.assertTrue(gml_regex.match(ptown.gml))


    def test03c_geojson(self):
        "Testing GeoJSON output from the database using GeoQuerySet.geojson()."
        # Only PostGIS 1.3.4+ supports GeoJSON.
+2 −2
Original line number Diff line number Diff line
@@ -287,9 +287,9 @@ Method PostGIS Oracle SpatiaLite
:meth:`GeoQuerySet.force_rhr`         X
:meth:`GeoQuerySet.geohash`           X
:meth:`GeoQuerySet.geojson`           X
:meth:`GeoQuerySet.gml`               X        X
:meth:`GeoQuerySet.gml`               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.make_line`         X
:meth:`GeoQuerySet.mem_size`          X
+2 −2
Original line number Diff line number Diff line
@@ -982,7 +982,7 @@ __ http://geojson.org/

.. method:: GeoQuerySet.gml(**kwargs)

*Availability*: PostGIS, Oracle
*Availability*: PostGIS, Oracle, SpatiaLite

Attaches a ``gml`` attribute to every model in the queryset that contains the
`Geographic Markup Language (GML)`__ representation of the geometry.
@@ -1013,7 +1013,7 @@ __ http://en.wikipedia.org/wiki/Geography_Markup_Language

.. method:: GeoQuerySet.kml(**kwargs)

*Availability*: PostGIS
*Availability*: PostGIS, SpatiaLite

Attaches a ``kml`` attribute to every model in the queryset that contains the
`Keyhole Markup Language (KML)`__ representation of the geometry fields. It