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
This commit is contained in:
parent
6644ef72c8
commit
1707304bad
|
@ -125,11 +125,19 @@ class GeoQuerySet(QuerySet):
|
||||||
if not isinstance(precision, (int, long)):
|
if not isinstance(precision, (int, long)):
|
||||||
raise TypeError('Precision keyword must be set with an integer.')
|
raise TypeError('Precision keyword must be set with an integer.')
|
||||||
|
|
||||||
# Setting the options flag
|
# Setting the options flag -- which depends on which version of
|
||||||
options = 0
|
# PostGIS we're using.
|
||||||
if crs and bbox: options = 3
|
major, minor1, minor2 = SpatialBackend.version
|
||||||
elif crs: options = 1
|
if major >=1 and (minor1 >= 4):
|
||||||
elif bbox: options = 2
|
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',
|
s = {'desc' : 'GeoJSON',
|
||||||
'procedure_args' : {'precision' : precision, 'options' : options},
|
'procedure_args' : {'precision' : precision, 'options' : options},
|
||||||
'procedure_fmt' : '%(geo_col)s,%(precision)s,%(options)s',
|
'procedure_fmt' : '%(geo_col)s,%(precision)s,%(options)s',
|
||||||
|
|
|
@ -148,15 +148,16 @@ class GeoModelTest(unittest.TestCase):
|
||||||
ptown1 = City.objects.gml(field_name='point', precision=9).get(name='Pueblo')
|
ptown1 = City.objects.gml(field_name='point', precision=9).get(name='Pueblo')
|
||||||
ptown2 = City.objects.gml(precision=9).get(name='Pueblo')
|
ptown2 = City.objects.gml(precision=9).get(name='Pueblo')
|
||||||
|
|
||||||
|
import re
|
||||||
if SpatialBackend.oracle:
|
if SpatialBackend.oracle:
|
||||||
# No precision parameter for Oracle :-/
|
# No precision parameter for Oracle :-/
|
||||||
import re
|
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]:
|
for ptown in [ptown1, ptown2]:
|
||||||
self.assertEqual(True, bool(gml_regex.match(ptown.gml)))
|
self.failUnless(gml_regex.match(ptown.gml))
|
||||||
else:
|
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]:
|
for ptown in [ptown1, ptown2]:
|
||||||
self.assertEqual('<gml:Point srsName="EPSG:4326"><gml:coordinates>-104.609252,38.255001</gml:coordinates></gml:Point>', ptown.gml)
|
self.failUnless(gml_regex.match(ptown.gml))
|
||||||
|
|
||||||
@no_spatialite
|
@no_spatialite
|
||||||
@no_oracle
|
@no_oracle
|
||||||
|
@ -167,28 +168,38 @@ class GeoModelTest(unittest.TestCase):
|
||||||
if not SpatialBackend.geojson:
|
if not SpatialBackend.geojson:
|
||||||
return
|
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
|
# Precision argument should only be an integer
|
||||||
self.assertRaises(TypeError, City.objects.geojson, precision='foo')
|
self.assertRaises(TypeError, City.objects.geojson, precision='foo')
|
||||||
|
|
||||||
# Reference queries and values.
|
# Reference queries and values.
|
||||||
# SELECT ST_AsGeoJson("geoapp_city"."point", 8, 0) FROM "geoapp_city" WHERE "geoapp_city"."name" = 'Pueblo';
|
# 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(pueblo_json, City.objects.geojson().get(name='Pueblo').geojson)
|
||||||
self.assertEqual(City.objects.geojson().get(name='Pueblo').geojson, json)
|
|
||||||
|
|
||||||
# SELECT ST_AsGeoJson("geoapp_city"."point", 8, 1) FROM "geoapp_city" WHERE "geoapp_city"."name" = 'Houston';
|
# 1.3.x: 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.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.
|
# 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';
|
# 1.3.x: 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.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.
|
# 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';
|
# 1.(3|4).x: 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]}'
|
|
||||||
# Finally, we set every available keyword.
|
# 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
|
@no_oracle
|
||||||
def test03d_svg(self):
|
def test03d_svg(self):
|
||||||
|
|
|
@ -39,10 +39,7 @@ class RelatedGeoModelTest(unittest.TestCase):
|
||||||
"Testing the `transform` GeoQuerySet method on related geographic models."
|
"Testing the `transform` GeoQuerySet method on related geographic models."
|
||||||
# All the transformations are to state plane coordinate systems using
|
# 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).
|
# US Survey Feet (thus a tolerance of 0 implies error w/in 1 survey foot).
|
||||||
if SpatialBackend.postgis:
|
tol = 0
|
||||||
tol = 3
|
|
||||||
else:
|
|
||||||
tol = 0
|
|
||||||
|
|
||||||
def check_pnt(ref, pnt):
|
def check_pnt(ref, pnt):
|
||||||
self.assertAlmostEqual(ref.x, pnt.x, tol)
|
self.assertAlmostEqual(ref.x, pnt.x, tol)
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import unittest
|
import unittest
|
||||||
|
from django.contrib.gis.db.backend import SpatialBackend
|
||||||
from django.contrib.gis.tests.utils import mysql, no_mysql, oracle, postgis, spatialite
|
from django.contrib.gis.tests.utils import mysql, no_mysql, oracle, postgis, spatialite
|
||||||
if not mysql:
|
if not mysql:
|
||||||
from django.contrib.gis.models import SpatialRefSys
|
from django.contrib.gis.models import SpatialRefSys
|
||||||
|
@ -7,6 +8,7 @@ test_srs = ({'srid' : 4326,
|
||||||
'auth_name' : ('EPSG', True),
|
'auth_name' : ('EPSG', True),
|
||||||
'auth_srid' : 4326,
|
'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"]]',
|
'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 ',
|
'proj4' : '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ',
|
||||||
'spheroid' : 'WGS 84', 'name' : 'WGS 84',
|
'spheroid' : 'WGS 84', 'name' : 'WGS 84',
|
||||||
'geographic' : True, 'projected' : False, 'spatialite' : True,
|
'geographic' : True, 'projected' : False, 'spatialite' : True,
|
||||||
|
@ -17,6 +19,7 @@ test_srs = ({'srid' : 4326,
|
||||||
'auth_name' : ('EPSG', False),
|
'auth_name' : ('EPSG', False),
|
||||||
'auth_srid' : 32140,
|
'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"]]',
|
'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 ',
|
'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',
|
'spheroid' : 'GRS 1980', 'name' : 'NAD83 / Texas South Central',
|
||||||
'geographic' : False, 'projected' : True, 'spatialite' : False,
|
'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):
|
class SpatialRefSysTest(unittest.TestCase):
|
||||||
|
|
||||||
@no_mysql
|
@no_mysql
|
||||||
|
@ -45,7 +52,11 @@ class SpatialRefSysTest(unittest.TestCase):
|
||||||
|
|
||||||
# No proj.4 and different srtext on oracle backends :(
|
# No proj.4 and different srtext on oracle backends :(
|
||||||
if postgis:
|
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)
|
self.assertEqual(sd['proj4'], srs.proj4text)
|
||||||
|
|
||||||
@no_mysql
|
@no_mysql
|
||||||
|
@ -68,7 +79,11 @@ class SpatialRefSysTest(unittest.TestCase):
|
||||||
self.assertEqual(sd['proj4'], srs.proj4)
|
self.assertEqual(sd['proj4'], srs.proj4)
|
||||||
# No `srtext` field in the `spatial_ref_sys` table in SpatiaLite
|
# No `srtext` field in the `spatial_ref_sys` table in SpatiaLite
|
||||||
if not 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
|
@no_mysql
|
||||||
def test03_ellipsoid(self):
|
def test03_ellipsoid(self):
|
||||||
|
|
Loading…
Reference in New Issue