/[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 1816 - (show annotations)
Mon Oct 13 15:53:56 2003 UTC (21 years, 4 months ago) by bh
Original Path: trunk/thuban/Thuban/Model/resource.py
File MIME type: text/x-python
File size: 5776 byte(s)
(ProjFileReader.start_projection)
(ProjFileReader.end_projection, ProjFileSaver.write_projfile):
Handle the epsg code attribute when reading or writing proj files

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
18 import Thuban
19 from Thuban import _
20
21 from Thuban.Lib.fileutil import get_application_dir
22
23 from Thuban.Model.xmlreader import XMLReader
24 from Thuban.Model.xmlwriter import XMLWriter
25 from Thuban.Model.proj import Projection, ProjFile
26 from xml.sax import SAXParseException
27
28 projdir = \
29 os.path.join(Thuban.__path__[0], os.pardir, "Resources", "Projections")
30
31
32 PROJ_EXT = ".proj"
33
34 has_gdal_support = lambda: False
35 try:
36 # first try to see if our extension module is there. if it
37 # wasn't even compiled, we obviously don't have gdal support.
38 import gdalwarp
39
40 # now try to import the python extension. if this doesn't
41 # exist then we can't do anything.
42 import gdal
43
44 """Return True if the gdal library is available."""
45 has_gdal_support = lambda: True
46 except ImportError:
47 pass
48
49 def read_proj_file(filename):
50 """Read a .proj file and return a ProjFile object and warnings
51
52 The return value is a tuple with the ProjFile object and a list of
53 strings with warnings messages that might have been generated by the
54 proj ifle parser.
55
56 Raises IOError if the file cannot be opened, OSError if the file
57 cannot be read and SAXParseException if the file is not valid XML.
58 """
59 handler = ProjFileReader()
60 handler.read(filename)
61 return handler.GetProjFile(), handler.GetWarnings()
62
63 def write_proj_file(pf):
64 """Write a single .proj file
65
66 Raises IOError if the file cannot be written.
67 """
68
69 saver = ProjFileSaver(pf)
70 saver.write(pf.GetFilename())
71
72
73 def get_system_proj_file():
74 """Return the standard projections and a list with warnings
75
76 The projections read from the default thuban projection file
77 (usually in Resources/Projections/defaults.proj). The return value
78 is a tuple with the projections in a ProjFile object and a list of
79 strings with warning messages. The warnings list is usually empty
80 but may contain messages about ignored errors.
81
82 If the file could could not be opened return an empty projection
83 file object set to store data in the default file.
84 """
85 filename = os.path.join(projdir, "defaults.proj")
86 try:
87 return read_proj_file(filename)
88 except (OSError, IOError, SAXParseException), val:
89 msg = _('Could not read "%s": %s') % (filename, str(val))
90 return ProjFile(filename), [msg]
91
92 def get_user_proj_file():
93 """Return the user's projections and a list with warnings
94
95 The projections read from the user's thuban projection file (usually
96 in ~/.thuban/user.proj). The return value is a tuple with the
97 projections in a ProjFile object and a list of strings with warning
98 messages. The warnings list is usually empty but may contain
99 messages about ignored errors.
100
101 If the file could could not be opened return an empty projection
102 file object set to store data in the default file.
103 """
104 usrdir = get_application_dir()
105 filename = os.path.join(usrdir, "user.proj")
106 try:
107 return read_proj_file(filename)
108 except (OSError, IOError, SAXParseException), val:
109 msg = _('Could not read "%s": %s') % (filename, str(val))
110 return ProjFile(filename), [msg]
111
112
113 class ProjFileReader(XMLReader):
114
115 def __init__(self):
116 XMLReader.__init__(self)
117 self.projfile = ProjFile("")
118 self.warnings = []
119
120 XMLReader.AddDispatchers(self,
121 {'projection': ("start_projection", "end_projection"),
122 'parameter': ("start_parameter", None)})
123
124 def read(self, file_or_filename):
125 XMLReader.read(self, file_or_filename)
126
127 self.projfile.SetFilename(XMLReader.GetFilename(self))
128
129 def start_projection(self, name, qname, attrs):
130 self.params = []
131 name = self.encode(attrs.get((None, 'name')))
132 if name is None:
133 name = _("Unknown")
134 self.name = name
135 self.epsg = self.encode(attrs.get((None, 'epsg')))
136
137 def end_projection(self, name, qname):
138 try:
139 proj = Projection(self.params, self.name, epsg = self.epsg)
140 except IOError, val:
141 self.warnings.append(_('Error in projection "%s": %s')
142 % (self.name, str(val)))
143 else:
144 self.projfile.Add(proj)
145
146 def start_parameter(self, name, qname, attrs):
147 s = attrs.get((None, 'value'))
148 s = str(s) # we can't handle unicode in proj
149 self.params.append(s)
150
151 def GetProjFile(self):
152 return self.projfile
153
154 def GetWarnings(self):
155 """Return the list of warning messages that may have been produced"""
156 return self.warnings
157
158
159 class ProjFileSaver(XMLWriter):
160
161 def __init__(self, pf):
162 XMLWriter.__init__(self)
163 self.__pf = pf
164
165 def write(self, file_or_filename):
166 XMLWriter.write(self, file_or_filename)
167
168 self.write_header("projectionlist", "projfile.dtd")
169 self.write_projfile(self.__pf)
170 self.close()
171
172 def write_projfile(self, pf):
173
174 self.open_element("projectionlist")
175
176 for p in pf.GetProjections():
177 attrs = {"name": p.GetName()}
178 if p.EPSGCode():
179 attrs["epsg"] = p.EPSGCode()
180 self.open_element("projection", attrs)
181
182 for param in p.GetAllParameters():
183 self.write_element("parameter", {"value": param})
184
185 self.close_element("projection")
186
187 self.close_element("projectionlist")
188
189

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26