]> granicus.if.org Git - postgis/commitdiff
Add a "gmlversion" parameter to topology.AsGML(TopoGeometry). Test and document....
authorSandro Santilli <strk@keybit.net>
Fri, 28 Jan 2011 17:05:25 +0000 (17:05 +0000)
committerSandro Santilli <strk@keybit.net>
Fri, 28 Jan 2011 17:05:25 +0000 (17:05 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@6759 b70326c6-7e19-0410-871a-916f4a2858ee

doc/extras_topology.xml
topology/sql/gml.sql
topology/test/regress/gml.sql
topology/test/regress/gml_expected

index aa247ec27e1308372839c2616a28e01737c7b60a..714d3c548be79214c68500d9a001a543ea77c46f 100644 (file)
@@ -1443,6 +1443,16 @@ SELECT topology.ST_RemoveIsoNode('ma_topo',  7 ) As result;
                         <paramdef><type>regclass </type> <parameter>visitedTable</parameter></paramdef>
                         <paramdef><type>text </type> <parameter>idprefix</parameter></paramdef>
                                        </funcprototype>
+                                       <funcprototype>
+                        <funcdef>text <function>AsGML</function></funcdef>
+                        <paramdef><type>topogeometry </type> <parameter>tg</parameter></paramdef>
+                        <paramdef><type>text </type> <parameter>nsprefix_in</parameter></paramdef>
+                        <paramdef><type>integer </type> <parameter>precision</parameter></paramdef>
+                        <paramdef><type>integer </type> <parameter>options</parameter></paramdef>
+                        <paramdef><type>regclass </type> <parameter>visitedTable</parameter></paramdef>
+                        <paramdef><type>text </type> <parameter>idprefix</parameter></paramdef>
+                        <paramdef><type>int </type> <parameter>gmlversion</parameter></paramdef>
+                                       </funcprototype>
                                </funcsynopsis>
                        </refsynopsisdiv>
                
@@ -1455,6 +1465,8 @@ SELECT topology.ST_RemoveIsoNode('ma_topo',  7 ) As result;
               
                <para>The <varname>idprefix</varname> parameter, if given, will be prepended to Edge and Node tag identifiers.</para>
                        
+               <para>The <varname>gmlver</varname> parameter, if given, will be passed to the underlying ST_AsGML. Defaults to 3.</para>
+
                 <!-- use this format if new function -->
                 <para>Availability: 2.0.0 </para>
                        </refsection>
index 3e97982ffac30cdefabf0416f6010dc8c478e679..753540ce33e997d4b76b9b69ec4ee0452f03b3b1 100644 (file)
 --{
 --
 -- INTERNAL FUNCTION
--- text _AsGMLNode(id, point, nsprefix, precision, options, idprefix)
+-- text _AsGMLNode(id, point, nsprefix, precision, options, idprefix, gmlver)
 --
 -- }{
 CREATE OR REPLACE FUNCTION topology._AsGMLNode(int, geometry, text, int, int,
-  text)
+  text, int)
   RETURNS text
 AS
 $$
@@ -42,6 +42,7 @@ DECLARE
   precision ALIAS FOR $4;
   options ALIAS FOR $5;
   idprefix ALIAS FOR $6;
+  gmlver ALIAS FOR $7;
   gml text;
 BEGIN
 
@@ -59,7 +60,7 @@ BEGIN
   IF point IS NOT NULL THEN
     gml = gml || '>'
               || '<' || nsprefix || 'pointProperty>'
-              || ST_AsGML(3, point, precision, options, nsprefix_in)
+              || ST_AsGML(gmlver, point, precision, options, nsprefix_in)
               || '</' || nsprefix || 'pointProperty>'
               || '</' || nsprefix || 'Node>';
   ELSE
@@ -69,16 +70,16 @@ BEGIN
 END
 $$
 LANGUAGE 'plpgsql';
---} _AsGMLNode(id, point, nsprefix, precision, options, idprefix)
+--} _AsGMLNode(id, point, nsprefix, precision, options, idprefix, gmlVersion)
 
 --{
 --
 -- INTERNAL FUNCTION
 -- text _AsGMLEdge(edge_id, start_node, end_node, line, visitedTable,
---                 nsprefix, precision, options, idprefix)
+--                 nsprefix, precision, options, idprefix, gmlVersion)
 --
 -- }{
-CREATE OR REPLACE FUNCTION topology._AsGMLEdge(int, int, int, geometry, regclass, text, int, int, text)
+CREATE OR REPLACE FUNCTION topology._AsGMLEdge(int, int, int, geometry, regclass, text, int, int, text, int)
   RETURNS text
 AS
 $$
@@ -94,6 +95,7 @@ DECLARE
   precision ALIAS FOR $7;
   options ALIAS FOR $8;
   idprefix ALIAS FOR $9;
+  gmlver ALIAS FOR $10;
   gml text;
 BEGIN
 
@@ -130,7 +132,7 @@ BEGIN
   IF visited IS NULL THEN
     gml = gml || '>';
     gml = gml || topology._AsGMLNode(start_node, NULL, nsprefix_in,
-                                     precision, options, idprefix);
+                                     precision, options, idprefix, gmlver);
     gml = gml || '</' || nsprefix || 'directedNode>';
   END IF;
 
