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

Annotation of /branches/WIP-pyshapelib-bramz/Thuban/Model/wellknowntext.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1605 - (hide annotations)
Tue Aug 19 11:00:40 2003 UTC (21 years, 6 months ago) by bh
Original Path: trunk/thuban/Thuban/Model/wellknowntext.py
File MIME type: text/x-python
File size: 4504 byte(s)
Add very basic postgis database support and the corresponding test
cases. The test cases require a PostgreSQL + postgis installation
but no existing database. The database will be created
automatically by the test cases

* test/README: Add note about skipped tests and the requirements
of the postgis tests.

* Thuban/Model/postgisdb.py: New. Basic postgis database support.

* test/test_postgis_db.py: New. Test cases for the postgis
support.

* Thuban/Model/wellknowntext.py: New. Parser for well-known-text
format

* test/test_wellknowntext.py: New. Test cases for the
wellknowntext parser

* test/postgissupport.py: New. Support module for tests involving
a postgis database.

* test/support.py (execute_as_testsuite): Shut down the postmaster
if it's still running after the tests

* Thuban/Model/data.py (RAW_WKT): New constant for raw data in
well known text format

1 bh 1605 # Copyright (C) 2002, 2003 Intevation GmbH <[email protected]>
2     # Author: Bernhard Herzog <[email protected]>
3     #
4     # This program is free software under the GPL (>=v2)
5     # Read the file GPL coming with the software for details.
6    
7     """Convert Well-Known Text format to python objects
8    
9     Main entry point is the convert_well_known_text function which takes a
10     geometry in Well-Known Text format and returns a python object with the
11     geometry.
12     """
13    
14     __version__ = "$Revision$"
15     # $Source$
16     # $Id$
17    
18     import re
19    
20    
21     _open_parens = r"[ \t]*(\([ \t]*)*"
22     _close_parens = r"[ \t]*(\)[ \t]*)+"
23     rx_point_list = re.compile(_open_parens + r"(?P<coords>[^\)]+)"
24     + _close_parens + ",?")
25    
26    
27     def parse_coordinate_lists(wkt):
28     """Return the coordinates in wkt as a list of lists of coordinate pairs.
29    
30     The wkt parameter is the coordinate part of a geometry in well-known
31     text format.
32     """
33     geometry = []
34     while wkt:
35     match = rx_point_list.match(wkt)
36     if match:
37     poly = []
38     wktcoords = match.group("coords")
39     for pair in wktcoords.split(","):
40     # a pair may be a triple actually. For now we just
41     # ignore any third value
42     x, y = map(float, pair.split())[:2]
43     poly.append((x, y))
44     geometry.append(poly)
45     wkt = wkt[match.end(0):].strip()
46     else:
47     raise ValueError("Invalid well-known-text (WKT) syntax")
48     return geometry
49    
50    
51     def parse_multipolygon(wkt):
52     """
53     Return the MULTIPOLYGON geometry wkt as a list of lists of float pairs
54     """
55     return parse_coordinate_lists(wkt)
56    
57     def parse_polygon(wkt):
58     """Return the POLYGON geometry in wkt as a list of float pairs"""
59     return parse_coordinate_lists(wkt)
60    
61     def parse_multilinestring(wkt):
62     """
63     Return the MULTILINESTRING geometry wkt as a list of lists of float pairs
64     """
65     return parse_coordinate_lists(wkt)
66    
67     def parse_linestring(wkt):
68     """Return the LINESTRING geometry in wkt as a list of float pairs"""
69     return parse_coordinate_lists(wkt)[0]
70    
71     def parse_point(wkt):
72     """Return the POINT geometry in wkt format as pair of floats"""
73     return parse_coordinate_lists(wkt)[0][0]
74    
75    
76     # map geometry types to parser functions
77     _function_map = [
78     ("MULTIPOLYGON", parse_multipolygon),
79     ("POLYGON", parse_polygon),
80     ("MULTILINESTRING", parse_multilinestring),
81     ("LINESTRING", parse_linestring),
82     ("POINT", parse_point),
83     ]
84    
85     def convert_well_known_text(wkt):
86     """Return the geometry given in well-known text format as python objects
87    
88     The function accepts only 2D data and supports the POINT, POLYGON,
89     MULTIPOLYGON, LINESTRING and MULTILINESTRING geometries.
90    
91     The structure of the return value depends on the geometry type. For
92     MULTIPOLYGON and MULTILINESTRING return a list of lists of
93     coordinate pairs. For POLYGON and LINESTRING return a list of
94     coordinate pairs. For POINT return a coordinate pair. All
95     coordinates are floats.
96    
97     The string wkt may contain an SRID specification in addition to the
98     actual geometry. This SRID is ignored.
99     """
100     parts = wkt.split(";")
101     for part in parts:
102     part = part.strip()
103     if part.startswith("SRID"):
104     # ignore SRIDs
105     continue
106     else:
107     for geotype, function in _function_map:
108     if part.startswith(geotype):
109     return function(part[len(geotype):])
110     else:
111     raise ValueError("Unsupported WKT-part %s" % repr(part[:20]))
112     else:
113     # there were no recognized geometries in the WKT string
114     raise ValueError("No recognized geometry in WKT string")
115    
116     def parse_wkt_thuban(wkt):
117     """Like convert_well_known_text, but return lists of lists of pairs"""
118     parts = wkt.split(";")
119     for part in parts:
120     part = part.strip()
121     if part.startswith("SRID"):
122     # ignore SRIDs
123     continue
124     else:
125     # split on "(" to separate the geometry type from the
126     # coordinate values
127     components = part.split("(", 1)
128     if len(components) > 1:
129     return parse_coordinate_lists(components[1])
130     else:
131     raise ValueError("WKT part %r doesn't contain opening"
132     " parenthesis" % part)
133     else:
134     # there were no recognized geometries in the WKT string
135     raise ValueError("No recognized geometry in WKT string")

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26