mirror of
https://github.com/django/django.git
synced 2025-07-04 09:49:12 +00:00
gis: wktfield now takes advantage of lazy geometries; geos may take unicode input; fixed utils module
git-svn-id: http://code.djangoproject.com/svn/django/branches/gis@5795 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
056f87ab28
commit
5f4ffb369f
@ -7,7 +7,7 @@
|
||||
from ctypes import \
|
||||
byref, string_at, create_string_buffer, pointer, \
|
||||
c_char_p, c_double, c_int, c_size_t
|
||||
from types import StringType, IntType, FloatType
|
||||
from types import StringType, UnicodeType, IntType, FloatType
|
||||
|
||||
# Python and GEOS-related dependencies.
|
||||
import re
|
||||
@ -17,8 +17,11 @@ from django.contrib.gis.geos.error import GEOSException, GEOSGeometryIndexError
|
||||
from django.contrib.gis.geos.coordseq import GEOSCoordSeq, create_cs
|
||||
if HAS_NUMPY: from numpy import ndarray, array
|
||||
|
||||
# Regular expression for recognizing HEXEWKB.
|
||||
hex_regex = re.compile(r'^[0-9A-Fa-f]+$')
|
||||
# Regular expression for recognizing HEXEWKB and WKT. A prophylactic measure
|
||||
# to prevent potentially malicious input from reaching the underlying C
|
||||
# library. Not a substitute for good web security programming practices.
|
||||
hex_regex = re.compile(r'^[0-9A-F]+$', re.I)
|
||||
wkt_regex = re.compile(r'^(POINT|LINESTRING|LINEARRING|POLYGON|MULTIPOINT|MULTILINESTRING|MULTIPOLYGON|GEOMETRYCOLLECTION)[ACEGIMLONPSRUTY\d,\.\-\(\) ]+$', re.I)
|
||||
|
||||
class GEOSGeometry(object):
|
||||
"A class that, generally, encapsulates a GEOS geometry."
|
||||
@ -38,6 +41,10 @@ class GEOSGeometry(object):
|
||||
# Initially, setting the pointer to NULL
|
||||
self._ptr = GEOSPointer(0)
|
||||
|
||||
if isinstance(geo_input, UnicodeType):
|
||||
# Encoding to ASCII, WKT or HEXEWKB doesn't need any more.
|
||||
geo_input = geo_input.encode('ascii')
|
||||
|
||||
if isinstance(geo_input, StringType):
|
||||
if input_type: warn('input_type keyword is deprecated')
|
||||
|
||||
@ -46,9 +53,11 @@ class GEOSGeometry(object):
|
||||
sz = c_size_t(len(geo_input))
|
||||
buf = create_string_buffer(geo_input)
|
||||
g = lgeos.GEOSGeomFromHEX_buf(buf, sz)
|
||||
else:
|
||||
elif wkt_regex.match(geo_input):
|
||||
# Otherwise, the geometry is in WKT form.
|
||||
g = lgeos.GEOSGeomFromWKT(c_char_p(geo_input))
|
||||
else:
|
||||
raise GEOSException, 'given string input "%s" unrecognized as WKT or HEXEWKB.' % geo_input
|
||||
|
||||
elif isinstance(geo_input, (IntType, GEOSPointer)):
|
||||
# When the input is either a raw pointer value (an integer), or a GEOSPointer object.
|
||||
|
@ -1,16 +1,14 @@
|
||||
from django.oldforms import LargeTextField
|
||||
from django.contrib.gis.geos import hex_to_wkt
|
||||
|
||||
class WKTField(LargeTextField):
|
||||
"An oldforms LargeTextField for editing WKT text in the admin."
|
||||
|
||||
def render(self, data):
|
||||
# PostGIS uses EWKBHEX to store its values internally, converting
|
||||
# to WKT for the admin first -- unless there's no data, then just
|
||||
# pass None to LargeTextField's render.
|
||||
# Returns the WKT value for the geometry field. When no such data
|
||||
# is present, return None to LargeTextField's render.
|
||||
if not data:
|
||||
return super(WKTField, self).render(None)
|
||||
else:
|
||||
return super(WKTField, self).render(hex_to_wkt(data))
|
||||
return super(WKTField, self).render(data.wkt)
|
||||
|
||||
|
||||
|
@ -1,8 +1,5 @@
|
||||
from copy import copy
|
||||
from unittest import TestSuite, TextTestRunner
|
||||
from django.contrib.gis.db.backend import create_spatial_db
|
||||
from django.db import connection
|
||||
from django.test.utils import destroy_test_db
|
||||
|
||||
# Tests that do not require setting up and tearing down a spatial database.
|
||||
test_suite_names = ['test_gdal_driver',
|
||||
@ -54,6 +51,9 @@ def run_tests(module_list, verbosity=1):
|
||||
The tests may be run by invoking `./manage.py test`.
|
||||
"""
|
||||
from django.conf import settings
|
||||
from django.contrib.gis.db.backend import create_spatial_db
|
||||
from django.db import connection
|
||||
from django.test.utils import destroy_test_db
|
||||
|
||||
# Getting initial values.
|
||||
old_debug = settings.DEBUG
|
||||
|
@ -1,3 +1,3 @@
|
||||
from LayerMapping import LayerMapping
|
||||
from inspect_data import sample
|
||||
from spatial_db import create_spatial_db
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user