/[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

trunk/thuban/Thuban/Model/proj.py revision 1860 by jan, Fri Oct 24 16:01:39 2003 UTC branches/WIP-pyshapelib-bramz/Thuban/Model/proj.py revision 2734 by bramz, Thu Mar 1 12:42:59 2007 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            try:
39                locale.setlocale(locale.LC_NUMERIC, savedlocale)
40            except:
41                # python under some circumstances (observed 2.3.5-2 Debian Sarge)
42                # does not accept savedlocale directly
43                # deviating from the documentation
44                locale.setlocale(locale.LC_NUMERIC, savedlocale[0])
45            if result1 != result2:
46                return True
47        return False
48    
49  class Projection(BaseProjection):  class Projection(BaseProjection):
50        """A proj4 projection object that remembers the parameters.
51    
52      """A proj4 projection object that remembers the parameters"""      The proj library is not robust against decimal_point != '.' locales.
53        Since python 2.4 calls C extensions with the set locale, it can create
54        a problem.  It seems that calling
55            self.assuregoodlocale()
56            self.assureinitlocale()
57        before BaseProjection.__init__() is enough to work around this.
58    
59        We assuming that the locale stays the same after a projection
60        has been initialised
61        and thus we can return to it in self.assureinitlocale().
62        """
63    
64      def __init__(self, params, name = None, epsg = None):      def __init__(self, params, name = None, epsg = None):
65          """Initialize the Projection          """Initialize the Projection
# Line 32  class Projection(BaseProjection): Line 68  class Projection(BaseProjection):
68    
69          params -- a list of 'parameter=value' strings          params -- a list of 'parameter=value' strings
70    
71          name -- (optional) The name of the projectin. If None or omitted          name -- (optional) The name of the projection. If None or omitted
72                  it defaults to 'Unknown' in the local language.                  it defaults to 'Unknown' in the local language.
73    
74          epsg -- (optional) The EPSG code as a string.          epsg -- (optional) The EPSG code as a string.
75          """          """
76            self.initlocale = locale.getlocale(locale.LC_NUMERIC)
77            self.work_around_broken_proj = _do_we_have_to_work_around_broken_proj()
78    
79            self.assuregoodlocale()
80          BaseProjection.__init__(self, params)          BaseProjection.__init__(self, params)
81            self.assureinitlocale()
82    
83          if name is None:          if name is None:
84              self.name = _("Unknown")              self.name = _("Unknown")
# Line 47  class Projection(BaseProjection): Line 88  class Projection(BaseProjection):
88          self.epsg = epsg          self.epsg = epsg
89          self.params = params          self.params = params
90    
91      def ForwardBBox(self, bbox):      def assuregoodlocale(self):
92          """Return the bounding box of the corners of the bounding box bbox          if self.work_around_broken_proj:
93          """              locale.setlocale(locale.LC_NUMERIC, "C")
94    
95        def assureinitlocale(self):
96            if self.work_around_broken_proj:
97                locale.setlocale(locale.LC_NUMERIC, self.initlocale)
98    
99        def _transform_bbox(self, trafo, bbox):
100          # 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
101          # projected shape, but for now it works well enough          # projected bbox, but for now it works well enough
102          llx, lly, urx, ury = bbox          llx, lly, urx, ury = bbox
103          xs = []; ys = []          xs = []; ys = []
104          x, y = self.Forward(llx, lly)          for x, y in ((llx, lly), (llx, ury), (urx, lly), (urx, ury)):
105          xs.append(x); ys.append(y)              x, y = trafo(x, y)
106          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)  
           
107          return min(xs), min(ys), max(xs), max(ys)          return min(xs), min(ys), max(xs), max(ys)
108    
109        def ForwardBBox(self, bbox):
110            """Return the bounding box of the corners of the bounding box bbox
111            """
112            return self._transform_bbox(self.Forward, bbox)
113    
114        def InverseBBox(self, bbox):
115            return self._transform_bbox(self.Inverse, bbox)
116    
117      def GetName(self):      def GetName(self):
118          """Return the name of the projection."""          """Return the name of the projection."""
119          return self.name          return self.name

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26