@@ -155,13 +157,13 @@ BEGIN
   IF visited IS NULL THEN
     gml = gml || '>';
     gml = gml || topology._AsGMLNode(end_node, NULL, nsprefix_in,
-                                     precision, options, idprefix);
+                                     precision, options, idprefix, gmlver);
     gml = gml || '</' || nsprefix || 'directedNode>';
   END IF;
 
   IF line IS NOT NULL THEN
     gml = gml || '<' || nsprefix || 'curveProperty>'
-              || ST_AsGML(3, line, precision, options, nsprefix_in)
+              || ST_AsGML(gmlver, line, precision, options, nsprefix_in)
               || '</' || nsprefix || 'curveProperty>';
   END IF;
 
@@ -171,17 +173,17 @@ BEGIN
 END
 $$
 LANGUAGE 'plpgsql';
---} _AsGMLEdge(id, start_node, end_node, line, visitedTable, nsprefix, precision, options, idprefix)
+--} _AsGMLEdge(id, start_node, end_node, line, visitedTable, nsprefix, precision, options, idprefix, gmlver)
 
 --{
 --
 -- API FUNCTION
 --
--- text AsGML(TopoGeometry, nsprefix, precision, options, visitedTable, idprefix)
+-- text AsGML(TopoGeometry, nsprefix, precision, options, visitedTable, idprefix, gmlver)
 --
 -- }{
 CREATE OR REPLACE FUNCTION topology.AsGML(topology.TopoGeometry,
-    text, int, int, regclass, text)
+    text, int, int, regclass, text, int)
   RETURNS text
 AS
 $$
@@ -196,6 +198,7 @@ DECLARE
   visitedTable ALIAS FOR $5;
   visited bool;
   idprefix ALIAS FOR $6;
+  gmlver ALIAS FOR $7;
   toponame text;
   gml text;
   sql text;
@@ -256,7 +259,7 @@ BEGIN
         END IF;
       END IF;
       gml = gml || '>';
-      gml = gml || topology._AsGMLNode(rec.element_id, rec.geom, nsprefix_in, precision, options, idprefix);
+      gml = gml || topology._AsGMLNode(rec.element_id, rec.geom, nsprefix_in, precision, options, idprefix, gmlver);
       gml = gml || '</' || nsprefix || 'directedNode>';
     END LOOP;
     gml = gml || '</' || nsprefix || 'TopoPoint>';
@@ -317,7 +320,7 @@ BEGIN
                                         rec2.end_node, rec2.geom,
                                         visitedTable,
                                         nsprefix_in, precision,
-                                        options, idprefix);
+                                        options, idprefix, gmlver);
 
 
         gml = gml || '</' || nsprefix || 'directedEdge>';
@@ -395,12 +398,10 @@ BEGIN
 
         gml = gml || '>';
 
-        gml = gml || topology._AsGMLEdge(rec2.edge_id,
-                                        rec2.start_node,
+        gml = gml || topology._AsGMLEdge(rec2.edge_id, rec2.start_node,
                                         rec2.end_node, rec2.geom,
-                                        visitedTable,
-                                        nsprefix_in,
-                                        precision, options, idprefix);
+                                        visitedTable, nsprefix_in,
+                                        precision, options, idprefix, gmlver);
         gml = gml || '</' || nsprefix || 'directedEdge>';
 
       END LOOP;
@@ -422,6 +423,24 @@ BEGIN
 END
 $$
 LANGUAGE 'plpgsql';
