/[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 2697 by bh, Thu Nov 27 15:25:34 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 assuregoodlocale(self):
84            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):      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 bbox, but for now it works well enough          # projected bbox, but for now it works well enough

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26