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

Contents of /branches/WIP-pyshapelib-bramz/Thuban/Model/resource.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1933 - (show annotations)
Tue Nov 11 16:37:53 2003 UTC (21 years, 3 months ago) by bh
Original Path: trunk/thuban/Thuban/Model/resource.py
File MIME type: text/x-python
File size: 6945 byte(s)
* Thuban/Model/resource.py (get_system_proj_file): Add a filename
parameter so that this function can be used for all proj files in
Resource/Projections
(DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
get_system_proj_file

* Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
ProjFile self.__sysProjFile use a dictionary of system ProjFile
objects self._sys_proj_files
(ProjFrame.build_dialog): Adapt to the new changes in the
ProjectionList constructor. Add a check button to toggle whether
EPSG projections are shown
(ProjFrame._OnShowEPSG): New. Handler for the epsg check button
events.
(ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
the busy cursor if the files have not yet been loaded by the
dialog.
(ProjFrame.load_system_proj): Add a parameter for the name of the
proj file. Maintain the dictionary of system projections
self._sys_proj_files

* Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
user_projs parameters into one parameter proj_files which is a
list of proj files.
(ProjectionList._subscribe_proj_files)
(ProjectionList._unsubscribe_proj_files): New. Move
subscription/unsubscription of projfile messages to separate
methods
(ProjectionList.Destroy): The unsubscribe is now done in
_unsubscribe_proj_files
(ProjectionList.update_projections): We now have a list of proj
file objects
(ProjectionList.SetProjFiles): New method to set a new list of
proj file objects

* test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
Specify explicitly which system proj file to load.

1 # Copyright (c) 2003 by Intevation GmbH
2 # Authors:
3 # Jonathan Coles <[email protected]>
4 #
5 # This program is free software under the GPL (>=v2)
6 # Read the file COPYING coming with Thuban for details.
7
8 """Handle resources loaded from files such as projections"""
9
10 __version__ = "$Revision$"
11 # $Source$
12 # $Id$
13
14
15 import os
16 import os.path
17 import weakref
18
19 import Thuban
20 from Thuban import _
21
22 from Thuban.Lib.fileutil import get_application_dir
23
24 from Thuban.Model.xmlreader import XMLReader
25 from Thuban.Model.xmlwriter import XMLWriter
26 from Thuban.Model.proj import Projection, ProjFile
27 from xml.sax import SAXParseException
28
29 projdir = \
30 os.path.join(Thuban.__path__[0], os.pardir, "Resources", "Projections")
31
32
33 PROJ_EXT = ".proj"
34
35 has_gdal_support = lambda: False
36 try:
37 # first try to see if our extension module is there. if it
38 # wasn't even compiled, we obviously don't have gdal support.
39 import gdalwarp
40
41 # now try to import the python extension. if this doesn't
42 # exist then we can't do anything.
43 import gdal
44
45 """Return True if the gdal library is available."""
46 has_gdal_support = lambda: True
47 except ImportError:
48 pass
49
50 projfile_cache = weakref.WeakValueDictionary()
51
52 def clear_proj_file_cache():
53 """Clear the cache of ProjFile objects maintained by read_proj_file.
54
55 This function is probably only useful for the test suite.
56 """
57 projfile_cache.clear()
58
59 def read_proj_file(filename):
60 """Read a .proj file and return a ProjFile object and warnings
61
62 The return value is a tuple with the ProjFile object and a list of
63 strings with warnings messages that might have been generated by the
64 proj file parser.
65
66 The objects returned cached so that reading the same file
67 (identified by its absolute name) several times yields the same
68 ProjFile object. The cache uses weak references so the objects will
69 be removed from the cache once the last reference an object in the
70 cache is removed.
71
72 Raises IOError if the file cannot be opened, OSError if the file
73 cannot be read and SAXParseException if the file is not valid XML.
74 """
75 filename = os.path.abspath(filename)
76 if filename in projfile_cache:
77 return projfile_cache[filename], []
78 else:
79 handler = ProjFileReader()
80 handler.read(filename)
81 proj_file = handler.GetProjFile()
82 projfile_cache[filename] = proj_file
83 return proj_file, handler.GetWarnings()
84
85 def write_proj_file(pf):
86 """Write a single .proj file
87
88 Raises IOError if the file cannot be written.
89 """
90
91 saver = ProjFileSaver(pf)
92 saver.write(pf.GetFilename())
93
94
95 # Constants for the get_system_proj_file function
96 DEFAULT_PROJ_FILE = "defaults.proj"
97 EPSG_PROJ_FILE = "epsg.proj"
98
99 def get_system_proj_file(filename):
100 """Return the projections from the indicated file and a list with warnings
101
102 The filename argument should be the name of a file in the directory
103 with Thuban's default projection files (Resources/Projections/). If
104 possible callers should not use hardwired string literal for the
105 name to avoid unnecessary duplication. Instead they should use one
106 of the predefined constants, currently DEFAULT_PROJ_FILE or
107 EPSG_PROJ_FILE.
108
109 The return value is a tuple with the projections in a ProjFile
110 object and a list of strings with warning messages. The warnings
111 list is usually empty but may contain messages about ignored errors.
112
113 If the file could could not be opened return an empty projection
114 file object set to store data in the indicated default file.
115 """
116 fullname = os.path.join(projdir, filename)
117 try:
118 return read_proj_file(fullname)
119 except (OSError, IOError, SAXParseException), val:
120 msg = _('Could not read "%s": %s') % (fullname, str(val))
121 return ProjFile(fullname), [msg]
122
123 def get_user_proj_file():
124 """Return the user's projections and a list with warnings
125
126 The projections read from the user's thuban projection file (usually
127 in ~/.thuban/user.proj). The return value is a tuple with the
128 projections in a ProjFile object and a list of strings with warning
129 messages. The warnings list is usually empty but may contain
130 messages about ignored errors.
131
132 If the file could could not be opened return an empty projection
133 file object set to store data in the default file.
134 """
135 usrdir = get_application_dir()
136 filename = os.path.join(usrdir, "user.proj")
137 try:
138 return read_proj_file(filename)
139 except (OSError, IOError, SAXParseException), val:
140 msg = _('Could not read "%s": %s') % (filename, str(val))
141 return ProjFile(filename), [msg]
142
143
144 class ProjFileReader(XMLReader):
145
146 def __init__(self):
147 XMLReader.__init__(self)
148 self.projfile = ProjFile("")
149 self.warnings = []
150
151 XMLReader.AddDispatchers(self,
152 {'projection': ("start_projection", "end_projection"),
153 'parameter': ("start_parameter", None)})
154
155 def read(self, file_or_filename):
156 XMLReader.read(self, file_or_filename)
157
158 self.projfile.SetFilename(XMLReader.GetFilename(self))
159
160 def start_projection(self, name, qname, attrs):
161 self.params = []
162 name = self.encode(attrs.get((None, 'name')))
163 if name is None:
164 name = _("Unknown")
165 self.name = name
166 self.epsg = self.encode(attrs.get((None, 'epsg')))
167
168 def end_projection(self, name, qname):
169 try:
170 proj = Projection(self.params, self.name, epsg = self.epsg)
171 except IOError, val:
172 self.warnings.append(_('Error in projection "%s": %s')
173 % (self.name, str(val)))
174 else:
175 self.projfile.Add(proj)
176
177 def start_parameter(self, name, qname, attrs):
178 s = attrs.get((None, 'value'))
179 s = str(s) # we can't handle unicode in proj
180 self.params.append(s)
181
182 def GetProjFile(self):
183 return self.projfile
184
185 def GetWarnings(self):
186 """Return the list of warning messages that may have been produced"""
187 return self.warnings
188
189
190 class ProjFileSaver(XMLWriter):
191
192 def __init__(self, pf):
193 XMLWriter.__init__(self)
194 self.__pf = pf
195
196 def write(self, file_or_filename):
197 XMLWriter.write(self, file_or_filename)
198
199 self.write_header("projectionlist", "projfile.dtd")
200 self.write_projfile(self.__pf)
201 self.close()
202
203 def write_projfile(self, pf):
204
205 self.open_element("projectionlist")
206
207 for p in pf.GetProjections():
208 attrs = {"name": p.GetName()}
209 if p.EPSGCode():
210 attrs["epsg"] = p.EPSGCode()
211 self.open_element("projection", attrs)
212
213 for param in p.GetAllParameters():
214 self.write_element("parameter", {"value": param})
215
216 self.close_element("projection")
217
218 self.close_element("projectionlist")
219
220

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26