+--} AsGML(TopoGeometry, nsprefix, precision, options, visitedTable, idprefix, gmlver)
+
+--{
+--
+-- API FUNCTION
+--
+-- text AsGML(TopoGeometry, nsprefix, precision, options, visitedTable,
+--            idprefix)
+--
+-- }{
+CREATE OR REPLACE FUNCTION topology.AsGML(topology.TopoGeometry,
+    text, int, int, regclass, text)
+  RETURNS text
+AS
+$$
+ SELECT topology.AsGML($1, $2, $3, $4, $5, $6, 3);
+$$
+LANGUAGE 'sql';
 --} AsGML(TopoGeometry, nsprefix, precision, options, visitedTable, idprefix)
 
 --{
index 76c2b04a69b6ac8aa0f2bc50dd922380c14acebc..cf78a2f88885f109be73c2bb4c1e7e721b6ac404 100644 (file)
@@ -165,6 +165,19 @@ SELECT feature_name||'-visited-idprefix', topology.AsGML(feature,
 
 --- } Visited table bookkeeping
 
+--- { GML2 output
+
+-- Output in GML2
+SELECT feature_name||'-gml2' as name, topology.AsGML(feature,'',0,2,NULL,'',2)
+ FROM features.city_streets 
+UNION
+SELECT feature_name||'-gml2', topology.AsGML(feature,'',0,2,NULL,'',2)
+ FROM features.traffic_signs
+ORDER BY name;
+
+--- } GML2 output
+
+
 SELECT topology.DropTopology('city_data');
 DROP SCHEMA features CASCADE;
 DELETE FROM spatial_ref_sys where srid = 4326;
index aeb7a8fbbf09036cff87a0303053569b582d2a95..7ec14c0fde79bbe3dc9f9939705d3ac4f56db180 100644 (file)
@@ -56,4 +56,12 @@ R1-visited|<TopoCurve><directedEdge><Edge id="E9"><directedNode orientation="-">
 P2-visited|<TopoSurface><directedFace><Face><directedEdge orientation="-"><Edge id="E18"><directedNode orientation="-"><Node id="N10"/></directedNode><directedNode xlink:href="#N13" /><curveProperty><Curve srsName="EPSG:4326"><segments><LineStringSegment><posList>35 6 35 14</posList></LineStringSegment></segments></Curve></curveProperty></Edge></directedEdge><directedEdge orientation="-"><Edge id="E13"><directedNode orientation="-" xlink:href="#N9" /><directedNode xlink:href="#N10" /><curveProperty><Curve srsName="EPSG:4326"><segments><LineStringSegment><posList>21 6 35 6</posList></LineStringSegment></segments></Curve></curveProperty></Edge></directedEdge><directedEdge xlink:href="#E20" /><directedEdge xlink:href="#E19" /><directedEdge><Edge id="E7"><directedNode orientation="-" xlink:href="#N17" /><directedNode><Node id="N18"/></directedNode><curveProperty><Curve srsName="EPSG:4326"><segments><LineStringSegment><posList>21 22 35 22</posList></LineStringSegment></segments></Curve></curveProperty></Edge></directedEdge><directedEdge orientation="-"><Edge id="E17"><directedNode orientation="-" xlink:href="#N13" /><directedNode xlink:href="#N18" /><curveProperty><Curve srsName="EPSG:4326"><segments><LineStringSegment><posList>35 14 35 22</posList></LineStringSegment></segments></Curve></curveProperty></Edge></directedEdge></Face></directedFace></TopoSurface>
 P1-visited|<TopoSurface><directedFace><Face><directedEdge orientation="-"><Edge id="E20"><directedNode orientation="-"><Node id="N9"/></directedNode><directedNode xlink:href="#N14" /><curveProperty><Curve srsName="EPSG:4326"><segments><LineStringSegment><posList>21 6 21 14</posList></LineStringSegment></segments></Curve></curveProperty></Edge></directedEdge><directedEdge orientation="-"><Edge id="E12"><directedNode orientation="-"><Node id="N8"/></directedNode><directedNode xlink:href="#N9" /><curveProperty><Curve srsName="EPSG:4326"><segments><LineStringSegment><posList>9 6 21 6</posList></LineStringSegment></segments></Curve></curveProperty></Edge></directedEdge><directedEdge><Edge id="E22"><directedNode orientation="-" xlink:href="#N8" /><directedNode xlink:href="#N15" /><curveProperty><Curve srsName="EPSG:4326"><segments><LineStringSegment><posList>9 6 9 14</posList></LineStringSegment></segments></Curve></curveProperty></Edge></directedEdge><directedEdge><Edge id="E21"><directedNode orientation="-" xlink:href="#N15" /><directedNode><Node id="N16"/></directedNode><curveProperty><Curve srsName="EPSG:4326"><segments><LineStringSegment><posList>9 14 9 22</posList></LineStringSegment></segments></Curve></curveProperty></Edge></directedEdge><directedEdge><Edge id="E6"><directedNode orientation="-" xlink:href="#N16" /><directedNode><Node id="N17"/></directedNode><curveProperty><Curve srsName="EPSG:4326"><segments><LineStringSegment><posList>9 22 21 22</posList></LineStringSegment></segments></Curve></curveProperty></Edge></directedEdge><directedEdge orientation="-"><Edge id="E19"><directedNode orientation="-" xlink:href="#N14" /><directedNode xlink:href="#N17" /><curveProperty><Curve srsName="EPSG:4326"><segments><LineStringSegment><posList>21 14 21 22</posList></LineStringSegment></segments></Curve></curveProperty></Edge></directedEdge></Face></directedFace></TopoSurface>
 P3-visited-idprefix|<TopoSurface><directedFace><Face><directedEdge orientation="-"><Edge id="cd-E16"><directedNode orientation="-"><Node id="cd-N11"/></directedNode><directedNode><Node id="cd-N12"/></directedNode><curveProperty><Curve srsName="EPSG:4326"><segments><LineStringSegment><posList>47 6 47 14</posList></LineStringSegment></segments></Curve></curveProperty></Edge></directedEdge><directedEdge orientation="-"><Edge id="cd-E14"><directedNode orientation="-" xlink:href="#cd-N10" /><directedNode xlink:href="#cd-N11" /><curveProperty><Curve srsName="EPSG:4326"><segments><LineStringSegment><posList>35 6 47 6</posList></LineStringSegment></segments></Curve></curveProperty></Edge></directedEdge><directedEdge xlink:href="#cd-E18" /><directedEdge xlink:href="#cd-E17" /><directedEdge><Edge id="cd-E8"><directedNode orientation="-" xlink:href="#cd-N18" /><directedNode><Node id="cd-N19"/></directedNode><curveProperty><Curve srsName="EPSG:4326"><segments><LineStringSegment><posList>35 22 47 22</posList></LineStringSegment></segments></Curve></curveProperty></Edge></directedEdge><directedEdge orientation="-"><Edge id="cd-E15"><directedNode orientation="-" xlink:href="#cd-N12" /><directedNode xlink:href="#cd-N19" /><curveProperty><Curve srsName="EPSG:4326"><segments><LineStringSegment><posList>47 14 47 22</posList></LineStringSegment></segments></Curve></curveProperty></Edge></directedEdge></Face></directedFace></TopoSurface>
+R1-gml2|<TopoCurve><directedEdge><Edge id="E9"><directedNode orientation="-"><Node id="N15"/></directedNode><directedNode><Node id="N14"/></directedNode><curveProperty><LineString srsName="EPSG:4326"><coordinates>9,14 21,14</coordinates></LineString></curveProperty></Edge></directedEdge><directedEdge orientation="-"><Edge id="E10"><directedNode orientation="-"><Node id="N13"/></directedNode><directedNode><Node id="N14"/></directedNode><curveProperty><LineString srsName="EPSG:4326"><coordinates>35,14 21,14</coordinates></LineString></curveProperty></Edge></directedEdge></TopoCurve>
+R2-gml2|<TopoCurve><directedEdge><Edge id="E4"><directedNode orientation="-"><Node id="N5"/></directedNode><directedNode><Node id="N6"/></directedNode><curveProperty><LineString srsName="EPSG:4326"><coordinates>36,38 38,35 41,34 42,33 45,32 47,28 50,28 52,32 57,33</coordinates></LineString></curveProperty></Edge></directedEdge><directedEdge orientation="-"><Edge id="E5"><directedNode orientation="-"><Node id="N7"/></directedNode><directedNode><Node id="N6"/></directedNode><curveProperty><LineString srsName="EPSG:4326"><coordinates>41,40 45,40 47,42 62,41 61,38 59,39 57,36 57,33</coordinates></LineString></curveProperty></Edge></directedEdge></TopoCurve>
+R3-gml2|<TopoCurve><directedEdge><Edge id="E25"><directedNode orientation="-"><Node id="N21"/></directedNode><directedNode><Node id="N22"/></directedNode><curveProperty><LineString srsName="EPSG:4326"><coordinates>9,35 13,35</coordinates></LineString></curveProperty></Edge></directedEdge></TopoCurve>
+R4-gml2|<TopoCurve><directedEdge><Edge id="E3"><directedNode orientation="-"><Node id="N2"/></directedNode><directedNode><Node id="N3"/></directedNode><curveProperty><LineString srsName="EPSG:4326"><coordinates>25,30 25,35</coordinates></LineString></curveProperty></Edge></directedEdge></TopoCurve>
+S1-gml2|<TopoPoint><directedNode><Node id="N14"><pointProperty><Point srsName="EPSG:4326"><coordinates>21,14</coordinates></Point></pointProperty></Node></directedNode></TopoPoint>
+S2-gml2|<TopoPoint><directedNode><Node id="N13"><pointProperty><Point srsName="EPSG:4326"><coordinates>35,14</coordinates></Point></pointProperty></Node></directedNode></TopoPoint>
+S3-gml2|<TopoPoint><directedNode><Node id="N6"><pointProperty><Point srsName="EPSG:4326"><coordinates>57,33</coordinates></Point></pointProperty></Node></directedNode></TopoPoint>
+S4-gml2|<TopoPoint><directedNode><Node id="N4"><pointProperty><Point srsName="EPSG:4326"><coordinates>20,37</coordinates></Point></pointProperty></Node></directedNode></TopoPoint>
 Topology 'city_data' dropped