/[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 1982 by bh, Thu Nov 27 15:25:34 2003 UTC revision 2708 by bernhard, Sun Sep 24 20:01:23 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            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 assuregoodlocale(self):
92            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):      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 bbox, but for now it works well enough          # projected bbox, but for now it works well enough

Legend:
Removed from v.1982  
changed lines
  Added in v.2708

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26