From 1707304bad6f9205a026e16323158bd7ea940111 Mon Sep 17 00:00:00 2001 From: Justin Bronn Date: Mon, 27 Jul 2009 04:21:31 +0000 Subject: [PATCH] Fixed test cases and `GeoQuerySet.geojson` to support PostGIS 1.4. git-svn-id: http://code.djangoproject.com/svn/django/trunk@11340 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/gis/db/models/query.py | 18 +++++--- django/contrib/gis/tests/geoapp/tests.py | 41 ++++++++++++------- django/contrib/gis/tests/relatedapp/tests.py | 5 +-- .../contrib/gis/tests/test_spatialrefsys.py | 19 ++++++++- 4 files changed, 57 insertions(+), 26 deletions(-) diff --git a/django/contrib/gis/db/models/query.py b/django/contrib/gis/db/models/query.py index d055260a58..ad2cd8ceda 100644 --- a/django/contrib/gis/db/models/query.py +++ b/django/contrib/gis/db/models/query.py @@ -125,11 +125,19 @@ class GeoQuerySet(QuerySet): if not isinstance(precision, (int, long)): raise TypeError('Precision keyword must be set with an integer.') - # Setting the options flag - options = 0 - if crs and bbox: options = 3 - elif crs: options = 1 - elif bbox: options = 2 + # Setting the options flag -- which depends on which version of + # PostGIS we're using. + major, minor1, minor2 = SpatialBackend.version + if major >=1 and (minor1 >= 4): + options = 0 + if crs and bbox: options = 3 + elif bbox: options = 1 + elif crs: options = 2 + else: + options = 0 + if crs and bbox: options = 3 + elif crs: options = 1 + elif bbox: options = 2 s = {'desc' : 'GeoJSON', 'procedure_args' : {'precision' : precision, 'options' : options}, 'procedure_fmt' : '%(geo_col)s,%(precision)s,%(options)s', diff --git a/django/contrib/gis/tests/geoapp/tests.py b/django/contrib/gis/tests/geoapp/tests.py index 1eaed196b0..8bf4990fe9 100644 --- a/django/contrib/gis/tests/geoapp/tests.py +++ b/django/contrib/gis/tests/geoapp/tests.py @@ -148,15 +148,16 @@ class GeoModelTest(unittest.TestCase): ptown1 = City.objects.gml(field_name='point', precision=9).get(name='Pueblo') ptown2 = City.objects.gml(precision=9).get(name='Pueblo') + import re if SpatialBackend.oracle: # No precision parameter for Oracle :-/ - import re - gml_regex = re.compile(r'-104.60925\d+,38.25500\d+ ') + gml_regex = re.compile(r'^-104.60925\d+,38.25500\d+ ') for ptown in [ptown1, ptown2]: - self.assertEqual(True, bool(gml_regex.match(ptown.gml))) + self.failUnless(gml_regex.match(ptown.gml)) else: + gml_regex = re.compile(r'^-104\.60925\d+,38\.255001') for ptown in [ptown1, ptown2]: - self.assertEqual('-104.609252,38.255001', ptown.gml) + self.failUnless(gml_regex.match(ptown.gml)) @no_spatialite @no_oracle @@ -167,28 +168,38 @@ class GeoModelTest(unittest.TestCase): if not SpatialBackend.geojson: return + major, minor1, minor2 = SpatialBackend.version + if major >=1 and minor1 >= 4: + pueblo_json = '{"type":"Point","coordinates":[-104.609252,38.255001]}' + houston_json = '{"type":"Point","crs":{"type":"name","properties":{"name":"EPSG:4326"}},"coordinates":[-95.363151,29.763374]}' + victoria_json = '{"type":"Point","bbox":[-123.30519600,48.46261100,-123.30519600,48.46261100],"coordinates":[-123.305196,48.462611]}' + chicago_json = '{"type":"Point","crs":{"type":"name","properties":{"name":"EPSG:4326"}},"bbox":[-87.65018,41.85039,-87.65018,41.85039],"coordinates":[-87.65018,41.85039]}' + else: + pueblo_json = '{"type":"Point","coordinates":[-104.60925200,38.25500100]}' + houston_json = '{"type":"Point","crs":{"type":"EPSG","properties":{"EPSG":4326}},"coordinates":[-95.36315100,29.76337400]}' + victoria_json = '{"type":"Point","bbox":[-123.30519600,48.46261100,-123.30519600,48.46261100],"coordinates":[-123.30519600,48.46261100]}' + chicago_json = '{"type":"Point","crs":{"type":"EPSG","properties":{"EPSG":4326}},"bbox":[-87.65018,41.85039,-87.65018,41.85039],"coordinates":[-87.65018,41.85039]}' + # Precision argument should only be an integer self.assertRaises(TypeError, City.objects.geojson, precision='foo') # Reference queries and values. # SELECT ST_AsGeoJson("geoapp_city"."point", 8, 0) FROM "geoapp_city" WHERE "geoapp_city"."name" = 'Pueblo'; - json = '{"type":"Point","coordinates":[-104.60925200,38.25500100]}' - self.assertEqual(City.objects.geojson().get(name='Pueblo').geojson, json) + self.assertEqual(pueblo_json, City.objects.geojson().get(name='Pueblo').geojson) - # SELECT ST_AsGeoJson("geoapp_city"."point", 8, 1) FROM "geoapp_city" WHERE "geoapp_city"."name" = 'Houston'; - json = '{"type":"Point","crs":{"type":"EPSG","properties":{"EPSG":4326}},"coordinates":[-95.36315100,29.76337400]}' + # 1.3.x: SELECT ST_AsGeoJson("geoapp_city"."point", 8, 1) FROM "geoapp_city" WHERE "geoapp_city"."name" = 'Houston'; + # 1.4.x: SELECT ST_AsGeoJson("geoapp_city"."point", 8, 2) FROM "geoapp_city" WHERE "geoapp_city"."name" = 'Houston'; # This time we want to include the CRS by using the `crs` keyword. - self.assertEqual(City.objects.geojson(crs=True, model_att='json').get(name='Houston').json, json) + self.assertEqual(houston_json, City.objects.geojson(crs=True, model_att='json').get(name='Houston').json) - # SELECT ST_AsGeoJson("geoapp_city"."point", 8, 2) FROM "geoapp_city" WHERE "geoapp_city"."name" = 'Victoria'; - json = '{"type":"Point","bbox":[-123.30519600,48.46261100,-123.30519600,48.46261100],"coordinates":[-123.30519600,48.46261100]}' + # 1.3.x: SELECT ST_AsGeoJson("geoapp_city"."point", 8, 2) FROM "geoapp_city" WHERE "geoapp_city"."name" = 'Victoria'; + # 1.4.x: SELECT ST_AsGeoJson("geoapp_city"."point", 8, 1) FROM "geoapp_city" WHERE "geoapp_city"."name" = 'Houston'; # This time we include the bounding box by using the `bbox` keyword. - self.assertEqual(City.objects.geojson(bbox=True).get(name='Victoria').geojson, json) + self.assertEqual(victoria_json, City.objects.geojson(bbox=True).get(name='Victoria').geojson) - # SELECT ST_AsGeoJson("geoapp_city"."point", 5, 3) FROM "geoapp_city" WHERE "geoapp_city"."name" = 'Chicago'; - json = '{"type":"Point","crs":{"type":"EPSG","properties":{"EPSG":4326}},"bbox":[-87.65018,41.85039,-87.65018,41.85039],"coordinates":[-87.65018,41.85039]}' + # 1.(3|4).x: SELECT ST_AsGeoJson("geoapp_city"."point", 5, 3) FROM "geoapp_city" WHERE "geoapp_city"."name" = 'Chicago'; # Finally, we set every available keyword. - self.assertEqual(City.objects.geojson(bbox=True, crs=True, precision=5).get(name='Chicago').geojson, json) + self.assertEqual(chicago_json, City.objects.geojson(bbox=True, crs=True, precision=5).get(name='Chicago').geojson) @no_oracle def test03d_svg(self): diff --git a/django/contrib/gis/tests/relatedapp/tests.py b/django/contrib/gis/tests/relatedapp/tests.py index 684d33e5e2..ac53c03923 100644 --- a/django/contrib/gis/tests/relatedapp/tests.py +++ b/django/contrib/gis/tests/relatedapp/tests.py @@ -39,10 +39,7 @@ class RelatedGeoModelTest(unittest.TestCase): "Testing the `transform` GeoQuerySet method on related geographic models." # All the transformations are to state plane coordinate systems using # US Survey Feet (thus a tolerance of 0 implies error w/in 1 survey foot). - if SpatialBackend.postgis: - tol = 3 - else: - tol = 0 + tol = 0 def check_pnt(ref, pnt): self.assertAlmostEqual(ref.x, pnt.x, tol) diff --git a/django/contrib/gis/tests/test_spatialrefsys.py b/django/contrib/gis/tests/test_spatialrefsys.py index 4b1cc093eb..dd2c10f7e8 100644 --- a/django/contrib/gis/tests/test_spatialrefsys.py +++ b/django/contrib/gis/tests/test_spatialrefsys.py @@ -1,4 +1,5 @@ import unittest +from django.contrib.gis.db.backend import SpatialBackend from django.contrib.gis.tests.utils import mysql, no_mysql, oracle, postgis, spatialite if not mysql: from django.contrib.gis.models import SpatialRefSys @@ -7,6 +8,7 @@ test_srs = ({'srid' : 4326, 'auth_name' : ('EPSG', True), 'auth_srid' : 4326, 'srtext' : 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]', + 'srtext14' : 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]', 'proj4' : '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ', 'spheroid' : 'WGS 84', 'name' : 'WGS 84', 'geographic' : True, 'projected' : False, 'spatialite' : True, @@ -17,6 +19,7 @@ test_srs = ({'srid' : 4326, 'auth_name' : ('EPSG', False), 'auth_srid' : 32140, 'srtext' : 'PROJCS["NAD83 / Texas South Central",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",30.28333333333333],PARAMETER["standard_parallel_2",28.38333333333333],PARAMETER["latitude_of_origin",27.83333333333333],PARAMETER["central_meridian",-99],PARAMETER["false_easting",600000],PARAMETER["false_northing",4000000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32140"]]', + 'srtext14': 'PROJCS["NAD83 / Texas South Central",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",30.28333333333333],PARAMETER["standard_parallel_2",28.38333333333333],PARAMETER["latitude_of_origin",27.83333333333333],PARAMETER["central_meridian",-99],PARAMETER["false_easting",600000],PARAMETER["false_northing",4000000],AUTHORITY["EPSG","32140"],AXIS["X",EAST],AXIS["Y",NORTH]]', 'proj4' : '+proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs ', 'spheroid' : 'GRS 1980', 'name' : 'NAD83 / Texas South Central', 'geographic' : False, 'projected' : True, 'spatialite' : False, @@ -25,6 +28,10 @@ test_srs = ({'srid' : 4326, }, ) +if SpatialBackend.postgis: + major, minor1, minor2 = SpatialBackend.version + POSTGIS_14 = major >=1 and minor1 >= 4 + class SpatialRefSysTest(unittest.TestCase): @no_mysql @@ -45,7 +52,11 @@ class SpatialRefSysTest(unittest.TestCase): # No proj.4 and different srtext on oracle backends :( if postgis: - self.assertEqual(sd['srtext'], srs.wkt) + if POSTGIS_14: + srtext = sd['srtext14'] + else: + srtext = sd['srtext'] + self.assertEqual(srtext, srs.wkt) self.assertEqual(sd['proj4'], srs.proj4text) @no_mysql @@ -68,7 +79,11 @@ class SpatialRefSysTest(unittest.TestCase): self.assertEqual(sd['proj4'], srs.proj4) # No `srtext` field in the `spatial_ref_sys` table in SpatiaLite if not spatialite: - self.assertEqual(sd['srtext'], srs.wkt) + if POSTGIS_14: + srtext = sd['srtext14'] + else: + srtext = sd['srtext'] + self.assertEqual(srtext, srs.wkt) @no_mysql def test03_ellipsoid(self):