[postgis-devel] Some thoughts on Topology
Charles F. I. Savage
cfis at interserv.com
Fri Oct 28 10:17:59 PDT 2005
Thanks for the feedback strk. Some more thoughts...
> To obtain better performances we should keep separate RELATION
> and TOPOGEOMETRY tables for each layer in a topology. I've been
> thinking about using a TopoGeometry table, also for referential
> integrity between feature tables and existing TopoGeometries.
>
There are some advantages to having a big relation table - if you want
to render a map there is one table where you go to extract out all the
information from one place as opposed to having to query a bunch of
tables to get what you need.
A middle ground is to have topogeom_point, topgeom_line and
topogeom_area tables. A topogeom_point table would include the
topogeom_id's for all topogeometries that were points (so each one
points to a node), topogeom_line would hold all topogeometries that were
lines (i.e., made up of edges), etc. You would also need 3 relation
tables. For instance, one would be a topogeom_line_relation table since
a topogeom_line can constist of many edges, an edge can be part of many
topogeom_lines.
So something like:
CREATE TABLE topogeom_line
(
topogeo_id int4 DEFAULT nextval("topogeometry_id_seq") NOT NULL,
layer_id int4,
CONSTRAINT topogeometry_key UNIQUE (topogeo_id)
)
CREATE TABLE topogeom_line_relation
(
topogeo_id int4 NOT NULL,
element_id int4 NOT NULL,
element_type int4 NOT NULL,
CONSTRAINT relation_layer_id_key PRIMARY (topogeo_id, element_id,
element_type)
CONSTRAINT fk_line_relation FOREIGN KEY (topogeom_id) REFERENCES
topogeom_line (topogeo_id);
)
An advantage, or disadvantage (depending on your way of thinking) of
this way of doing things is that you've segregated different types of
geometries so you don't need the element_type field anymore - its
implied by the table in which the topogeom is defined. An interesting
point you brought up the last email was dealing with collections of
things - say multiple topogeometries that are linear. I haven't thought
through how those would fit in (maybe separate top level top geom tables
for them, maybe not).
> About info duplication in TopoGeometry object the only redundancy
> is really only TopoGeometry type, as TopologyId, LayerId and
> TopoGeoId are needed to reference a specific TopoGeometry.
>
>
In the current implementation I agree those fields are needed to
reference a specific TopoGeomeetry. However, that doesn't mean their
isn't duplication of information - it just means the current
implementation is not as normalized as it could be thus forcing this
information to be duplicated. The addition of a TopGeometry table, as
discussed in my last post, would make all the information contained in
the TopoGeometry objects redundant, plus remove at least one column (the
layer_id column, which would move to TopoGeometery) from the relation table.
> The TopoGeometry type can be see like a cache.
> Take the GeometryType(TopoGeometry) function (not implemented yet).
> If you drop it from the TopoGeometry table you'll be forced to
> make assumptions about the type looking at components.
> Still (apart from performance) a geometry composed by two faces
> could be both a Polygon (the faces are contained one within the other)
> or a MultiPolygon (the face are disjoint), or a Collection (that currently
> just happen to contain those two faces).
>
Yes, interesting point...see above.
> If you read initial part of topology.sql.in you'll see SQL/MM functions
> and PostGIS specific functions. The SQL/MM specification says nothing
> about TopoGeometry types, just primitive node,edge and face.
>
Great - I've read through a fair bit of topology.sql.in and see the list
of SQL/MM functions at the top.
> So we are doing a mix of the two.
> SQL/MM interfaces are implemented:
> - topology model (a topology is a schema, containing well defined
> edge,face,node tables)
> - topology operations (see functions with ST_ prefix)
>
>
I'm not sure I understand the reasoning behind a topology is a schema.
Let's say I run a city GIS and am storing all the city spatial data in
PostGIS. Now let's say I need to model various networks, maybe a
road_network, an electrical_network and a water network. Each network
may of course be made up of different types of things. For example, a
road_network includes streets, highways, off-ramps, parking lots, etc.
I may also have non-network topologies, such as parcels.
Anyway, why am I forced to store all these different topologies in
different schemas, all of which have their own edge/node/face tables?
Not saying that is a bad idea, but I could certainly see wanting to have
all my data in one schema.
I think the problem is that two things that are separate are being mixed
up. The first is the concept of some sort of topology (road network,
electrical network, parcels, etc.). Second is how/where to store these
networks. These things should be separate. In my view:
You have a topology (I've also seen this called a manifold). A topology
is made up of geometries of different types of features (in this
implementation they are called layers). These geometries are made up of
topology primitives (nodes, edges, faces). Oracle also adds the idea
that topogeometry can be made up of other topogeometries.
I'm not sure where concept of schema comes in at all. To draw a
parallel (not a very good one, but), its as if PostGIS forced me to
create a LineString schema to hold all my LineStrings data, a Polygon
schema to hold polygon data, etc.
So I would do this differently. I would define "topology" as collection
of features/layers that interact. Then I would add separate
functionality that would "topologically" enable a schema. This
functionality would add/remove the edge/node/face/etc. tables as
needed. If I wished, I could topologically enable one schema, 2
schemas, 10 schemas, etc.
When I define a new topology (say a road network), I would define into
which topologically enabled schema I wanted it stored. I think an
implementation like this would be a lot more flexible.
Hope you find these ideas useful,
Charlie
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 2781 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.osgeo.org/pipermail/postgis-devel/attachments/20051028/2adffdcb/attachment.bin>
More information about the postgis-devel
mailing list