Django

Code

Changeset 6884

Show
Ignore:
Timestamp:
12/04/07 09:09:06 (7 months ago)
Author:
jbronn
Message:

gis: geos: Added support for EWKT (SRID only), and a transform routine that uses the GDAL facilities to transform the GEOS geometry.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/gis/django/contrib/gis/geos/base.py

    r6861 r6884  
    3030# library.  Not a substitute for good web security programming practices. 
    3131hex_regex = re.compile(r'^[0-9A-F]+$', re.I) 
    32 wkt_regex = re.compile(r'^(POINT|LINESTRING|LINEARRING|POLYGON|MULTIPOINT|MULTILINESTRING|MULTIPOLYGON|GEOMETRYCOLLECTION)[ACEGIMLONPSRUTY\d,\.\-\(\) ]+$', re.I) 
     32wkt_regex = re.compile(r'^(SRID=(?P<srid>\d+);)?(?P<wkt>(POINT|LINESTRING|LINEARRING|POLYGON|MULTIPOINT|MULTILINESTRING|MULTIPOLYGON|GEOMETRYCOLLECTION)[ACEGIMLONPSRUTY\d,\.\-\(\) ]+)$', re.I) 
    3333 
    3434class GEOSGeometry(object): 
     
    5858                # If the regex matches, the geometry is in HEX form. 
    5959                g = from_hex(geo_input, len(geo_input)) 
    60             elif wkt_regex.match(geo_input): 
    61                 # Otherwise, the geometry is in WKT form. 
    62                 g = from_wkt(geo_input) 
    6360            else: 
    64                 raise ValueError('String or unicode input unrecognized as WKT or HEXEWKB.') 
     61                m = wkt_regex.match(geo_input) 
     62                if m: 
     63                    if m.group('srid'): srid = int(m.group('srid')) 
     64                    g = from_wkt(m.group('wkt')) 
     65                else: 
     66                    raise ValueError('String or unicode input unrecognized as WKT EWKT, and HEXEWKB.') 
    6567        elif isinstance(geo_input, GEOM_PTR): 
    6668            # When the input is a pointer to a geomtry (GEOM_PTR). 
     
    305307    #### Output Routines #### 
    306308    @property 
     309    def ewkt(self): 
     310        "Returns the EWKT (WKT + SRID) of the Geometry." 
     311        if self.get_srid(): return 'SRID=%s;%s' % (self.srid, self.wkt) 
     312        else: return self.wkt 
     313 
     314    @property 
    307315    def wkt(self): 
    308316        "Returns the WKT (Well-Known Text) of the Geometry." 
     
    356364        "Alias for `srs` property." 
    357365        return self.srs 
     366 
     367    def transform(self, ct): 
     368        "Transforms this Geometry; only works with GDAL." 
     369        srid = self.srid 
     370        if HAS_GDAL and srid: 
     371            g = OGRGeometry(self.wkb, srid) 
     372            g.transform(ct) 
     373            wkb = str(g.wkb) 
     374            ptr = from_wkb(wkb, len(wkb)) 
     375            if ptr: 
     376                # Reassigning pointer, and resetting the SRID. 
     377                destroy_geom(self._ptr) 
     378                self._ptr = ptr 
     379                self.srid = g.srid 
     380        else: 
     381            pass 
    358382 
    359383    #### Topology Routines #### 
  • django/branches/gis/django/contrib/gis/tests/test_geos.py

    r6861 r6884  
    7979            geom_t = fromstr(g.wkt) 
    8080            self.assertEqual(geom_t.wkt, geom_h.wkt) 
     81 
     82    def test01h_ewkt(self): 
     83        "Testing EWKT." 
     84        srid = 32140 
     85        for p in polygons: 
     86            ewkt = 'SRID=%d;%s' % (srid, p.wkt) 
     87            poly = fromstr(ewkt) 
     88            self.assertEqual(srid, poly.srid) 
     89            self.assertEqual(srid, poly.shell.srid) 
     90            self.assertEqual(srid, fromstr(poly.ewkt).srid) # Checking export 
    8191     
    8292    def test02a_points(self):