/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/Model/proj.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Thuban/Model/proj.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1860 by jan, Fri Oct 24 16:01:39 2003 UTC revision 2698 by bernhard, Mon Sep 18 00:56:26 2006 UTC
# Line 1  Line 1 
1  # Copyright (c) 2001, 2003 by Intevation GmbH  # Copyright (c) 2001, 2003, 2006 by Intevation GmbH
2  # Authors:  # Authors:
3  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
4    # Bernhard Reiter <[email protected]>
5  #  #
6  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
7  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
   
8  __version__ = "$Revision$"  __version__ = "$Revision$"
9    
10  from types import StringTypes  from types import StringTypes
11    import locale
12    
13  from Thuban import _  from Thuban import _
14  from Thuban.Lib.connector import Publisher  from Thuban.Lib.connector import Publisher
# Line 21  from messages import PROJECTION_ADDED, P Line 22  from messages import PROJECTION_ADDED, P
22  PROJ_UNITS_METERS  = 1  PROJ_UNITS_METERS  = 1
23  PROJ_UNITS_DEGREES = 2  PROJ_UNITS_DEGREES = 2
24    
25    def _do_we_have_to_work_around_broken_proj():
26        """ If we have a problematic locale, check if proj results are good. """
27        if locale.localeconv()['decimal_point'] != '.':
28            params = ["proj=latlong", "to_meter=0.01745", "ellps=clrk66"]
29            proj = BaseProjection(params)
30            result1 = proj.Forward(1,1)
31    
32            savedlocale = locale.getlocale(locale.LC_NUMERIC)
33            locale.setlocale(locale.LC_NUMERIC, "C")
34    
35            proj = BaseProjection(params)
36            result2 = proj.Forward(1,1)
37    
38            locale.setlocale(locale.LC_NUMERIC, savedlocale)
39            if result1 != result2:
40                return True
41        return False
42    
43  class Projection(BaseProjection):  class Projection(BaseProjection):
44        """A proj4 projection object that remembers the parameters.
45    
46      """A proj4 projection object that remembers the parameters"""      Note: it seems that calling
47            self.assuregoodlocale()
48            self.assureinitlocale()
49        before BaseProjection.__init__() is enough to work around the bug.
50    
51        We assuming that the locale stays the same after a projection
52        has been initialised
53        and thus we can return to it in self.assureinitlocale().
54        """
55    
56      def __init__(self, params, name = None, epsg = None):      def __init__(self, params, name = None, epsg = None):
57          """Initialize the Projection          """Initialize the Projection
# Line 32  class Projection(BaseProjection): Line 60  class Projection(BaseProjection):
60    
61          params -- a list of 'parameter=value' strings          params -- a list of 'parameter=value' strings
62    
63          name -- (optional) The name of the projectin. If None or omitted          name -- (optional) The name of the projection. If None or omitted
64                  it defaults to 'Unknown' in the local language.                  it defaults to 'Unknown' in the local language.
65    
66          epsg -- (optional) The EPSG code as a string.          epsg -- (optional) The EPSG code as a string.
67          """          """
68            self.initlocale = locale.getlocale(locale.LC_NUMERIC)
69            self.work_around_broken_proj = _do_we_have_to_work_around_broken_proj()
70    
71            self.assuregoodlocale()
72          BaseProjection.__init__(self, params)          BaseProjection.__init__(self, params)
73            self.assureinitlocale()
74    
75          if name is None:          if name is None:
76              self.name = _("Unknown")              self.name = _("Unknown")
# Line 47  class Projection(BaseProjection): Line 80  class Projection(BaseProjection):
80          self.epsg = epsg          self.epsg = epsg
81          self.params = params          self.params = params
82    
83      def ForwardBBox(self, bbox):      def assuregoodlocale(self):
84          """Return the bounding box of the corners of the bounding box bbox          if self.work_around_broken_proj:
85          """              locale.setlocale(locale.LC_NUMERIC, "C")
86    
87        def assureinitlocale(self):
88            if self.work_around_broken_proj:
89                locale.setlocale(locale.LC_NUMERIC, self.initlocale)
90    
91        def _transform_bbox(self, trafo, bbox):
92          # This is not really the correct way to determine the bbox of a          # This is not really the correct way to determine the bbox of a
93          # projected shape, but for now it works well enough          # projected bbox, but for now it works well enough
94          llx, lly, urx, ury = bbox          llx, lly, urx, ury = bbox
95          xs = []; ys = []          xs = []; ys = []
96          x, y = self.Forward(llx, lly)          for x, y in ((llx, lly), (llx, ury), (urx, lly), (urx, ury)):
97          xs.append(x); ys.append(y)              x, y = trafo(x, y)
98          x, y = self.Forward(llx, ury)              xs.append(x); ys.append(y)
         xs.append(x); ys.append(y)  
         x, y = self.Forward(urx, ury)  
         xs.append(x); ys.append(y)  
         x, y = self.Forward(urx, lly)  
         xs.append(x); ys.append(y)  
           
99          return min(xs), min(ys), max(xs), max(ys)          return min(xs), min(ys), max(xs), max(ys)
100    
101        def ForwardBBox(self, bbox):
102            """Return the bounding box of the corners of the bounding box bbox
103            """
104            return self._transform_bbox(self.Forward, bbox)
105    
106        def InverseBBox(self, bbox):
107            return self._transform_bbox(self.Inverse, bbox)
108    
109      def GetName(self):      def GetName(self):
110          """Return the name of the projection."""          """Return the name of the projection."""
111          return self.name          return self.name

Legend:
Removed from v.1860  
changed lines
  Added in v.2698

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26